#![cfg(feature = "socket-activation")]
#![cfg_attr(docsrs, doc(cfg(feature = "socket-activation")))]
use std::io;
pub struct ListenFds(listenfd::ListenFd);
impl std::fmt::Debug for ListenFds {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ListenFds")
.field("len", &self.0.len())
.finish()
}
}
impl ListenFds {
#[must_use]
pub fn from_env() -> Self {
Self(listenfd::ListenFd::from_env())
}
#[must_use]
pub fn len(&self) -> usize {
self.0.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.0.len() == 0
}
pub fn tcp_listener(&mut self, index: usize) -> io::Result<Option<tokio::net::TcpListener>> {
let Some(std_listener) = self.0.take_tcp_listener(index)? else {
return Ok(None);
};
std_listener.set_nonblocking(true)?;
Ok(Some(tokio::net::TcpListener::from_std(std_listener)?))
}
#[cfg(unix)]
pub fn unix_listener(&mut self, index: usize) -> io::Result<Option<tokio::net::UnixListener>> {
let Some(std_listener) = self.0.take_unix_listener(index)? else {
return Ok(None);
};
std_listener.set_nonblocking(true)?;
Ok(Some(tokio::net::UnixListener::from_std(std_listener)?))
}
pub fn udp_socket(&mut self, index: usize) -> io::Result<Option<tokio::net::UdpSocket>> {
let Some(std_socket) = self.0.take_udp_socket(index)? else {
return Ok(None);
};
std_socket.set_nonblocking(true)?;
Ok(Some(tokio::net::UdpSocket::from_std(std_socket)?))
}
}