1
Fork 0

Auto merge of #36824 - kali:master, r=alexcrichton

SO_NOSIGPIPE and MSG_NOSIGNAL (rebased #36426)

I'm not sure what happened when I pushed a rebased branch on #36426 , github closed it...
This commit is contained in:
bors 2016-10-01 01:19:47 -07:00 committed by GitHub
commit 5045d4e396
4 changed files with 28 additions and 6 deletions

@ -1 +1 @@
Subproject commit eb708c020826a8d792a5a5275be147aabe47fe24 Subproject commit b474785561d58efbd27add9d22339dcabad742ad

View file

@ -42,6 +42,11 @@ use sys::net::netc::IPV6_LEAVE_GROUP as IPV6_DROP_MEMBERSHIP;
target_os = "solaris", target_os = "haiku")))] target_os = "solaris", target_os = "haiku")))]
use sys::net::netc::IPV6_DROP_MEMBERSHIP; use sys::net::netc::IPV6_DROP_MEMBERSHIP;
#[cfg(target_os = "linux")]
use libc::MSG_NOSIGNAL;
#[cfg(not(target_os = "linux"))]
const MSG_NOSIGNAL: c_int = 0x0; // unused dummy value
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// sockaddr and misc bindings // sockaddr and misc bindings
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -225,7 +230,7 @@ impl TcpStream {
c::send(*self.inner.as_inner(), c::send(*self.inner.as_inner(),
buf.as_ptr() as *const c_void, buf.as_ptr() as *const c_void,
len, len,
0) MSG_NOSIGNAL)
})?; })?;
Ok(ret as usize) Ok(ret as usize)
} }
@ -449,7 +454,7 @@ impl UdpSocket {
let ret = cvt(unsafe { let ret = cvt(unsafe {
c::sendto(*self.inner.as_inner(), c::sendto(*self.inner.as_inner(),
buf.as_ptr() as *const c_void, len, buf.as_ptr() as *const c_void, len,
0, dstp, dstlen) MSG_NOSIGNAL, dstp, dstlen)
})?; })?;
Ok(ret as usize) Ok(ret as usize)
} }
@ -573,7 +578,7 @@ impl UdpSocket {
c::send(*self.inner.as_inner(), c::send(*self.inner.as_inner(),
buf.as_ptr() as *const c_void, buf.as_ptr() as *const c_void,
len, len,
0) MSG_NOSIGNAL)
})?; })?;
Ok(ret as usize) Ok(ret as usize)
} }

View file

@ -28,6 +28,11 @@ use sys::cvt;
use sys::net::Socket; use sys::net::Socket;
use sys_common::{AsInner, FromInner, IntoInner}; use sys_common::{AsInner, FromInner, IntoInner};
#[cfg(target_os = "linux")]
use libc::MSG_NOSIGNAL;
#[cfg(not(target_os = "linux"))]
const MSG_NOSIGNAL: libc::c_int = 0x0; // unused dummy value
fn sun_path_offset() -> usize { fn sun_path_offset() -> usize {
unsafe { unsafe {
// Work with an actual instance of the type since using a null pointer is UB // Work with an actual instance of the type since using a null pointer is UB
@ -690,7 +695,7 @@ impl UnixDatagram {
let count = cvt(libc::sendto(*d.0.as_inner(), let count = cvt(libc::sendto(*d.0.as_inner(),
buf.as_ptr() as *const _, buf.as_ptr() as *const _,
buf.len(), buf.len(),
0, MSG_NOSIGNAL,
&addr as *const _ as *const _, &addr as *const _ as *const _,
len))?; len))?;
Ok(count as usize) Ok(count as usize)

View file

@ -33,6 +33,14 @@ use libc::SOCK_CLOEXEC;
#[cfg(not(target_os = "linux"))] #[cfg(not(target_os = "linux"))]
const SOCK_CLOEXEC: c_int = 0; const SOCK_CLOEXEC: c_int = 0;
// Another conditional contant for name resolution: Macos et iOS use
// SO_NOSIGPIPE as a setsockopt flag to disable SIGPIPE emission on socket.
// Other platforms do otherwise.
#[cfg(target_vendor = "apple")]
use libc::SO_NOSIGPIPE;
#[cfg(not(target_vendor = "apple"))]
const SO_NOSIGPIPE: c_int = 0;
pub struct Socket(FileDesc); pub struct Socket(FileDesc);
pub fn init() {} pub fn init() {}
@ -81,7 +89,11 @@ impl Socket {
let fd = cvt(libc::socket(fam, ty, 0))?; let fd = cvt(libc::socket(fam, ty, 0))?;
let fd = FileDesc::new(fd); let fd = FileDesc::new(fd);
fd.set_cloexec()?; fd.set_cloexec()?;
Ok(Socket(fd)) let socket = Socket(fd);
if cfg!(target_vendor = "apple") {
setsockopt(&socket, libc::SOL_SOCKET, SO_NOSIGPIPE, 1)?;
}
Ok(socket)
} }
} }