use std::{
env,
os::{
fd::{OwnedFd, RawFd},
unix::{io::FromRawFd, net::UnixListener},
},
};
use anyhow::{anyhow, Context};
use nix::sys::stat;
const FIRST_ACTIVATION_SOCKET_FD: RawFd = 3;
pub fn activation_socket() -> anyhow::Result<UnixListener> {
let num_activation_socks = env::var("LISTEN_FDS")
.context("fetching LISTEN_FDS env var")?
.parse::<isize>()
.context("parsing LISTEN_FDS as int")?;
if num_activation_socks != 1 {
return Err(anyhow!("expected exactly 1 activation fd, got {}", num_activation_socks));
}
let fd = unsafe { OwnedFd::from_raw_fd(FIRST_ACTIVATION_SOCKET_FD) };
let sock_stat = stat::fstat(&fd).context("stating activation sock")?;
if !stat::SFlag::from_bits_truncate(sock_stat.st_mode).contains(stat::SFlag::S_IFSOCK) {
return Err(anyhow!("expected to be passed a unix socket"));
}
Ok(fd.into())
}