Skip to content

Commit

Permalink
Auto merge of #36824 - kali:master, r=alexcrichton
Browse files Browse the repository at this point in the history
SO_NOSIGPIPE and MSG_NOSIGNAL (rebased #36426)

I'm not sure what happened when I pushed a rebased branch on #36426 , github closed it...
  • Loading branch information
bors committed Oct 1, 2016
2 parents 8b00355 + 5980d5b commit 5045d4e
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 6 deletions.
2 changes: 1 addition & 1 deletion src/liblibc
11 changes: 8 additions & 3 deletions src/libstd/sys/common/net.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@ use sys::net::netc::IPV6_LEAVE_GROUP as IPV6_DROP_MEMBERSHIP;
target_os = "solaris", target_os = "haiku")))]
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
////////////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -225,7 +230,7 @@ impl TcpStream {
c::send(*self.inner.as_inner(),
buf.as_ptr() as *const c_void,
len,
0)
MSG_NOSIGNAL)
})?;
Ok(ret as usize)
}
Expand Down Expand Up @@ -449,7 +454,7 @@ impl UdpSocket {
let ret = cvt(unsafe {
c::sendto(*self.inner.as_inner(),
buf.as_ptr() as *const c_void, len,
0, dstp, dstlen)
MSG_NOSIGNAL, dstp, dstlen)
})?;
Ok(ret as usize)
}
Expand Down Expand Up @@ -573,7 +578,7 @@ impl UdpSocket {
c::send(*self.inner.as_inner(),
buf.as_ptr() as *const c_void,
len,
0)
MSG_NOSIGNAL)
})?;
Ok(ret as usize)
}
Expand Down
7 changes: 6 additions & 1 deletion src/libstd/sys/unix/ext/net.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ use sys::cvt;
use sys::net::Socket;
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 {
unsafe {
// Work with an actual instance of the type since using a null pointer is UB
Expand Down Expand Up @@ -690,7 +695,7 @@ impl UnixDatagram {
let count = cvt(libc::sendto(*d.0.as_inner(),
buf.as_ptr() as *const _,
buf.len(),
0,
MSG_NOSIGNAL,
&addr as *const _ as *const _,
len))?;
Ok(count as usize)
Expand Down
14 changes: 13 additions & 1 deletion src/libstd/sys/unix/net.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,14 @@ use libc::SOCK_CLOEXEC;
#[cfg(not(target_os = "linux"))]
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 fn init() {}
Expand Down Expand Up @@ -81,7 +89,11 @@ impl Socket {
let fd = cvt(libc::socket(fam, ty, 0))?;
let fd = FileDesc::new(fd);
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)
}
}

Expand Down

0 comments on commit 5045d4e

Please sign in to comment.