c-scape 0.22.3

A libc bottom-half implementation in Rust
Documentation
use core::ffi::CStr;
use rustix::fd::BorrowedFd;
use rustix::fs::{Access, AtFlags};

use libc::{c_char, c_int};

use crate::convert_res;

#[no_mangle]
unsafe extern "C" fn access(pathname: *const c_char, amode: c_int) -> c_int {
    libc!(libc::access(pathname, amode));

    faccessat(libc::AT_FDCWD, pathname, amode, 0)
}

#[no_mangle]
unsafe extern "C" fn faccessat(
    fd: c_int,
    pathname: *const c_char,
    amode: c_int,
    flags: c_int,
) -> c_int {
    libc!(libc::faccessat(fd, pathname, amode, flags));

    match convert_res(rustix::fs::accessat(
        BorrowedFd::borrow_raw(fd),
        CStr::from_ptr(pathname.cast()),
        Access::from_bits(amode as _).unwrap(),
        AtFlags::from_bits(flags as _).unwrap(),
    )) {
        Some(()) => 0,
        None => -1,
    }
}

#[no_mangle]
unsafe extern "C" fn euidaccess(pathname: *const c_char, amode: c_int) -> c_int {
    libc!(libc::euidaccess(pathname, amode));
    faccessat(libc::AT_FDCWD, pathname, amode, libc::AT_EACCESS)
}

#[no_mangle]
unsafe extern "C" fn eaccess(pathname: *const c_char, amode: c_int) -> c_int {
    libc!(libc::eaccess(pathname, amode));
    euidaccess(pathname, amode)
}