use libc::c_int;
pub fn retry_eintr(mut f: impl FnMut() -> c_int) -> std::io::Result<c_int> {
loop {
let ret = f();
if ret >= 0 {
return Ok(ret);
}
let err = std::io::Error::last_os_error();
if err.raw_os_error() != Some(libc::EINTR) {
return Err(err);
}
}
}
pub fn set_sockopt_int(fd: c_int, level: c_int, opt: c_int, val: c_int) -> std::io::Result<()> {
let rc = unsafe {
libc::setsockopt(
fd,
level,
opt,
(&raw const val).cast(),
size_of::<c_int>() as libc::socklen_t,
)
};
if rc < 0 {
return Err(std::io::Error::last_os_error());
}
Ok(())
}
#[cfg(test)]
#[path = "tests/posix_io.rs"]
mod tests;