From 075c037f8b85fde33d29ff591958e23cac88139e Mon Sep 17 00:00:00 2001 From: hoxnox Date: Thu, 21 May 2015 11:58:56 +0300 Subject: Add socket::shutdown function libc::funcs::bsd43::shutdown is used --- src/sys/socket/consts.rs | 10 ++++++++++ src/sys/socket/mod.rs | 30 ++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) (limited to 'src/sys') 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; -- cgit v1.2.3