jay-compositor 1.14.0

The Jay compositor
use {
    crate::utils::{
        clone3::{double_fork, set_deathsig},
        errorfmt::ErrorFmt,
        fd_blocker::{FdBlocker, create_fd_blocker},
        process_name::set_process_name,
    },
    std::rc::Rc,
    uapi::{OwnedFd, 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);
            }
        }
    }
}