tfc/linux_wayland/ffi/
ioctl.rs1use std::ffi::c_int;
4
5const _IOC_NRBITS: u32 = 8;
6const _IOC_TYPEBITS: u32 = 8;
7const _IOC_SIZEBITS: u32 = 14;
8const _IOC_DIRBITS: u32 = 2;
9
10const _IOC_NRMASK: u32 = (1 << _IOC_NRBITS) - 1;
11const _IOC_TYPEMASK: u32 = (1 << _IOC_TYPEBITS) - 1;
12const _IOC_SIZEMASK: u32 = (1 << _IOC_SIZEBITS) - 1;
13const _IOC_DIRMASK: u32 = (1 << _IOC_DIRBITS) - 1;
14
15const _IOC_NRSHIFT: u32 = 0;
16const _IOC_TYPESHIFT: u32 = _IOC_NRSHIFT + _IOC_NRBITS;
17const _IOC_SIZESHIFT: u32 = _IOC_TYPESHIFT + _IOC_TYPEBITS;
18const _IOC_DIRSHIFT: u32 = _IOC_SIZESHIFT + _IOC_SIZEBITS;
19
20const _IOC_NONE: u32 = 0;
21const _IOC_WRITE: u32 = 1;
22const _IOC_READ: u32 = 2;
23
24#[allow(non_snake_case)]
25const fn _IOC(dir: u32, type_: u32, nr: u32, size: u32) -> u32 {
26    (dir << _IOC_DIRSHIFT)
27        | (type_ << _IOC_TYPESHIFT)
28        | (nr << _IOC_NRSHIFT)
29        | (size << _IOC_SIZESHIFT)
30}
31
32#[allow(non_snake_case)]
33pub const fn _IO(type_: u32, nr: u32) -> u32 {
34    _IOC(_IOC_NONE, type_, nr, 0)
35}
36
37#[allow(non_snake_case)]
38pub const fn _IOR<T>(type_: u32, nr: u32) -> u32 {
39    _IOC(_IOC_READ, type_, nr, std::mem::size_of::<T>() as u32)
40}
41
42#[allow(non_snake_case)]
43pub const fn _IOW<T>(type_: u32, nr: u32) -> u32 {
44    _IOC(_IOC_WRITE, type_, nr, std::mem::size_of::<T>() as u32)
45}
46
47extern {
48    pub fn ioctl(fd: c_int, request: u32, ...) -> c_int;
50}