lisy 0.1.0

Linux specific high and middle level system level API library.
Documentation
//! ioctl helpers

use std::ffi::c_int;

pub const IOC_NONE: c_int = 0;
pub const IOC_WRITE: c_int = 1;
pub const IOC_READ: c_int = 2;

pub const IOC_NRBITS: c_int = 8;
pub const IOC_TYPEBITS: c_int = 8;
pub const IOC_SIZEBITS: c_int = 14;
//pub const IOC_DIRBITS: c_int = 2;

pub const IOC_NRSHIFT: c_int = 0;
pub const IOC_TYPESHIFT: c_int = IOC_NRSHIFT + IOC_NRBITS;
pub const IOC_SIZESHIFT: c_int = IOC_TYPESHIFT + IOC_TYPEBITS;
pub const IOC_DIRSHIFT: c_int = IOC_SIZESHIFT + IOC_SIZEBITS;

pub const fn ioc(dir: c_int, ty: c_int, nr: c_int, size: c_int) -> c_int {
    (dir << IOC_DIRSHIFT) | (ty << IOC_TYPESHIFT) | (nr << IOC_NRSHIFT) | (size << IOC_SIZESHIFT)
}

pub const fn ior<T: Sized>(ty: c_int, nr: c_int) -> c_int {
    ioc(IOC_READ, ty, nr, std::mem::size_of::<T>() as c_int)
}

pub const fn iowr<T: Sized>(ty: c_int, nr: c_int) -> c_int {
    ioc(
        IOC_READ | IOC_WRITE,
        ty,
        nr,
        std::mem::size_of::<T>() as c_int,
    )
}

pub const fn io(ty: c_int, nr: c_int) -> c_int {
    ioc(IOC_NONE, ty, nr, 0)
}