summaryrefslogtreecommitdiff
path: root/src/sys
diff options
context:
space:
mode:
authorhoxnox <hoxnox@gmail.com>2015-05-21 11:58:56 +0300
committerhoxnox <hoxnox@gmail.com>2015-05-21 11:58:56 +0300
commit075c037f8b85fde33d29ff591958e23cac88139e (patch)
tree56faa09af8be4670cc3ed3d31446fe4fe41aac50 /src/sys
parentd645d911d5b9e5d600a57225dbdf5bd4adc91b98 (diff)
downloadnix-075c037f8b85fde33d29ff591958e23cac88139e.zip
Add socket::shutdown function
libc::funcs::bsd43::shutdown is used
Diffstat (limited to 'src/sys')
-rw-r--r--src/sys/socket/consts.rs10
-rw-r--r--src/sys/socket/mod.rs30
2 files changed, 40 insertions, 0 deletions
diff --git a/src/sys/socket/consts.rs b/src/sys/socket/consts.rs
index a2bb535b..91337189 100644
--- a/src/sys/socket/consts.rs
+++ b/src/sys/socket/consts.rs
@@ -88,6 +88,11 @@ mod os {
pub const MSG_OOB: SockMessageFlags = 0x1;
pub const MSG_PEEK: SockMessageFlags = 0x2;
pub const MSG_DONTWAIT: SockMessageFlags = 0x40;
+
+ // shutdown flags
+ pub const SHUT_RD: c_int = 0;
+ pub const SHUT_WR: c_int = 1;
+ pub const SHUT_RDWR: c_int = 2;
}
// Not all of these constants exist on freebsd
@@ -177,4 +182,9 @@ mod os {
pub const MSG_OOB: SockMessageFlags = 0x1;
pub const MSG_PEEK: SockMessageFlags = 0x2;
pub const MSG_DONTWAIT: SockMessageFlags = 0x80;
+
+ // shutdown flags
+ pub const SHUT_RD: c_int = 0;
+ pub const SHUT_WR: c_int = 1;
+ pub const SHUT_RDWR: c_int = 2;
}
diff --git a/src/sys/socket/mod.rs b/src/sys/socket/mod.rs
index e19dc1f8..202687a6 100644
--- a/src/sys/socket/mod.rs
+++ b/src/sys/socket/mod.rs
@@ -360,6 +360,36 @@ pub unsafe fn sockaddr_storage_to_addr(
}
}
+
+#[derive(Clone, Copy, PartialEq, Eq, Debug)]
+pub enum Shutdown {
+ /// Further receptions will be disallowed.
+ Read,
+ /// Further transmissions will be disallowed.
+ Write,
+ /// Further receptions and transmissions will be disallowed.
+ Both,
+}
+
+/// Shut down part of a full-duplex connection.
+///
+/// [Further reading](http://man7.org/linux/man-pages/man2/shutdown.2.html)
+pub fn shutdown(df: Fd, how: &Shutdown) -> Result<()> {
+ unsafe {
+ use libc::shutdown;
+ let how = match how {
+ &Shutdown::Read => consts::SHUT_RD,
+ &Shutdown::Write => consts::SHUT_WR,
+ &Shutdown::Both => consts::SHUT_RDWR,
+ };
+ let ret = shutdown(df, how);
+ if ret < 0 {
+ return Err(Error::last());
+ }
+ }
+ Ok(())
+}
+
#[test]
pub fn test_struct_sizes() {
use nixtest;