jay-compositor 1.15.0

The Jay compositor
use crate::utils::clone3::double_fork;
use crate::utils::clone3::set_deathsig;
use crate::utils::errorfmt::ErrorFmt;
use crate::utils::fd_blocker::FdBlocker;
use crate::utils::fd_blocker::create_fd_blocker;
use crate::utils::process_name::set_process_name;
use std::rc::Rc;
use uapi::OwnedFd;
use uapi::c;

pub struct Sleeper {
    _blocker: FdBlocker,
    pub pidfd: Rc<OwnedFd>,
}

pub fn start_sleeper() -> Sleeper {
    let (blocker, barrier) = match create_fd_blocker() {
        Ok(r) => r,
        Err(e) => panic!("Could not create fd blocker: {}", ErrorFmt(e)),
    };
    let res = match double_fork() {
        Ok(r) => r,
        Err(e) => panic!("Could not fork sleeper: {}", ErrorFmt(e)),
    };
    match res {
        Some(pidfd) => Sleeper {
            _blocker: blocker,
            pidfd: Rc::new(pidfd),
        },
        _ => {
            set_process_name("jay sleeper");
            set_deathsig();
            drop(blocker);
            let _ = barrier.wait_blocking();
            unsafe {
                c::_exit(0);
            }
        }
    }
}