c-scape 0.22.3

A libc bottom-half implementation in Rust
Documentation
use crate::convert_res;
use errno::{set_errno, Errno};
use libc::c_int;
use rustix::fd::BorrowedFd;
use rustix::fs::FlockOperation;

#[no_mangle]
unsafe extern "C" fn flock(fd: c_int, operation: c_int) -> c_int {
    libc!(libc::flock(fd, operation));

    let fd = BorrowedFd::borrow_raw(fd);
    let operation = if operation == libc::LOCK_SH {
        FlockOperation::LockShared
    } else if operation == libc::LOCK_EX {
        FlockOperation::LockExclusive
    } else if operation == libc::LOCK_UN {
        FlockOperation::Unlock
    } else if operation == libc::LOCK_SH | libc::LOCK_NB {
        FlockOperation::NonBlockingLockShared
    } else if operation == libc::LOCK_EX | libc::LOCK_NB {
        FlockOperation::NonBlockingLockExclusive
    } else if operation == libc::LOCK_UN | libc::LOCK_NB {
        FlockOperation::NonBlockingUnlock
    } else {
        set_errno(Errno(libc::EINVAL));
        return -1;
    };

    match convert_res(rustix::fs::flock(fd, operation)) {
        Some(()) => 0,
        None => -1,
    }
}