MSG_NOSIGNAL on linux

This commit is contained in:
Mathieu Poumeyrol 2016-09-27 10:16:49 -04:00 committed by Mathieu Poumeyrol
parent 6f6e261e20
commit ed5e542819
2 changed files with 18 additions and 4 deletions

View file

@ -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")]
const MSG_NOSIGNAL: c_int = 0x4000;
#[cfg(not(target_os = "linux"))]
const MSG_NOSIGNAL: c_int = 0x0; // unused dummy value
////////////////////////////////////////////////////////////////////////////////
// sockaddr and misc bindings
////////////////////////////////////////////////////////////////////////////////
@ -221,11 +226,12 @@ impl TcpStream {
pub fn write(&self, buf: &[u8]) -> io::Result<usize> {
let len = cmp::min(buf.len(), <wrlen_t>::max_value() as usize) as wrlen_t;
let flags = if cfg!(target_os = "linux") { MSG_NOSIGNAL } else { 0 };
let ret = cvt(unsafe {
c::send(*self.inner.as_inner(),
buf.as_ptr() as *const c_void,
len,
0)
flags)
})?;
Ok(ret as usize)
}
@ -446,10 +452,11 @@ impl UdpSocket {
pub fn send_to(&self, buf: &[u8], dst: &SocketAddr) -> io::Result<usize> {
let len = cmp::min(buf.len(), <wrlen_t>::max_value() as usize) as wrlen_t;
let (dstp, dstlen) = dst.into_inner();
let flags = if cfg!(target_os = "linux") { MSG_NOSIGNAL } else { 0 };
let ret = cvt(unsafe {
c::sendto(*self.inner.as_inner(),
buf.as_ptr() as *const c_void, len,
0, dstp, dstlen)
flags, dstp, dstlen)
})?;
Ok(ret as usize)
}
@ -569,11 +576,12 @@ impl UdpSocket {
pub fn send(&self, buf: &[u8]) -> io::Result<usize> {
let len = cmp::min(buf.len(), <wrlen_t>::max_value() as usize) as wrlen_t;
let flags = if cfg!(target_os = "linux") { MSG_NOSIGNAL } else { 0 };
let ret = cvt(unsafe {
c::send(*self.inner.as_inner(),
buf.as_ptr() as *const c_void,
len,
0)
flags)
})?;
Ok(ret as usize)
}

View file

@ -28,6 +28,11 @@ use sys::cvt;
use sys::net::Socket;
use sys_common::{AsInner, FromInner, IntoInner};
#[cfg(target_os = "linux")]
const MSG_NOSIGNAL: libc::c_int = 0x4000;
#[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
@ -686,11 +691,12 @@ impl UnixDatagram {
fn inner(d: &UnixDatagram, buf: &[u8], path: &Path) -> io::Result<usize> {
unsafe {
let (addr, len) = sockaddr_un(path)?;
let flags = if cfg!(target_os = "linux") { MSG_NOSIGNAL } else { 0 };
let count = cvt(libc::sendto(*d.0.as_inner(),
buf.as_ptr() as *const _,
buf.len(),
0,
flags,
&addr as *const _ as *const _,
len))?;
Ok(count as usize)