use std::io;
#[cfg(unix)]
use libc::{getrlimit, rlim_t, rlimit, setrlimit, RLIMIT_NOFILE};
#[cfg(unix)]
type Int = rlim_t;
#[cfg(not(unix))]
#[inline]
pub fn set_file_limit<T>(_: T) -> io::Result<()> {
Err(io::Error::new(
io::ErrorKind::Unsupported,
"setting file limits is not supported on this platform",
))
}
#[cfg(unix)]
pub fn set_file_limit<N>(n: N) -> io::Result<Int>
where
N: Copy + std::fmt::Display,
Int: TryFrom<N>,
{
let Ok(n) = Int::try_from(n) else {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
format!("invalid file limit '{n}'"),
));
};
let mut rlim = rlimit {
rlim_cur: 0, rlim_max: 0, };
unsafe {
if getrlimit(RLIMIT_NOFILE, &mut rlim) != 0 {
return Err(io::Error::last_os_error());
}
}
if rlim.rlim_cur >= n {
return Ok(rlim.rlim_cur);
}
rlim.rlim_cur = n.min(rlim.rlim_max);
unsafe {
if setrlimit(RLIMIT_NOFILE, &rlim as *const rlimit) != 0 {
return Err(io::Error::last_os_error());
}
}
Ok(rlim.rlim_cur)
}