origin-studio 0.16.0

An alternative `std`-like implementation built on origin
Documentation
#[cfg(feature = "std")]
pub(crate) fn sanitize_stdio_fds() {
    use rustix::cstr;
    use rustix::fd::BorrowedFd;
    use rustix::fs::{open, Mode, OFlags};
    use rustix::io::{fcntl_getfd, Errno};

    for raw_fd in 0..3 {
        let fd = unsafe { BorrowedFd::borrow_raw(raw_fd) };
        if let Err(Errno::BADF) = fcntl_getfd(fd) {
            let _ = open(cstr!("/dev/null"), OFlags::RDWR, Mode::empty()).unwrap();
        }
    }
}

#[cfg(feature = "std")]
pub(crate) unsafe fn store_args(argc: i32, argv: *mut *mut u8, envp: *mut *mut u8) {
    crate::env::MAIN_ARGS = crate::env::MainArgs { argc, argv, envp };
}

pub(crate) unsafe fn reset_sigpipe() {
    use core::mem::zeroed;
    use origin::signal::{sig_ign, sigaction, Sigaction, SigactionFlags, Signal};

    let mut action = zeroed::<Sigaction>();
    action.sa_handler_kernel = sig_ign();
    action.sa_flags = SigactionFlags::RESTART;
    sigaction(Signal::PIPE, Some(action)).unwrap();
}