1
Fork 0

add TcpStream::set_linger and TcpStream::linger

This commit is contained in:
ibraheemdev 2021-08-30 13:02:15 -04:00
parent 6cfa773583
commit 3b6777f1ab
12 changed files with 166 additions and 1 deletions

View file

@ -12,6 +12,14 @@ use crate::time::{Duration, Instant};
use libc::{c_int, c_void, size_t, sockaddr, socklen_t, MSG_PEEK};
cfg_if::cfg_if! {
if #[cfg(target_vendor = "apple")] {
use libc::SO_LINGER_SEC as SO_LINGER;
} else {
use libc::SO_LINGER;
}
}
pub use crate::sys::{cvt, cvt_r};
#[allow(unused_extern_crates)]
@ -376,6 +384,21 @@ impl Socket {
Ok(())
}
pub fn set_linger(&self, linger: Option<Duration>) -> io::Result<()> {
let linger = libc::linger {
l_onoff: linger.is_some() as libc::c_int,
l_linger: linger.map(|dur| dur.as_secs() as libc::c_int).unwrap_or_default(),
};
setsockopt(self, libc::SOL_SOCKET, SO_LINGER, linger)
}
pub fn linger(&self) -> io::Result<Option<Duration>> {
let val: libc::linger = getsockopt(self, libc::SOL_SOCKET, SO_LINGER)?;
Ok((val.l_onoff != 0).then(|| Duration::from_secs(val.l_linger as u64)))
}
pub fn set_nodelay(&self, nodelay: bool) -> io::Result<()> {
setsockopt(self, libc::IPPROTO_TCP, libc::TCP_NODELAY, nodelay as c_int)
}