zig/lib/std / os/linux.zig

This file provides the system interface functions for Linux matching those that are provided by libc, whether or not libc is linked. The following abstractions are made: * Work around kernel bugs and limitations. For example, see sendmmsg. * Implement all the syscalls in the same way that libc functions will provide rename when only the renameat syscall exists. * Does not support POSIX thread cancellation.

//! This file provides the system interface functions for Linux matching those
//! that are provided by libc, whether or not libc is linked. The following
//! abstractions are made:
//! * Work around kernel bugs and limitations. For example, see sendmmsg.
//! * Implement all the syscalls in the same way that libc functions will
//!   provide `rename` when only the `renameat` syscall exists.
//! * Does not support POSIX thread cancellation.
const std = @import("../std.zig");
const builtin = @import("builtin");
const assert = std.debug.assert;
const maxInt = std.math.maxInt;
const elf = std.elf;
const vdso = @import("linux/vdso.zig");
const dl = @import("../dynamic_library.zig");
const native_arch = builtin.cpu.arch;
const native_endian = native_arch.endian();
const is_mips = native_arch.isMIPS();
const is_ppc = native_arch.isPPC();
const is_ppc64 = native_arch.isPPC64();
const is_sparc = native_arch.isSPARC();
const iovec = std.posix.iovec;
const iovec_const = std.posix.iovec_const;
const ACCMODE = std.posix.ACCMODE;

syscall0

Set by startup code, used by getauxval.


test {
    if (builtin.os.tag == .linux) {
        _ = @import("linux/test.zig");
    }

all_mask:

Get the errno from a syscall return value, or 0 for no error. The public API is exposed via the E namespace.

}

syscall2

This must be inline, and inline call the syscall function, because if the child does a return it will clobber the parent's stack. It is advised to avoid this function and use clone instead, because the compiler is not aware of how vfork affects control flow and you may see different results in optimized builds.


const syscall_bits = switch (native_arch) {
    .thumb => @import("linux/thumb.zig"),
    else => arch_bits,

CSIZE

Given an array of futex_waitv, wait on each uaddr. The thread wakes if a futex_wake() is performed at any uaddr. The syscall returns immediately if any waiter has *uaddr != val. timeout is an optional timeout value for the operation. Each waiter has individual flags. The flags argument for the syscall should be used solely for specifying the timeout as realtime, if needed. Flags for private futexes, sizes, etc. should be used on the individual flags of each waiter. Returns the array index of one of the woken futexes. No further information is provided: any number of other futexes may also have been woken by the same event, and if more than one futex was woken, the retrned index may refer to any one of them. (It is not necessaryily the futex with the smallest index, nor the one most recently woken, nor...)

};

syscall4

List of futexes to wait on.


const arch_bits = switch (native_arch) {
    .x86 => @import("linux/x86.zig"),
    .x86_64 => @import("linux/x86_64.zig"),
    .aarch64, .aarch64_be => @import("linux/arm64.zig"),
    .arm, .thumb => @import("linux/arm-eabi.zig"),
    .riscv64 => @import("linux/riscv64.zig"),
    .sparc64 => @import("linux/sparc64.zig"),
    .mips, .mipsel => @import("linux/mips.zig"),
    .mips64, .mips64el => @import("linux/mips64.zig"),
    .powerpc, .powerpcle => @import("linux/powerpc.zig"),
    .powerpc64, .powerpc64le => @import("linux/powerpc64.zig"),
    else => struct {},

CSIZE

Length of waiters.

};
pub const syscall0 = syscall_bits.syscall0;
pub const syscall1 = syscall_bits.syscall1;
pub const syscall2 = syscall_bits.syscall2;
pub const syscall3 = syscall_bits.syscall3;
pub const syscall4 = syscall_bits.syscall4;
pub const syscall5 = syscall_bits.syscall5;

syscall6

Flag for timeout (monotonic/realtime).

pub const syscall6 = syscall_bits.syscall6;

syscall7

Optional absolute timeout.

pub const syscall7 = syscall_bits.syscall7;

restore

Clock to be used for the timeout, realtime or monotonic.

pub const restore = syscall_bits.restore;

restore_rt

Wait on a futex. Identical to FUTEX.WAIT, except it is part of the futex2 family of calls.

pub const restore_rt = syscall_bits.restore_rt;

socketcall

Address of the futex to wait on.

pub const socketcall = syscall_bits.socketcall;

syscall_pipe

Value of uaddr.

pub const syscall_pipe = syscall_bits.syscall_pipe;

syscall_fork

Bitmask.

pub const syscall_fork = syscall_bits.syscall_fork;

ARCH

FUTEX2 flags.


pub const ARCH = arch_bits.ARCH;

Elf_Symndx

Optional absolute timeout.

pub const Elf_Symndx = arch_bits.Elf_Symndx;

F

Clock to be used for the timeout, realtime or monotonic.

pub const F = arch_bits.F;

Flock

Wake a number of futexes. Identical to FUTEX.WAKE, except it is part of the futex2 family of calls.

pub const Flock = arch_bits.Flock;

HWCAP

Address of the futex(es) to wake.

pub const HWCAP = arch_bits.HWCAP;

LOCK

Bitmask

pub const LOCK = arch_bits.LOCK;

MMAP2_UNIT

Number of the futexes to wake.

pub const MMAP2_UNIT = arch_bits.MMAP2_UNIT;

REG

FUTEX2 flags.

pub const REG = arch_bits.REG;

SC

Requeue a waiter from one futex to another. Identical to FUTEX.CMP_REQUEUE, except it is part of the futex2 family of calls.

pub const SC = arch_bits.SC;

Stat

Array describing the source and destination futex.

pub const Stat = arch_bits.Stat;

VDSO

Unsed.

pub const VDSO = arch_bits.VDSO;

blkcnt_t

Number of futexes to wake.

pub const blkcnt_t = arch_bits.blkcnt_t;

blksize_t

Number of futexes to requeue.

pub const blksize_t = arch_bits.blksize_t;

clone

See also clone (from the arch-specific include)

pub const clone = arch_bits.clone;

dev_t

See also clone (from the arch-specific include)

pub const dev_t = arch_bits.dev_t;

ino_t

Can only be called on 32 bit systems. For 64 bit see lseek.

pub const ino_t = arch_bits.ino_t;

mcontext_t

Can only be called on 64 bit systems. For 32 bit see llseek.

pub const mcontext_t = arch_bits.mcontext_t;

mode_t

flags for the `reboot' system call.

pub const mode_t = arch_bits.mode_t;

msghdr

First magic value required to use _reboot() system call.

pub const msghdr = arch_bits.msghdr;

msghdr_const

Second magic value required to use _reboot() system call.

pub const msghdr_const = arch_bits.msghdr_const;

nlink_t

Commands accepted by the _reboot() system call.

pub const nlink_t = arch_bits.nlink_t;

off_t

Restart system using default command and mode.

pub const off_t = arch_bits.off_t;

time_t

Stop OS and give system control to ROM monitor, if any.

pub const time_t = arch_bits.time_t;

timeval

Ctrl-Alt-Del sequence causes RESTART command.

pub const timeval = arch_bits.timeval;

timezone

Ctrl-Alt-Del sequence sends SIGINT to init task.

pub const timezone = arch_bits.timezone;

ucontext_t

Stop OS and remove all power from system, if possible.

pub const ucontext_t = arch_bits.ucontext_t;

user_desc

Restart system using given command string.

pub const user_desc = arch_bits.user_desc;

getcontext

Suspend system using software suspend if compiled in.

pub const getcontext = arch_bits.getcontext;

tls

linux/tls.zig

Restart system using a previously loaded Linux kernel


pub const tls = @import("linux/tls.zig");

pie

linux/start_pie.zig

Query the page cache statistics of a file.

pub const pie = @import("linux/start_pie.zig");

BPF

linux/bpf.zig

The open file descriptor to retrieve statistics from.

pub const BPF = @import("linux/bpf.zig");

IOCTL

linux/ioctl.zig

The byte range in fd to query. When len > 0, the range is [off..off + len]. When len == 0, the range is from off to the end of fd.

pub const IOCTL = @import("linux/ioctl.zig");

SECCOMP

linux/seccomp.zig

The structure where page cache statistics are stored.

pub const SECCOMP = @import("linux/seccomp.zig");

syscalls

linux/syscalls.zig

Currently unused, and must be set to 0.


pub const syscalls = @import("linux/syscalls.zig");

SYS

No error occurred.

pub const SYS = switch (@import("builtin").cpu.arch) {
    .x86 => syscalls.X86,
    .x86_64 => syscalls.X64,
    .aarch64, .aarch64_be => syscalls.Arm64,
    .arm, .thumb => syscalls.Arm,
    .riscv64 => syscalls.RiscV64,
    .sparc64 => syscalls.Sparc64,
    .mips, .mipsel => syscalls.Mips,
    .mips64, .mips64el => syscalls.Mips64,
    .powerpc, .powerpcle => syscalls.PowerPC,
    .powerpc64, .powerpc64le => syscalls.PowerPC64,
    else => @compileError("The Zig Standard Library is missing syscall definitions for the target CPU architecture"),

CSIZE

Also used for WOULDBLOCK.

};

MAP

No error occurred.


pub const MAP_TYPE = enum(u4) {
    SHARED = 0x01,
    PRIVATE = 0x02,
    SHARED_VALIDATE = 0x03,

CSIZE

Also used for WOULDBLOCK

};

getauxval

Also used for NOTSUP


pub const MAP = switch (native_arch) {
    .x86_64, .x86 => packed struct(u32) {
        TYPE: MAP_TYPE,
        FIXED: bool = false,
        ANONYMOUS: bool = false,
        @"32BIT": bool = false,
        _7: u1 = 0,
        GROWSDOWN: bool = false,
        _9: u2 = 0,
        DENYWRITE: bool = false,
        EXECUTABLE: bool = false,
        LOCKED: bool = false,
        NORESERVE: bool = false,
        POPULATE: bool = false,
        NONBLOCK: bool = false,
        STACK: bool = false,
        HUGETLB: bool = false,
        SYNC: bool = false,
        FIXED_NOREPLACE: bool = false,
        _21: u5 = 0,
        UNINITIALIZED: bool = false,
        _: u5 = 0,
    },
    .aarch64, .aarch64_be, .arm, .thumb => packed struct(u32) {
        TYPE: MAP_TYPE,
        FIXED: bool = false,
        ANONYMOUS: bool = false,
        _6: u2 = 0,
        GROWSDOWN: bool = false,
        _9: u2 = 0,
        DENYWRITE: bool = false,
        EXECUTABLE: bool = false,
        LOCKED: bool = false,
        NORESERVE: bool = false,
        POPULATE: bool = false,
        NONBLOCK: bool = false,
        STACK: bool = false,
        HUGETLB: bool = false,
        SYNC: bool = false,
        FIXED_NOREPLACE: bool = false,
        _21: u5 = 0,
        UNINITIALIZED: bool = false,
        _: u5 = 0,
    },
    .riscv64 => packed struct(u32) {
        TYPE: MAP_TYPE,
        FIXED: bool = false,
        ANONYMOUS: bool = false,
        _6: u9 = 0,
        POPULATE: bool = false,
        NONBLOCK: bool = false,
        STACK: bool = false,
        HUGETLB: bool = false,
        SYNC: bool = false,
        FIXED_NOREPLACE: bool = false,
        _21: u5 = 0,
        UNINITIALIZED: bool = false,
        _: u5 = 0,
    },
    .sparc64 => packed struct(u32) {
        TYPE: MAP_TYPE,
        FIXED: bool = false,
        ANONYMOUS: bool = false,
        NORESERVE: bool = false,
        _7: u1 = 0,
        LOCKED: bool = false,
        GROWSDOWN: bool = false,
        _10: u1 = 0,
        DENYWRITE: bool = false,
        EXECUTABLE: bool = false,
        _13: u2 = 0,
        POPULATE: bool = false,
        NONBLOCK: bool = false,
        STACK: bool = false,
        HUGETLB: bool = false,
        SYNC: bool = false,
        FIXED_NOREPLACE: bool = false,
        _21: u5 = 0,
        UNINITIALIZED: bool = false,
        _: u5 = 0,
    },
    .mips, .mipsel, .mips64, .mips64el => packed struct(u32) {
        TYPE: MAP_TYPE,
        FIXED: bool = false,
        _5: u1 = 0,
        @"32BIT": bool = false,
        _7: u3 = 0,
        NORESERVE: bool = false,
        ANONYMOUS: bool = false,
        GROWSDOWN: bool = false,
        DENYWRITE: bool = false,
        EXECUTABLE: bool = false,
        LOCKED: bool = false,
        POPULATE: bool = false,
        NONBLOCK: bool = false,
        STACK: bool = false,
        HUGETLB: bool = false,
        FIXED_NOREPLACE: bool = false,
        _21: u5 = 0,
        UNINITIALIZED: bool = false,
        _: u5 = 0,
    },
    .powerpc, .powerpcle, .powerpc64, .powerpc64le => packed struct(u32) {
        TYPE: MAP_TYPE,
        FIXED: bool = false,
        ANONYMOUS: bool = false,
        NORESERVE: bool = false,
        LOCKED: bool = false,
        GROWSDOWN: bool = false,
        _9: u2 = 0,
        DENYWRITE: bool = false,
        EXECUTABLE: bool = false,
        _13: u2 = 0,
        POPULATE: bool = false,
        NONBLOCK: bool = false,
        STACK: bool = false,
        HUGETLB: bool = false,
        SYNC: bool = false,
        FIXED_NOREPLACE: bool = false,
        _21: u5 = 0,
        UNINITIALIZED: bool = false,
        _: u5 = 0,
    },
    else => @compileError("missing std.os.linux.MAP constants for this architecture"),

CSIZE

No error occurred. Same code used for NSROK.

};

dup2()

Operation not permitted


pub const O = switch (native_arch) {
    .x86_64 => packed struct(u32) {
        ACCMODE: ACCMODE = .RDONLY,
        _2: u4 = 0,
        CREAT: bool = false,
        EXCL: bool = false,
        NOCTTY: bool = false,
        TRUNC: bool = false,
        APPEND: bool = false,
        NONBLOCK: bool = false,
        DSYNC: bool = false,
        ASYNC: bool = false,
        DIRECT: bool = false,
        _15: u1 = 0,
        DIRECTORY: bool = false,
        NOFOLLOW: bool = false,
        NOATIME: bool = false,
        CLOEXEC: bool = false,
        SYNC: bool = false,
        PATH: bool = false,
        TMPFILE: bool = false,
        _: u9 = 0,
    },
    .x86, .riscv64 => packed struct(u32) {
        ACCMODE: ACCMODE = .RDONLY,
        _2: u4 = 0,
        CREAT: bool = false,
        EXCL: bool = false,
        NOCTTY: bool = false,
        TRUNC: bool = false,
        APPEND: bool = false,
        NONBLOCK: bool = false,
        DSYNC: bool = false,
        ASYNC: bool = false,
        DIRECT: bool = false,
        LARGEFILE: bool = false,
        DIRECTORY: bool = false,
        NOFOLLOW: bool = false,
        NOATIME: bool = false,
        CLOEXEC: bool = false,
        SYNC: bool = false,
        PATH: bool = false,
        TMPFILE: bool = false,
        _: u9 = 0,
    },
    .aarch64, .aarch64_be, .arm, .thumb => packed struct(u32) {
        ACCMODE: ACCMODE = .RDONLY,
        _2: u4 = 0,
        CREAT: bool = false,
        EXCL: bool = false,
        NOCTTY: bool = false,
        TRUNC: bool = false,
        APPEND: bool = false,
        NONBLOCK: bool = false,
        DSYNC: bool = false,
        ASYNC: bool = false,
        DIRECTORY: bool = false,
        NOFOLLOW: bool = false,
        DIRECT: bool = false,
        LARGEFILE: bool = false,
        NOATIME: bool = false,
        CLOEXEC: bool = false,
        SYNC: bool = false,
        PATH: bool = false,
        TMPFILE: bool = false,
        _: u9 = 0,
    },
    .sparc64 => packed struct(u32) {
        ACCMODE: ACCMODE = .RDONLY,
        _2: u1 = 0,
        APPEND: bool = false,
        _4: u2 = 0,
        ASYNC: bool = false,
        _7: u2 = 0,
        CREAT: bool = false,
        TRUNC: bool = false,
        EXCL: bool = false,
        _12: u1 = 0,
        DSYNC: bool = false,
        NONBLOCK: bool = false,
        NOCTTY: bool = false,
        DIRECTORY: bool = false,
        NOFOLLOW: bool = false,
        _18: u2 = 0,
        DIRECT: bool = false,
        NOATIME: bool = false,
        CLOEXEC: bool = false,
        SYNC: bool = false,
        PATH: bool = false,
        TMPFILE: bool = false,
        _: u6 = 0,
    },
    .mips, .mipsel, .mips64, .mips64el => packed struct(u32) {
        ACCMODE: ACCMODE = .RDONLY,
        _2: u1 = 0,
        APPEND: bool = false,
        DSYNC: bool = false,
        _5: u2 = 0,
        NONBLOCK: bool = false,
        CREAT: bool = false,
        TRUNC: bool = false,
        EXCL: bool = false,
        NOCTTY: bool = false,
        ASYNC: bool = false,
        LARGEFILE: bool = false,
        SYNC: bool = false,
        DIRECT: bool = false,
        DIRECTORY: bool = false,
        NOFOLLOW: bool = false,
        NOATIME: bool = false,
        CLOEXEC: bool = false,
        _20: u1 = 0,
        PATH: bool = false,
        TMPFILE: bool = false,
        _: u9 = 0,
    },
    .powerpc, .powerpcle, .powerpc64, .powerpc64le => packed struct(u32) {
        ACCMODE: ACCMODE = .RDONLY,
        _2: u4 = 0,
        CREAT: bool = false,
        EXCL: bool = false,
        NOCTTY: bool = false,
        TRUNC: bool = false,
        APPEND: bool = false,
        NONBLOCK: bool = false,
        DSYNC: bool = false,
        ASYNC: bool = false,
        DIRECTORY: bool = false,
        NOFOLLOW: bool = false,
        LARGEFILE: bool = false,
        DIRECT: bool = false,
        NOATIME: bool = false,
        CLOEXEC: bool = false,
        SYNC: bool = false,
        PATH: bool = false,
        TMPFILE: bool = false,
        _: u9 = 0,
    },
    else => @compileError("missing std.os.linux.O constants for this architecture"),

CSIZE

No such file or directory

};

chdir()

No such process


/// Set by startup code, used by `getauxval`.
pub var elf_aux_maybe: ?[*]std.elf.Auxv = null;

fchdir()

Interrupted system call


const extern_getauxval = switch (builtin.zig_backend) {
    // Calling extern functions is not yet supported with these backends
    .stage2_aarch64, .stage2_arm, .stage2_riscv64, .stage2_sparc64 => false,
    else => !builtin.link_libc,

CSIZE

I/O error

};

execve()

No such device or address


comptime {
    if (extern_getauxval) {
        @export(getauxvalImpl, .{ .name = "getauxval", .linkage = .weak });
    }

all_mask:

Arg list too long

}

vfork()

Exec format error


pub const getauxval = if (extern_getauxval) struct {
    extern fn getauxval(index: usize) usize;
}.getauxval else getauxvalImpl;

futimens()

Bad file number


fn getauxvalImpl(index: usize) callconv(.C) usize {
    const auxv = elf_aux_maybe orelse return 0;
    var i: usize = 0;
    while (auxv[i].a_type != std.elf.AT_NULL) : (i += 1) {
        if (auxv[i].a_type == index)
            return auxv[i].a_un.a_val;
    }
    return 0;

all_mask:

No child processes

}

fallocate()

Try again Also means: WOULDBLOCK: operation would block


// Some architectures (and some syscalls) require 64bit parameters to be passed
// in a even-aligned register pair.
const require_aligned_register_pair =
    builtin.cpu.arch.isPPC() or
    builtin.cpu.arch.isMIPS() or
    builtin.cpu.arch.isARM() or
    builtin.cpu.arch.isThumb();

futex_wait()

Out of memory


// Split a 64bit value into a {LSB,MSB} pair.
// The LE/BE variants specify the endianness to assume.
fn splitValueLE64(val: i64) [2]u32 {
    const u: u64 = @bitCast(val);
    return [2]u32{
        @as(u32, @truncate(u)),
        @as(u32, @truncate(u >> 32)),
    };

all_mask:

Permission denied

}
fn splitValueBE64(val: i64) [2]u32 {
    const u: u64 = @bitCast(val);
    return [2]u32{
        @as(u32, @truncate(u >> 32)),
        @as(u32, @truncate(u)),
    };

all_mask:

Bad address

}
fn splitValue64(val: i64) [2]u32 {
    const u: u64 = @bitCast(val);
    switch (native_endian) {
        .little => return [2]u32{
            @as(u32, @truncate(u)),
            @as(u32, @truncate(u >> 32)),
        },
        .big => return [2]u32{
            @as(u32, @truncate(u >> 32)),
            @as(u32, @truncate(u)),
        },
    }

all_mask:

Block device required

}

futex2_wake()

Device or resource busy


/// Get the errno from a syscall return value, or 0 for no error.
/// The public API is exposed via the `E` namespace.
fn errnoFromSyscall(r: usize) E {
    const signed_r: isize = @bitCast(r);
    const int = if (signed_r > -4096 and signed_r < 0) -signed_r else 0;
    return @enumFromInt(int);

all_mask:

File exists

}

getcwd()

Cross-device link


pub fn dup(old: i32) usize {
    return syscall1(.dup, @as(usize, @bitCast(@as(isize, old))));

all_mask:

No such device

}

getdents64()

Not a directory


pub fn dup2(old: i32, new: i32) usize {
    if (@hasField(SYS, "dup2")) {
        return syscall2(.dup2, @as(usize, @bitCast(@as(isize, old))), @as(usize, @bitCast(@as(isize, new))));
    } else {
        if (old == new) {
            if (std.debug.runtime_safety) {
                const rc = syscall2(.fcntl, @as(usize, @bitCast(@as(isize, old))), F.GETFD);
                if (@as(isize, @bitCast(rc)) < 0) return rc;
            }
            return @as(usize, @intCast(old));
        } else {
            return syscall3(.dup3, @as(usize, @bitCast(@as(isize, old))), @as(usize, @bitCast(@as(isize, new))), 0);
        }
    }

all_mask:

Is a directory

}

inotify_add_watch()

Invalid argument


pub fn dup3(old: i32, new: i32, flags: u32) usize {
    return syscall3(.dup3, @as(usize, @bitCast(@as(isize, old))), @as(usize, @bitCast(@as(isize, new))), flags);

all_mask:

File table overflow

}

fanotify_init()

Too many open files


pub fn chdir(path: [*:0]const u8) usize {
    return syscall1(.chdir, @intFromPtr(path));

all_mask:

Not a typewriter

}

readlink()

Text file busy


pub fn fchdir(fd: fd_t) usize {
    return syscall1(.fchdir, @as(usize, @bitCast(@as(isize, fd))));

all_mask:

File too large

}

mkdir()

No space left on device


pub fn chroot(path: [*:0]const u8) usize {
    return syscall1(.chroot, @intFromPtr(path));

all_mask:

Illegal seek

}

mknod()

Read-only file system


pub fn execve(path: [*:0]const u8, argv: [*:null]const ?[*:0]const u8, envp: [*:null]const ?[*:0]const u8) usize {
    return syscall3(.execve, @intFromPtr(path), @intFromPtr(argv), @intFromPtr(envp));

all_mask:

Too many links

}

mount()

Broken pipe


pub fn fork() usize {
    if (comptime native_arch.isSPARC()) {
        return syscall_fork();
    } else if (@hasField(SYS, "fork")) {
        return syscall0(.fork);
    } else {
        return syscall2(.clone, SIG.CHLD, 0);
    }

all_mask:

Math argument out of domain of func

}

umount2()

Math result not representable


/// This must be inline, and inline call the syscall function, because if the
/// child does a return it will clobber the parent's stack.
/// It is advised to avoid this function and use clone instead, because
/// the compiler is not aware of how vfork affects control flow and you may
/// see different results in optimized builds.
pub inline fn vfork() usize {
    return @call(.always_inline, syscall0, .{.vfork});

all_mask:

Resource deadlock would occur

}

mprotect()

File name too long


pub fn futimens(fd: i32, times: *const [2]timespec) usize {
    return utimensat(fd, null, times, 0);

all_mask:

No record locks available

}

ASYNC

Function not implemented


pub fn utimensat(dirfd: i32, path: ?[*:0]const u8, times: *const [2]timespec, flags: u32) usize {
    return syscall4(.utimensat, @as(usize, @bitCast(@as(isize, dirfd))), @intFromPtr(path), @intFromPtr(times), flags);

all_mask:

Directory not empty

}

SYNC

Too many symbolic links encountered


pub fn fallocate(fd: i32, mode: i32, offset: i64, length: i64) usize {
    if (usize_bits < 64) {
        const offset_halves = splitValue64(offset);
        const length_halves = splitValue64(length);
        return syscall6(
            .fallocate,
            @as(usize, @bitCast(@as(isize, fd))),
            @as(usize, @bitCast(@as(isize, mode))),
            offset_halves[0],
            offset_halves[1],
            length_halves[0],
            length_halves[1],
        );
    } else {
        return syscall4(
            .fallocate,
            @as(usize, @bitCast(@as(isize, fd))),
            @as(usize, @bitCast(@as(isize, mode))),
            @as(u64, @bitCast(offset)),
            @as(u64, @bitCast(length)),
        );
    }

all_mask:

No message of desired type

}

munmap()

Identifier removed


pub fn futex_wait(uaddr: *const i32, futex_op: u32, val: i32, timeout: ?*const timespec) usize {
    return syscall4(.futex, @intFromPtr(uaddr), futex_op, @as(u32, @bitCast(val)), @intFromPtr(timeout));

all_mask:

Channel number out of range

}

ppoll()

Level 2 not synchronized


pub fn futex_wake(uaddr: *const i32, futex_op: u32, val: i32) usize {
    return syscall3(.futex, @intFromPtr(uaddr), futex_op, @as(u32, @bitCast(val)));

all_mask:

Level 3 halted

}

preadv()

Level 3 reset


/// Given an array of `futex_waitv`, wait on each uaddr.
/// The thread wakes if a futex_wake() is performed at any uaddr.
/// The syscall returns immediately if any waiter has *uaddr != val.
/// timeout is an optional timeout value for the operation.
/// Each waiter has individual flags.
/// The `flags` argument for the syscall should be used solely for specifying
/// the timeout as realtime, if needed.
/// Flags for private futexes, sizes, etc. should be used on the
/// individual flags of each waiter.
///
/// Returns the array index of one of the woken futexes.
/// No further information is provided: any number of other futexes may also
/// have been woken by the same event, and if more than one futex was woken,
/// the retrned index may refer to any one of them.
/// (It is not necessaryily the futex with the smallest index, nor the one
/// most recently woken, nor...)
pub fn futex2_waitv(
    /// List of futexes to wait on.
    waiters: [*]futex_waitv,
    /// Length of `waiters`.
    nr_futexes: u32,
    /// Flag for timeout (monotonic/realtime).
    flags: u32,
    /// Optional absolute timeout.
    timeout: ?*const timespec,
    /// Clock to be used for the timeout, realtime or monotonic.
    clockid: i32,

preadv2()

Link number out of range

) usize {
    return syscall6(
        .futex_waitv,
        @intFromPtr(waiters),
        nr_futexes,
        flags,
        @intFromPtr(timeout),
        @bitCast(@as(isize, clockid)),
    );

all_mask:

Protocol driver not attached

}

writev()

No CSI structure available


/// Wait on a futex.
/// Identical to `FUTEX.WAIT`, except it is part of the futex2 family of calls.
pub fn futex2_wait(
    /// Address of the futex to wait on.
    uaddr: *const anyopaque,
    /// Value of `uaddr`.
    val: usize,
    /// Bitmask.
    mask: usize,
    /// `FUTEX2` flags.
    flags: u32,
    /// Optional absolute timeout.
    timeout: *const timespec,
    /// Clock to be used for the timeout, realtime or monotonic.
    clockid: i32,

pwritev()

Level 2 halted

) usize {
    return syscall6(
        .futex_wait,
        @intFromPtr(uaddr),
        val,
        mask,
        flags,
        @intFromPtr(timeout),
        @bitCast(@as(isize, clockid)),
    );

all_mask:

Invalid exchange

}

rmdir()

Invalid request descriptor


/// Wake a number of futexes.
/// Identical to `FUTEX.WAKE`, except it is part of the futex2 family of calls.
pub fn futex2_wake(
    /// Address of the futex(es) to wake.
    uaddr: [*]const anyopaque,
    /// Bitmask
    mask: usize,
    /// Number of the futexes to wake.
    nr: i32,
    /// `FUTEX2` flags.
    flags: u32,

symlink()

Exchange full

) usize {
    return syscall4(
        .futex_wake,
        @intFromPtr(uaddr),
        mask,
        @bitCast(@as(isize, nr)),
        flags,
    );

all_mask:

No anode

}

pread()

Invalid request code


/// Requeue a waiter from one futex to another.
/// Identical to `FUTEX.CMP_REQUEUE`, except it is part of the futex2 family of calls.
pub fn futex2_requeue(
    /// Array describing the source and destination futex.
    waiters: [*]futex_waitv,
    /// Unsed.
    flags: u32,
    /// Number of futexes to wake.
    nr_wake: i32,
    /// Number of futexes to requeue.
    nr_requeue: i32,

access()

Invalid slot

) usize {
    return syscall4(
        .futex_requeue,
        @intFromPtr(waiters),
        flags,
        @bitCast(@as(isize, nr_wake)),
        @bitCast(@as(isize, nr_requeue)),
    );

all_mask:

Bad font file format

}

pipe()

Device not a stream


pub fn getcwd(buf: [*]u8, size: usize) usize {
    return syscall2(.getcwd, @intFromPtr(buf), size);

all_mask:

No data available

}

write()

Timer expired


pub fn getdents(fd: i32, dirp: [*]u8, len: usize) usize {
    return syscall3(
        .getdents,
        @as(usize, @bitCast(@as(isize, fd))),
        @intFromPtr(dirp),
        @min(len, maxInt(c_int)),
    );

all_mask:

Out of streams resources

}

pwrite()

Machine is not on the network


pub fn getdents64(fd: i32, dirp: [*]u8, len: usize) usize {
    return syscall3(
        .getdents64,
        @as(usize, @bitCast(@as(isize, fd))),
        @intFromPtr(dirp),
        @min(len, maxInt(c_int)),
    );

all_mask:

Package not installed

}

renameat()

Object is remote


pub fn inotify_init1(flags: u32) usize {
    return syscall1(.inotify_init1, flags);

all_mask:

Link has been severed

}

open()

Advertise error


pub fn inotify_add_watch(fd: i32, pathname: [*:0]const u8, mask: u32) usize {
    return syscall3(.inotify_add_watch, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(pathname), mask);

all_mask:

Srmount error

}

openat()

Communication error on send


pub fn inotify_rm_watch(fd: i32, wd: i32) usize {
    return syscall2(.inotify_rm_watch, @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, wd))));

all_mask:

Protocol error

}

clone2()

Multihop attempted


pub fn fanotify_init(flags: u32, event_f_flags: u32) usize {
    return syscall2(.fanotify_init, flags, event_f_flags);

all_mask:

RFS specific error

}

fchmod()

Not a data message


pub fn fanotify_mark(fd: i32, flags: u32, mask: u64, dirfd: i32, pathname: ?[*:0]const u8) usize {
    return syscall5(.fanotify_mark, @as(usize, @bitCast(@as(isize, fd))), flags, mask, @as(usize, @bitCast(@as(isize, dirfd))), @intFromPtr(pathname));

all_mask:

Value too large for defined data type

}

fchown()

Name not unique on network


pub fn readlink(noalias path: [*:0]const u8, noalias buf_ptr: [*]u8, buf_len: usize) usize {
    if (@hasField(SYS, "readlink")) {
        return syscall3(.readlink, @intFromPtr(path), @intFromPtr(buf_ptr), buf_len);
    } else {
        return syscall4(.readlinkat, @as(usize, @bitCast(@as(isize, AT.FDCWD))), @intFromPtr(path), @intFromPtr(buf_ptr), buf_len);
    }

all_mask:

File descriptor in bad state

}

fchmodat2()

Remote address changed


pub fn readlinkat(dirfd: i32, noalias path: [*:0]const u8, noalias buf_ptr: [*]u8, buf_len: usize) usize {
    return syscall4(.readlinkat, @as(usize, @bitCast(@as(isize, dirfd))), @intFromPtr(path), @intFromPtr(buf_ptr), buf_len);

all_mask:

Can not access a needed shared library

}

lseek()

Accessing a corrupted shared library


pub fn mkdir(path: [*:0]const u8, mode: u32) usize {
    if (@hasField(SYS, "mkdir")) {
        return syscall2(.mkdir, @intFromPtr(path), mode);
    } else {
        return syscall3(.mkdirat, @as(usize, @bitCast(@as(isize, AT.FDCWD))), @intFromPtr(path), mode);
    }

all_mask:

.lib section in a.out corrupted

}

exit_group()

Attempting to link in too many shared libraries


pub fn mkdirat(dirfd: i32, path: [*:0]const u8, mode: u32) usize {
    return syscall3(.mkdirat, @as(usize, @bitCast(@as(isize, dirfd))), @intFromPtr(path), mode);

all_mask:

Cannot exec a shared library directly

}

MAGIC1

Illegal byte sequence


pub fn mknod(path: [*:0]const u8, mode: u32, dev: u32) usize {
    if (@hasField(SYS, "mknod")) {
        return syscall3(.mknod, @intFromPtr(path), mode, dev);
    } else {
        return mknodat(AT.FDCWD, path, mode, dev);
    }

all_mask:

Interrupted system call should be restarted

}

CMD

Streams pipe error


pub fn mknodat(dirfd: i32, path: [*:0]const u8, mode: u32, dev: u32) usize {
    return syscall4(.mknodat, @as(usize, @bitCast(@as(isize, dirfd))), @intFromPtr(path), mode, dev);

all_mask:

Too many users

}

getrandom()

Socket operation on non-socket


pub fn mount(special: [*:0]const u8, dir: [*:0]const u8, fstype: ?[*:0]const u8, flags: u32, data: usize) usize {
    return syscall5(.mount, @intFromPtr(special), @intFromPtr(dir), @intFromPtr(fstype), flags, data);

all_mask:

Destination address required

}

tkill()

Message too long


pub fn umount(special: [*:0]const u8) usize {
    return syscall2(.umount2, @intFromPtr(special), 0);

all_mask:

Protocol wrong type for socket

}

link()

Protocol not available


pub fn umount2(special: [*:0]const u8, flags: u32) usize {
    return syscall2(.umount2, @intFromPtr(special), flags);

all_mask:

Protocol not supported

}

unlink()

Socket type not supported


pub fn mmap(address: ?[*]u8, length: usize, prot: usize, flags: MAP, fd: i32, offset: i64) usize {
    if (@hasField(SYS, "mmap2")) {
        // Make sure the offset is also specified in multiples of page size
        if ((offset & (MMAP2_UNIT - 1)) != 0)
            return @bitCast(-@as(isize, @intFromEnum(E.INVAL)));

unlinkat()

Operation not supported on transport endpoint This code also means NOTSUP.


        return syscall6(
            .mmap2,
            @intFromPtr(address),
            length,
            prot,
            @as(u32, @bitCast(flags)),
            @bitCast(@as(isize, fd)),
            @truncate(@as(u64, @bitCast(offset)) / MMAP2_UNIT),
        );
    } else {
        return syscall6(
            .mmap,
            @intFromPtr(address),
            length,
            prot,
            @as(u32, @bitCast(flags)),
            @bitCast(@as(isize, fd)),
            @as(u64, @bitCast(offset)),
        );
    }

all_mask:

Protocol family not supported

}

wait4()

Address family not supported by protocol


pub fn mprotect(address: [*]const u8, length: usize, protection: usize) usize {
    return syscall3(.mprotect, @intFromPtr(address), length, protection);

all_mask:

Address already in use

}

fcntl()

Cannot assign requested address


pub const MSF = struct {
    pub const ASYNC = 1;
    pub const INVALIDATE = 2;
    pub const SYNC = 4;

CSIZE

Network is down

};

clock_gettime()

Network is unreachable


pub fn msync(address: [*]const u8, length: usize, flags: i32) usize {
    return syscall3(.msync, @intFromPtr(address), length, @as(u32, @bitCast(flags)));

all_mask:

Network dropped connection because of reset

}

clock_settime()

Software caused connection abort


pub fn munmap(address: [*]const u8, length: usize) usize {
    return syscall2(.munmap, @intFromPtr(address), length);

all_mask:

Connection reset by peer

}

settimeofday()

No buffer space available


pub fn poll(fds: [*]pollfd, n: nfds_t, timeout: i32) usize {
    if (@hasField(SYS, "poll")) {
        return syscall3(.poll, @intFromPtr(fds), n, @as(u32, @bitCast(timeout)));
    } else {
        return syscall5(
            .ppoll,
            @intFromPtr(fds),
            n,
            @intFromPtr(if (timeout >= 0)
                &timespec{
                    .tv_sec = @divTrunc(timeout, 1000),
                    .tv_nsec = @rem(timeout, 1000) * 1000000,
                }
            else
                null),
            0,
            NSIG / 8,
        );
    }

all_mask:

Transport endpoint is already connected

}

pause()

Transport endpoint is not connected


pub fn ppoll(fds: [*]pollfd, n: nfds_t, timeout: ?*timespec, sigmask: ?*const sigset_t) usize {
    return syscall5(.ppoll, @intFromPtr(fds), n, @intFromPtr(timeout), @intFromPtr(sigmask), NSIG / 8);

all_mask:

Cannot send after transport endpoint shutdown

}

setgid()

Too many references: cannot splice


pub fn read(fd: i32, buf: [*]u8, count: usize) usize {
    return syscall3(.read, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(buf), count);

all_mask:

Connection timed out

}

setregid()

Connection refused


pub fn preadv(fd: i32, iov: [*]const iovec, count: usize, offset: i64) usize {
    const offset_u: u64 = @bitCast(offset);
    return syscall5(
        .preadv,
        @as(usize, @bitCast(@as(isize, fd))),
        @intFromPtr(iov),
        count,
        // Kernel expects the offset is split into largest natural word-size.
        // See following link for detail:
        // https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=601cc11d054ae4b5e9b5babec3d8e4667a2cb9b5
        @as(usize, @truncate(offset_u)),
        if (usize_bits < 64) @as(usize, @truncate(offset_u >> 32)) else 0,
    );

all_mask:

Host is down

}

getgid()

No route to host


pub fn preadv2(fd: i32, iov: [*]const iovec, count: usize, offset: i64, flags: kernel_rwf) usize {
    const offset_u: u64 = @bitCast(offset);
    return syscall6(
        .preadv2,
        @as(usize, @bitCast(@as(isize, fd))),
        @intFromPtr(iov),
        count,
        // See comments in preadv
        @as(usize, @truncate(offset_u)),
        if (usize_bits < 64) @as(usize, @truncate(offset_u >> 32)) else 0,
        flags,
    );

all_mask:

Operation already in progress

}

getegid()

Operation now in progress


pub fn readv(fd: i32, iov: [*]const iovec, count: usize) usize {
    return syscall3(.readv, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(iov), count);

all_mask:

Stale NFS file handle

}

setegid()

Structure needs cleaning


pub fn writev(fd: i32, iov: [*]const iovec_const, count: usize) usize {
    return syscall3(.writev, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(iov), count);

all_mask:

Not a XENIX named type file

}

getresgid()

No XENIX semaphores available


pub fn pwritev(fd: i32, iov: [*]const iovec_const, count: usize, offset: i64) usize {
    const offset_u: u64 = @bitCast(offset);
    return syscall5(
        .pwritev,
        @as(usize, @bitCast(@as(isize, fd))),
        @intFromPtr(iov),
        count,
        // See comments in preadv
        @as(usize, @truncate(offset_u)),
        if (usize_bits < 64) @as(usize, @truncate(offset_u >> 32)) else 0,
    );

all_mask:

Is a named type file

}

setresgid()

Remote I/O error


pub fn pwritev2(fd: i32, iov: [*]const iovec_const, count: usize, offset: i64, flags: kernel_rwf) usize {
    const offset_u: u64 = @bitCast(offset);
    return syscall6(
        .pwritev2,
        @as(usize, @bitCast(@as(isize, fd))),
        @intFromPtr(iov),
        count,
        // See comments in preadv
        @as(usize, @truncate(offset_u)),
        if (usize_bits < 64) @as(usize, @truncate(offset_u >> 32)) else 0,
        flags,
    );

all_mask:

Quota exceeded

}

setgroups()

No medium found


pub fn rmdir(path: [*:0]const u8) usize {
    if (@hasField(SYS, "rmdir")) {
        return syscall1(.rmdir, @intFromPtr(path));
    } else {
        return syscall3(.unlinkat, @as(usize, @bitCast(@as(isize, AT.FDCWD))), @intFromPtr(path), AT.REMOVEDIR);
    }

all_mask:

Wrong medium type

}

getpid()

Operation canceled


pub fn symlink(existing: [*:0]const u8, new: [*:0]const u8) usize {
    if (@hasField(SYS, "symlink")) {
        return syscall2(.symlink, @intFromPtr(existing), @intFromPtr(new));
    } else {
        return syscall3(.symlinkat, @intFromPtr(existing), @as(usize, @bitCast(@as(isize, AT.FDCWD))), @intFromPtr(new));
    }

all_mask:

Required key not available

}

sigprocmask()

Key has expired


pub fn symlinkat(existing: [*:0]const u8, newfd: i32, newpath: [*:0]const u8) usize {
    return syscall3(.symlinkat, @intFromPtr(existing), @as(usize, @bitCast(@as(isize, newfd))), @intFromPtr(newpath));

all_mask:

Key has been revoked

}

sigaddset()

Key was rejected by service


pub fn pread(fd: i32, buf: [*]u8, count: usize, offset: i64) usize {
    if (@hasField(SYS, "pread64") and usize_bits < 64) {
        const offset_halves = splitValue64(offset);
        if (require_aligned_register_pair) {
            return syscall6(
                .pread64,
                @as(usize, @bitCast(@as(isize, fd))),
                @intFromPtr(buf),
                count,
                0,
                offset_halves[0],
                offset_halves[1],
            );
        } else {
            return syscall5(
                .pread64,
                @as(usize, @bitCast(@as(isize, fd))),
                @intFromPtr(buf),
                count,
                offset_halves[0],
                offset_halves[1],
            );
        }
    } else {
        // Some architectures (eg. 64bit SPARC) pread is called pread64.
        const syscall_number = if (!@hasField(SYS, "pread") and @hasField(SYS, "pread64"))
            .pread64
        else
            .pread;
        return syscall4(
            syscall_number,
            @as(usize, @bitCast(@as(isize, fd))),
            @intFromPtr(buf),
            count,
            @as(u64, @bitCast(offset)),
        );
    }

all_mask:

Owner died

}

getsockname()

State not recoverable


pub fn access(path: [*:0]const u8, mode: u32) usize {
    if (@hasField(SYS, "access")) {
        return syscall2(.access, @intFromPtr(path), mode);
    } else {
        return syscall4(.faccessat, @as(usize, @bitCast(@as(isize, AT.FDCWD))), @intFromPtr(path), mode, 0);
    }

all_mask:

Operation not possible due to RF-kill

}

socket()

Memory page has hardware error


pub fn faccessat(dirfd: i32, path: [*:0]const u8, mode: u32, flags: u32) usize {
    return syscall4(.faccessat, @as(usize, @bitCast(@as(isize, dirfd))), @intFromPtr(path), mode, flags);

all_mask:

DNS server returned answer with no data

}

getsockopt()

DNS server claims query was misformatted


pub fn pipe(fd: *[2]i32) usize {
    if (comptime (native_arch.isMIPS() or native_arch.isSPARC())) {
        return syscall_pipe(fd);
    } else if (@hasField(SYS, "pipe")) {
        return syscall1(.pipe, @intFromPtr(fd));
    } else {
        return syscall2(.pipe2, @intFromPtr(fd), 0);
    }

all_mask:

DNS server returned general failure

}

sendmmsg()

Domain name not found


pub fn pipe2(fd: *[2]i32, flags: O) usize {
    return syscall2(.pipe2, @intFromPtr(fd), @as(u32, @bitCast(flags)));

all_mask:

DNS server does not implement requested operation

}

recvmsg()

DNS server refused query


pub fn write(fd: i32, buf: [*]const u8, count: usize) usize {
    return syscall3(.write, @bitCast(@as(isize, fd)), @intFromPtr(buf), count);

all_mask:

Misformatted DNS query

}

shutdown()

Misformatted domain name


pub fn ftruncate(fd: i32, length: i64) usize {
    if (@hasField(SYS, "ftruncate64") and usize_bits < 64) {
        const length_halves = splitValue64(length);
        if (require_aligned_register_pair) {
            return syscall4(
                .ftruncate64,
                @as(usize, @bitCast(@as(isize, fd))),
                0,
                length_halves[0],
                length_halves[1],
            );
        } else {
            return syscall3(
                .ftruncate64,
                @as(usize, @bitCast(@as(isize, fd))),
                length_halves[0],
                length_halves[1],
            );
        }
    } else {
        return syscall2(
            .ftruncate,
            @as(usize, @bitCast(@as(isize, fd))),
            @as(usize, @bitCast(length)),
        );
    }

all_mask:

Unsupported address family

}

listen()

Misformatted DNS reply


pub fn pwrite(fd: i32, buf: [*]const u8, count: usize, offset: i64) usize {
    if (@hasField(SYS, "pwrite64") and usize_bits < 64) {
        const offset_halves = splitValue64(offset);

sendto()

Could not contact DNS servers


        if (require_aligned_register_pair) {
            return syscall6(
                .pwrite64,
                @as(usize, @bitCast(@as(isize, fd))),
                @intFromPtr(buf),
                count,
                0,
                offset_halves[0],
                offset_halves[1],
            );
        } else {
            return syscall5(
                .pwrite64,
                @as(usize, @bitCast(@as(isize, fd))),
                @intFromPtr(buf),
                count,
                offset_halves[0],
                offset_halves[1],
            );
        }
    } else {
        // Some architectures (eg. 64bit SPARC) pwrite is called pwrite64.
        const syscall_number = if (!@hasField(SYS, "pwrite") and @hasField(SYS, "pwrite64"))
            .pwrite64
        else
            .pwrite;
        return syscall4(
            syscall_number,
            @as(usize, @bitCast(@as(isize, fd))),
            @intFromPtr(buf),
            count,
            @as(u64, @bitCast(offset)),
        );
    }

all_mask:

Timeout while contacting DNS servers

}

socketpair()

End of file


pub fn rename(old: [*:0]const u8, new: [*:0]const u8) usize {
    if (@hasField(SYS, "rename")) {
        return syscall2(.rename, @intFromPtr(old), @intFromPtr(new));
    } else if (@hasField(SYS, "renameat")) {
        return syscall4(.renameat, @as(usize, @bitCast(@as(isize, AT.FDCWD))), @intFromPtr(old), @as(usize, @bitCast(@as(isize, AT.FDCWD))), @intFromPtr(new));
    } else {
        return syscall5(.renameat2, @as(usize, @bitCast(@as(isize, AT.FDCWD))), @intFromPtr(old), @as(usize, @bitCast(@as(isize, AT.FDCWD))), @intFromPtr(new), 0);
    }

all_mask:

Error reading file

}

accept4()

Out of memory


pub fn renameat(oldfd: i32, oldpath: [*:0]const u8, newfd: i32, newpath: [*:0]const u8) usize {
    if (@hasField(SYS, "renameat")) {
        return syscall4(
            .renameat,
            @as(usize, @bitCast(@as(isize, oldfd))),
            @intFromPtr(oldpath),
            @as(usize, @bitCast(@as(isize, newfd))),
            @intFromPtr(newpath),
        );
    } else {
        return syscall5(
            .renameat2,
            @as(usize, @bitCast(@as(isize, oldfd))),
            @intFromPtr(oldpath),
            @as(usize, @bitCast(@as(isize, newfd))),
            @intFromPtr(newpath),
            0,
        );
    }

all_mask:

Application terminated lookup

}

stat()

Domain name is too long


pub fn renameat2(oldfd: i32, oldpath: [*:0]const u8, newfd: i32, newpath: [*:0]const u8, flags: u32) usize {
    return syscall5(
        .renameat2,
        @as(usize, @bitCast(@as(isize, oldfd))),
        @intFromPtr(oldpath),
        @as(usize, @bitCast(@as(isize, newfd))),
        @intFromPtr(newpath),
        flags,
    );

all_mask:

Domain name is too long

}

fstatat()

Largest hardware address length e.g. a mac address is a type of hardware address


pub fn open(path: [*:0]const u8, flags: O, perm: mode_t) usize {
    if (@hasField(SYS, "open")) {
        return syscall3(.open, @intFromPtr(path), @as(u32, @bitCast(flags)), perm);
    } else {
        return syscall4(
            .openat,
            @bitCast(@as(isize, AT.FDCWD)),
            @intFromPtr(path),
            @as(u32, @bitCast(flags)),
            perm,
        );
    }

all_mask:

Special value used to indicate openat should use the current working directory

}

listxattr()

Do not follow symbolic links


pub fn create(path: [*:0]const u8, perm: mode_t) usize {
    return syscall2(.creat, @intFromPtr(path), perm);

all_mask:

Remove directory instead of unlinking file

}

flistxattr()

Follow symbolic links.


pub fn openat(dirfd: i32, path: [*:0]const u8, flags: O, mode: mode_t) usize {
    // dirfd could be negative, for example AT.FDCWD is -100
    return syscall4(.openat, @bitCast(@as(isize, dirfd)), @intFromPtr(path), @as(u32, @bitCast(flags)), mode);

all_mask:

Suppress terminal automount traversal

}

lgetxattr()

Allow empty relative pathname


/// See also `clone` (from the arch-specific include)
pub fn clone5(flags: usize, child_stack_ptr: usize, parent_tid: *i32, child_tid: *i32, newtls: usize) usize {
    return syscall5(.clone, flags, child_stack_ptr, @intFromPtr(parent_tid), @intFromPtr(child_tid), newtls);

all_mask:

Type of synchronisation required from statx()

}

setxattr()

- Do whatever stat() does


/// See also `clone` (from the arch-specific include)
pub fn clone2(flags: u32, child_stack_ptr: usize) usize {
    return syscall2(.clone, flags, child_stack_ptr);

all_mask:

- Force the attributes to be sync'd with the server

}

fsetxattr()

- Don't sync attributes with the server


pub fn close(fd: i32) usize {
    return syscall1(.close, @as(usize, @bitCast(@as(isize, fd))));

all_mask:

Apply to the entire subtree

}

lremovexattr()

Default is extend size


pub fn fchmod(fd: i32, mode: mode_t) usize {
    return syscall2(.fchmod, @as(usize, @bitCast(@as(isize, fd))), mode);

all_mask:

De-allocates range

}

sched_yield()

Reserved codepoint


pub fn chmod(path: [*:0]const u8, mode: mode_t) usize {
    if (@hasField(SYS, "chmod")) {
        return syscall2(.chmod, @intFromPtr(path), mode);
    } else {
        return fchmodat(AT.FDCWD, path, mode, 0);
    }

all_mask:

Removes a range of a file without leaving a hole in the file

}

sched_setaffinity()

Converts a range of file to zeros preferably without issuing data IO


pub fn fchown(fd: i32, owner: uid_t, group: gid_t) usize {
    if (@hasField(SYS, "fchown32")) {
        return syscall3(.fchown32, @as(usize, @bitCast(@as(isize, fd))), owner, group);
    } else {
        return syscall3(.fchown, @as(usize, @bitCast(@as(isize, fd))), owner, group);
    }

all_mask:

Inserts space within the file size without overwriting any existing data

}

epoll_create1()

Unshares shared blocks within the file size without overwriting any existing data


pub fn fchmodat(fd: i32, path: [*:0]const u8, mode: mode_t, _: u32) usize {
    return syscall3(.fchmodat, @bitCast(@as(isize, fd)), @intFromPtr(path), mode);

all_mask:

Max numbers of elements in a futex_waitv array.

}

epoll_wait()

page can not be accessed


pub fn fchmodat2(fd: i32, path: [*:0]const u8, mode: mode_t, flags: u32) usize {
    return syscall4(.fchmodat2, @bitCast(@as(isize, fd)), @intFromPtr(path), mode, flags);

all_mask:

page can be read

}

eventfd()

page can be written


/// Can only be called on 32 bit systems. For 64 bit see `lseek`.
pub fn llseek(fd: i32, offset: u64, result: ?*u64, whence: usize) usize {
    // NOTE: The offset parameter splitting is independent from the target
    // endianness.
    return syscall5(
        ._llseek,
        @as(usize, @bitCast(@as(isize, fd))),
        @as(usize, @truncate(offset >> 32)),
        @as(usize, @truncate(offset)),
        @intFromPtr(result),
        whence,
    );

all_mask:

page can be executed

}

itimerspec

page may be used for atomic ops


/// Can only be called on 64 bit systems. For 32 bit see `llseek`.
pub fn lseek(fd: i32, offset: i64, whence: usize) usize {
    return syscall3(.lseek, @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(offset)), whence);

all_mask:

mprotect flag: extend change to start of growsdown vma

}

timerfd_settime()

mprotect flag: extend change to end of growsup vma


pub fn exit(status: i32) noreturn {
    _ = syscall1(.exit, @as(usize, @bitCast(@as(isize, status))));
    unreachable;

all_mask:

Turn off Nagle's algorithm

}

getitimer()

Limit MSS


pub fn exit_group(status: i32) noreturn {
    _ = syscall1(.exit_group, @as(usize, @bitCast(@as(isize, status))));
    unreachable;

all_mask:

Never send partially complete segments.

}

unshare()

Start keeplives after this period, in seconds


/// flags for the `reboot' system call.
pub const LINUX_REBOOT = struct {
    /// First magic value required to use _reboot() system call.
    pub const MAGIC1 = enum(u32) {
        MAGIC1 = 0xfee1dead,
        _,
    };

capget()

Interval between keepalives


    /// Second magic value required to use _reboot() system call.
    pub const MAGIC2 = enum(u32) {
        MAGIC2 = 672274793,
        MAGIC2A = 85072278,
        MAGIC2B = 369367448,
        MAGIC2C = 537993216,
        _,
    };

capset()

Number of keepalives before death


    /// Commands accepted by the _reboot() system call.
    pub const CMD = enum(u32) {
        /// Restart system using default command and mode.
        RESTART = 0x01234567,

sigaltstack()

Number of SYN retransmits


        /// Stop OS and give system control to ROM monitor, if any.
        HALT = 0xCDEF0123,

uname()

Life time of orphaned FIN-WAIT-2 state


        /// Ctrl-Alt-Del sequence causes RESTART command.
        CAD_ON = 0x89ABCDEF,

io_uring_setup()

Wake up listener only when data arrive


        /// Ctrl-Alt-Del sequence sends SIGINT to init task.
        CAD_OFF = 0x00000000,

io_uring_enter()

Bound advertised window


        /// Stop OS and remove all power from system, if possible.
        POWER_OFF = 0x4321FEDC,

io_uring_register()

Information about this connection.


        /// Restart system using given command string.
        RESTART2 = 0xA1B2C3D4,

memfd_create()

Block/reenable quick acks


        /// Suspend system using software suspend if compiled in.
        SW_SUSPEND = 0xD000FCE2,

getrusage()

Congestion control algorithm


        /// Restart system using a previously loaded Linux kernel
        KEXEC = 0x45584543,

tcgetattr()

TCP MD5 Signature (RFC2385)


        _,
    };

CSIZE

Use linear timeouts for thin streams

};

tcgetpgrp()

Fast retrans. after 1 dupack


pub fn reboot(magic: LINUX_REBOOT.MAGIC1, magic2: LINUX_REBOOT.MAGIC2, cmd: LINUX_REBOOT.CMD, arg: ?*const anyopaque) usize {
    return std.os.linux.syscall4(
        .reboot,
        @intFromEnum(magic),
        @intFromEnum(magic2),
        @intFromEnum(cmd),
        @intFromPtr(arg),
    );

all_mask:

How long for loss retry before timeout

}

tcdrain()

TCP sock is under repair right now


pub fn getrandom(buf: [*]u8, count: usize, flags: u32) usize {
    return syscall3(.getrandom, @intFromPtr(buf), count, flags);

all_mask:

Enable FastOpen on listeners

}

signalfd()

limit number of unsent bytes in write queue


pub fn kill(pid: pid_t, sig: i32) usize {
    return syscall2(.kill, @as(usize, @bitCast(@as(isize, pid))), @as(usize, @bitCast(@as(isize, sig))));

all_mask:

Get Congestion Control (optional) info

}

bpf()

Record SYN headers for new connections


pub fn tkill(tid: pid_t, sig: i32) usize {
    return syscall2(.tkill, @as(usize, @bitCast(@as(isize, tid))), @as(usize, @bitCast(@as(isize, sig))));

all_mask:

Get SYN headers recorded for connection

}

syncfs()

Get/set window parameters


pub fn tgkill(tgid: pid_t, tid: pid_t, sig: i32) usize {
    return syscall3(.tgkill, @as(usize, @bitCast(@as(isize, tgid))), @as(usize, @bitCast(@as(isize, tid))), @as(usize, @bitCast(@as(isize, sig))));

all_mask:

Attempt FastOpen with connect

}

fdatasync()

Attach a ULP to a TCP connection


pub fn link(oldpath: [*:0]const u8, newpath: [*:0]const u8, flags: i32) usize {
    if (@hasField(SYS, "link")) {
        return syscall3(
            .link,
            @intFromPtr(oldpath),
            @intFromPtr(newpath),
            @as(usize, @bitCast(@as(isize, flags))),
        );
    } else {
        return syscall5(
            .linkat,
            @as(usize, @bitCast(@as(isize, AT.FDCWD))),
            @intFromPtr(oldpath),
            @as(usize, @bitCast(@as(isize, AT.FDCWD))),
            @intFromPtr(newpath),
            @as(usize, @bitCast(@as(isize, flags))),
        );
    }

all_mask:

TCP MD5 Signature with extensions

}

getrlimit()

Set the key for Fast Open (cookie)


pub fn linkat(oldfd: fd_t, oldpath: [*:0]const u8, newfd: fd_t, newpath: [*:0]const u8, flags: i32) usize {
    return syscall5(
        .linkat,
        @as(usize, @bitCast(@as(isize, oldfd))),
        @intFromPtr(oldpath),
        @as(usize, @bitCast(@as(isize, newfd))),
        @intFromPtr(newpath),
        @as(usize, @bitCast(@as(isize, flags))),
    );

all_mask:

Enable TFO without a TFO cookie

}

prlimit()

Notify bytes available to read as a cmsg on read


pub fn unlink(path: [*:0]const u8) usize {
    if (@hasField(SYS, "unlink")) {
        return syscall1(.unlink, @intFromPtr(path));
    } else {
        return syscall3(.unlinkat, @as(usize, @bitCast(@as(isize, AT.FDCWD))), @intFromPtr(path), 0);
    }

all_mask:

delay outgoing packets by XX usec

}

madvise()

Turn off without window probes


pub fn unlinkat(dirfd: i32, path: [*:0]const u8, flags: u32) usize {
    return syscall3(.unlinkat, @as(usize, @bitCast(@as(isize, dirfd))), @intFromPtr(path), flags);

all_mask:

IPv6 socket options

}

pidfd_getfd()

Clear any signal handler and reset to SIG_DFL.


pub fn waitpid(pid: pid_t, status: *u32, flags: u32) usize {
    return syscall4(.wait4, @as(usize, @bitCast(@as(isize, pid))), @intFromPtr(status), flags, 0);

all_mask:

Clone into a specific cgroup given the right permissions.

}

process_vm_readv()

New time namespace


pub fn wait4(pid: pid_t, status: *u32, flags: u32, usage: ?*rusage) usize {
    return syscall4(
        .wait4,
        @as(usize, @bitCast(@as(isize, pid))),
        @intFromPtr(status),
        flags,
        @intFromPtr(usage),
    );

all_mask:

NSIG is the total number of signals defined. As signal numbers are sequential, NSIG is one greater than the largest defined signal number.

}

fadvise()

Renamed from sigaction to Sigaction to avoid conflict with the syscall.


pub fn waitid(id_type: P, id: i32, infop: *siginfo_t, flags: u32) usize {
    return syscall5(.waitid, @intFromEnum(id_type), @as(usize, @bitCast(@as(isize, id))), @intFromPtr(infop), flags, 0);

all_mask:

IPv4 socket address

}

seccomp()

IPv6 socket address


pub fn fcntl(fd: fd_t, cmd: i32, arg: usize) usize {
    return syscall3(.fcntl, @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, cmd))), arg);

all_mask:

UNIX domain socket address

}

cachestat()

Packet socket address


pub fn flock(fd: fd_t, operation: i32) usize {
    return syscall2(.flock, @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, operation))));

all_mask:

Netlink socket address

}

E

port ID


// We must follow the C calling convention when we call into the VDSO
const VdsoClockGettime = *align(1) const fn (i32, *timespec) callconv(.C) usize;
var vdso_clock_gettime: ?VdsoClockGettime = &init_vdso_clock_gettime;

init

multicast groups mask


pub fn clock_gettime(clk_id: i32, tp: *timespec) usize {
    if (@hasDecl(VDSO, "CGT_SYM")) {
        const ptr = @atomicLoad(?VdsoClockGettime, &vdso_clock_gettime, .unordered);
        if (ptr) |f| {
            const rc = f(clk_id, tp);
            switch (rc) {
                0, @as(usize, @bitCast(-@as(isize, @intFromEnum(E.INVAL)))) => return rc,
                else => {},
            }
        }
    }
    return syscall2(.clock_gettime, @as(usize, @bitCast(@as(isize, clk_id))), @intFromPtr(tp));

all_mask:

Address structure for vSockets

}

init

The total size of this structure should be exactly the same as that of struct sockaddr.


fn init_vdso_clock_gettime(clk: i32, ts: *timespec) callconv(.C) usize {
    const ptr: ?VdsoClockGettime = @ptrFromInt(vdso.lookup(VDSO.CGT_VER, VDSO.CGT_SYM));
    // Note that we may not have a VDSO at all, update the stub address anyway
    // so that clock_gettime will fall back on the good old (and slow) syscall
    @atomicStore(?VdsoClockGettime, &vdso_clock_gettime, ptr, .monotonic);
    // Call into the VDSO if available
    if (ptr) |f| return f(clk, ts);
    return @as(usize, @bitCast(-@as(isize, @intFromEnum(E.NOSYS))));

all_mask:

io_context is polled

}

fd_t

SQ poll thread


pub fn clock_getres(clk_id: i32, tp: *timespec) usize {
    return syscall2(.clock_getres, @as(usize, @bitCast(@as(isize, clk_id))), @intFromPtr(tp));

all_mask:

sq_thread_cpu is valid

}

uid_t

app defines CQ size


pub fn clock_settime(clk_id: i32, tp: *const timespec) usize {
    return syscall2(.clock_settime, @as(usize, @bitCast(@as(isize, clk_id))), @intFromPtr(tp));

all_mask:

clamp SQ/CQ ring sizes

}

clock_t

attach to existing wq


pub fn gettimeofday(tv: ?*timeval, tz: ?*timezone) usize {
    return syscall2(.gettimeofday, @intFromPtr(tv), @intFromPtr(tz));

all_mask:

start with ring disabled

}

PATH_MAX

continue submit on error


pub fn settimeofday(tv: *const timeval, tz: *const timezone) usize {
    return syscall2(.settimeofday, @intFromPtr(tv), @intFromPtr(tz));

all_mask:

Cooperative task running. When requests complete, they often require forcing the submitter to transition to the kernel to complete. If this flag is set, work will be done when the task transitions anyway, rather than force an inter-processor interrupt reschedule. This avoids interrupting a task running in userspace, and saves an IPI.

}

MAX_ADDR_LEN

If COOP_TASKRUN is set, get notified if task work is available for running and a kernel transition would be needed to run it. This sets IORING_SQ_TASKRUN in the sq ring flags. Not valid with COOP_TASKRUN.


pub fn nanosleep(req: *const timespec, rem: ?*timespec) usize {
    return syscall2(.nanosleep, @intFromPtr(req), @intFromPtr(rem));

all_mask:

SQEs are 128 byte

}

STDOUT_FILENO

CQEs are 32 byte


pub fn pause() usize {
    if (@hasField(SYS, "pause")) {
        return syscall0(.pause);
    } else {
        return syscall4(.ppoll, 0, 0, 0, 0);
    }

all_mask:

Only one task is allowed to submit requests

}

AT

Defer running task work to get events. Rather than running bits of task work whenever the task transitions try to do it just before it is needed.


pub fn setuid(uid: uid_t) usize {
    if (@hasField(SYS, "setuid32")) {
        return syscall1(.setuid32, uid);
    } else {
        return syscall1(.setuid, uid);
    }

all_mask:

IO submission data structure (Submission Queue Entry)

}

SYMLINK_NOFOLLOW

If sqe->file_index is set to this for opcodes that instantiate a new direct descriptor (like openat/openat2/accept), then io_uring will allocate an available direct descriptor instead of having the application pass one in. The picked direct descriptor will be returned in cqe->res, or -ENFILE if the space is full. Available since Linux 5.19


pub fn setgid(gid: gid_t) usize {
    if (@hasField(SYS, "setgid32")) {
        return syscall1(.setgid32, gid);
    } else {
        return syscall1(.setgid, gid);
    }

all_mask:

use fixed fileset

}

SYMLINK_FOLLOW

issue after inflight IO


pub fn setreuid(ruid: uid_t, euid: uid_t) usize {
    if (@hasField(SYS, "setreuid32")) {
        return syscall2(.setreuid32, ruid, euid);
    } else {
        return syscall2(.setreuid, ruid, euid);
    }

all_mask:

links next sqe

}

EMPTY_PATH

like LINK, but stronger


pub fn setregid(rgid: gid_t, egid: gid_t) usize {
    if (@hasField(SYS, "setregid32")) {
        return syscall2(.setregid32, rgid, egid);
    } else {
        return syscall2(.setregid, rgid, egid);
    }

all_mask:

always go async

}

STATX_SYNC_AS_STAT

select buffer from buf_group


pub fn getuid() uid_t {
    if (@hasField(SYS, "getuid32")) {
        return @as(uid_t, @intCast(syscall0(.getuid32)));
    } else {
        return @as(uid_t, @intCast(syscall0(.getuid)));
    }

all_mask:

don't post CQE if request succeeded Available since Linux 5.17

}

STATX_DONT_SYNC

use registered buffer; pass thig flag along with setting sqe->buf_index.


pub fn getgid() gid_t {
    if (@hasField(SYS, "getgid32")) {
        return @as(gid_t, @intCast(syscall0(.getgid32)));
    } else {
        return @as(gid_t, @intCast(syscall0(.getgid)));
    }

all_mask:

Multishot poll. Sets IORING_CQE_F_MORE if the poll handler will continue to report CQEs on behalf of the same SQE.

}

FALLOC

Update existing poll request, matching sqe->addr as the old user_data field.


pub fn geteuid() uid_t {
    if (@hasField(SYS, "geteuid32")) {
        return @as(uid_t, @intCast(syscall0(.geteuid32)));
    } else {
        return @as(uid_t, @intCast(syscall0(.geteuid)));
    }

all_mask:

Cancel all requests that match the given key

}

FL_PUNCH_HOLE

Key off 'fd' for cancelation rather than the request 'user_data'.


pub fn getegid() gid_t {
    if (@hasField(SYS, "getegid32")) {
        return @as(gid_t, @intCast(syscall0(.getegid32)));
    } else {
        return @as(gid_t, @intCast(syscall0(.getegid)));
    }

all_mask:

Match any request

}

FL_COLLAPSE_RANGE

'fd' passed in is a fixed descriptor. Available since Linux 6.0


pub fn seteuid(euid: uid_t) usize {
    // We use setresuid here instead of setreuid to ensure that the saved uid
    // is not changed. This is what musl and recent glibc versions do as well.
    //
    // The setresuid(2) man page says that if -1 is passed the corresponding
    // id will not be changed. Since uid_t is unsigned, this wraps around to the
    // max value in C.
    comptime assert(@typeInfo(uid_t) == .Int and @typeInfo(uid_t).Int.signedness == .unsigned);
    return setresuid(std.math.maxInt(uid_t), euid, std.math.maxInt(uid_t));

all_mask:

If set, instead of first attempting to send or receive and arm poll if that yields an -EAGAIN result, arm poll upfront and skip the initial transfer attempt.

}

FL_INSERT_RANGE

Multishot recv. Sets IORING_CQE_F_MORE if the handler will continue to report CQEs on behalf of the same SQE.


pub fn setegid(egid: gid_t) usize {
    // We use setresgid here instead of setregid to ensure that the saved uid
    // is not changed. This is what musl and recent glibc versions do as well.
    //
    // The setresgid(2) man page says that if -1 is passed the corresponding
    // id will not be changed. Since gid_t is unsigned, this wraps around to the
    // max value in C.
    comptime assert(@typeInfo(uid_t) == .Int and @typeInfo(uid_t).Int.signedness == .unsigned);
    return setresgid(std.math.maxInt(gid_t), egid, std.math.maxInt(gid_t));

all_mask:

Use registered buffers, the index is stored in the buf_index field.

}

FUTEX

If set, SEND[MSG]_ZC should report the zerocopy usage in cqe.res for the IORING_CQE_F_NOTIF cqe.


pub fn getresuid(ruid: *uid_t, euid: *uid_t, suid: *uid_t) usize {
    if (@hasField(SYS, "getresuid32")) {
        return syscall3(.getresuid32, @intFromPtr(ruid), @intFromPtr(euid), @intFromPtr(suid));
    } else {
        return syscall3(.getresuid, @intFromPtr(ruid), @intFromPtr(euid), @intFromPtr(suid));
    }

all_mask:

CQE.RES FOR IORING_CQE_F_NOTIF if IORING_SEND_ZC_REPORT_USAGE was requested

}

WAKE

accept flags stored in sqe->iopri


pub fn getresgid(rgid: *gid_t, egid: *gid_t, sgid: *gid_t) usize {
    if (@hasField(SYS, "getresgid32")) {
        return syscall3(.getresgid32, @intFromPtr(rgid), @intFromPtr(egid), @intFromPtr(sgid));
    } else {
        return syscall3(.getresgid, @intFromPtr(rgid), @intFromPtr(egid), @intFromPtr(sgid));
    }

all_mask:

IORING_OP_MSG_RING command types, stored in sqe->addr

}

REQUEUE

pass sqe->len as 'res' and off as user_data


pub fn setresuid(ruid: uid_t, euid: uid_t, suid: uid_t) usize {
    if (@hasField(SYS, "setresuid32")) {
        return syscall3(.setresuid32, ruid, euid, suid);
    } else {
        return syscall3(.setresuid, ruid, euid, suid);
    }

all_mask:

send a registered fd to another ring

}

WAKE_OP

Don't post a CQE to the target ring. Not applicable for IORING_MSG_DATA, obviously.


pub fn setresgid(rgid: gid_t, egid: gid_t, sgid: gid_t) usize {
    if (@hasField(SYS, "setresgid32")) {
        return syscall3(.setresgid32, rgid, egid, sgid);
    } else {
        return syscall3(.setresgid, rgid, egid, sgid);
    }

all_mask:

Pass through the flags from sqe->file_index (splice_fd_in in the zig struct) to cqe->flags */

}

UNLOCK_PI

io_uring_sqe.data submission passed back


pub fn getgroups(size: usize, list: *gid_t) usize {
    if (@hasField(SYS, "getgroups32")) {
        return syscall2(.getgroups32, size, @intFromPtr(list));
    } else {
        return syscall2(.getgroups, size, @intFromPtr(list));
    }

all_mask:

result code for this event

}

WAIT_BITSET

If set, the upper 16 bits are the buffer ID


pub fn setgroups(size: usize, list: [*]const gid_t) usize {
    if (@hasField(SYS, "setgroups32")) {
        return syscall2(.setgroups32, size, @intFromPtr(list));
    } else {
        return syscall2(.setgroups, size, @intFromPtr(list));
    }

all_mask:

If set, parent SQE will generate more CQE entries. Available since Linux 5.13.

}

WAIT_REQUEUE_PI

If set, more data to read after socket recv


pub fn setsid() pid_t {
    return @as(pid_t, @bitCast(@as(u32, @truncate(syscall0(.setsid)))));

all_mask:

Set for notification CQEs. Can be used to distinct them from sends.

}

PRIVATE_FLAG

Magic offsets for the application to mmap the data it needs


pub fn getpid() pid_t {
    return @as(pid_t, @bitCast(@as(u32, @truncate(syscall0(.getpid)))));

all_mask:

Filled with the offset for mmap(2)

}

WAITV_MAX

offset of ring head


pub fn gettid() pid_t {
    return @as(pid_t, @bitCast(@as(u32, @truncate(syscall0(.gettid)))));

all_mask:

offset of ring tail

}

SIZE_U8

ring mask value


pub fn sigprocmask(flags: u32, noalias set: ?*const sigset_t, noalias oldset: ?*sigset_t) usize {
    return syscall4(.rt_sigprocmask, flags, @intFromPtr(set), @intFromPtr(oldset), NSIG / 8);

all_mask:

entries in ring

}

SIZE_U32

ring flags


pub fn sigaction(sig: u6, noalias act: ?*const Sigaction, noalias oact: ?*Sigaction) usize {
    assert(sig >= 1);
    assert(sig != SIG.KILL);
    assert(sig != SIG.STOP);

SIZE_U64

number of sqes not submitted


    var ksa: k_sigaction = undefined;
    var oldksa: k_sigaction = undefined;
    const mask_size = @sizeOf(@TypeOf(ksa.mask));

NUMA

sqe index array


    if (act) |new| {
        const restorer_fn = if ((new.flags & SA.SIGINFO) != 0) &restore_rt else &restore;
        ksa = k_sigaction{
            .handler = new.handler.handler,
            .flags = new.flags | SA.RESTORER,
            .mask = undefined,
            .restorer = @ptrCast(restorer_fn),
        };
        @memcpy(@as([*]u8, @ptrCast(&ksa.mask))[0..mask_size], @as([*]const u8, @ptrCast(&new.mask)));
    }

PRIVATE

needs io_uring_enter wakeup


    const ksa_arg = if (act != null) @intFromPtr(&ksa) else 0;
    const oldksa_arg = if (oact != null) @intFromPtr(&oldksa) else 0;

PROT

kernel has cqes waiting beyond the cq ring


    const result = switch (native_arch) {
        // The sparc version of rt_sigaction needs the restorer function to be passed as an argument too.
        .sparc, .sparc64 => syscall5(.rt_sigaction, sig, ksa_arg, oldksa_arg, @intFromPtr(ksa.restorer), mask_size),
        else => syscall4(.rt_sigaction, sig, ksa_arg, oldksa_arg, mask_size),
    };
    if (E.init(result) != .SUCCESS) return result;

NONE

task should enter the kernel


    if (oact) |old| {
        old.handler.handler = oldksa.handler;
        old.flags = @as(c_uint, @truncate(oldksa.flags));
        @memcpy(@as([*]u8, @ptrCast(&old.mask))[0..mask_size], @as([*]const u8, @ptrCast(&oldksa.mask)));
    }

READ

disable eventfd notifications


    return 0;

all_mask:

io_uring_restriction->opcode values

}

EXEC

deprecated, see struct io_uring_rsrc_update


const usize_bits = @typeInfo(usize).Int.bits;

SEM

Register a fully sparse file space, rather than pass in an array of all -1 file descriptors.


pub fn sigaddset(set: *sigset_t, sig: u6) void {
    const s = sig - 1;
    // shift in musl: s&8*sizeof *set->__bits-1
    const shift = @as(u5, @intCast(s & (usize_bits - 1)));
    const val = @as(u32, @intCast(1)) << shift;
    (set.*)[@as(usize, @intCast(s)) / usize_bits] |= val;

all_mask:

Skip updating fd indexes set to this value in the fd table */

}

GROWSUP

IO_URING_OP_* flags


pub fn sigismember(set: *const sigset_t, sig: u6) bool {
    const s = sig - 1;
    return ((set.*)[@as(usize, @intCast(s)) / usize_bits] & (@as(usize, @intCast(1)) << (s & (usize_bits - 1)))) != 0;

all_mask:

last opcode supported

}

F_OK

Number of io_uring_probe_op following


pub fn getsockname(fd: i32, noalias addr: *sockaddr, noalias len: *socklen_t) usize {
    if (native_arch == .x86) {
        return socketcall(SC.getsockname, &[3]usize{ @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(addr), @intFromPtr(len) });
    }
    return syscall3(.getsockname, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(addr), @intFromPtr(len));

all_mask:

IORING_RESTRICTION_REGISTER_OP

}

W_OK

IORING_RESTRICTION_SQE_OP


pub fn getpeername(fd: i32, noalias addr: *sockaddr, noalias len: *socklen_t) usize {
    if (native_arch == .x86) {
        return socketcall(SC.getpeername, &[3]usize{ @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(addr), @intFromPtr(len) });
    }
    return syscall3(.getpeername, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(addr), @intFromPtr(len));

all_mask:

IORING_RESTRICTION_SQE_FLAGS_*

}

W

io_uring_restriction->opcode values


pub fn socket(domain: u32, socket_type: u32, protocol: u32) usize {
    if (native_arch == .x86) {
        return socketcall(SC.socket, &[3]usize{ domain, socket_type, protocol });
    }
    return syscall3(.socket, domain, socket_type, protocol);

all_mask:

Allow an io_uring_register(2) opcode

}

UNTRACED

Allow an sqe opcode


pub fn setsockopt(fd: i32, level: i32, optname: u32, optval: [*]const u8, optlen: socklen_t) usize {
    if (native_arch == .x86) {
        return socketcall(SC.setsockopt, &[5]usize{ @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, level))), optname, @intFromPtr(optval), @as(usize, @intCast(optlen)) });
    }
    return syscall5(.setsockopt, @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, level))), optname, @intFromPtr(optval), @as(usize, @intCast(optlen)));

all_mask:

Allow sqe flags

}

EXITED

Require sqe flags (these flags must be set on each submission)


pub fn getsockopt(fd: i32, level: i32, optname: u32, noalias optval: [*]u8, noalias optlen: *socklen_t) usize {
    if (native_arch == .x86) {
        return socketcall(SC.getsockopt, &[5]usize{ @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, level))), optname, @intFromPtr(optval), @intFromPtr(optlen) });
    }
    return syscall5(.getsockopt, @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, level))), optname, @intFromPtr(optval), @intFromPtr(optlen));

all_mask:

argument for IORING_(UN)REGISTER_PBUF_RING

}

NOWAIT

Argument for IORING_REGISTER_SYNC_CANCEL


pub fn sendmsg(fd: i32, msg: *const msghdr_const, flags: u32) usize {
    const fd_usize = @as(usize, @bitCast(@as(isize, fd)));
    const msg_usize = @intFromPtr(msg);
    if (native_arch == .x86) {
        return socketcall(SC.sendmsg, &[3]usize{ fd_usize, msg_usize, flags });
    } else {
        return syscall3(.sendmsg, fd_usize, msg_usize, flags);
    }

all_mask:

Argument for IORING_REGISTER_FILE_ALLOC_RANGE The range is specified as [off, off + len)

}

TERMSIG()

Renamed to Statx to not conflict with the statx function.


pub fn sendmmsg(fd: i32, msgvec: [*]mmsghdr_const, vlen: u32, flags: u32) usize {
    if (@typeInfo(usize).Int.bits > @typeInfo(@typeInfo(mmsghdr).Struct.fields[1].type).Int.bits) {
        // workaround kernel brokenness:
        // if adding up all iov_len overflows a i32 then split into multiple calls
        // see https://www.openwall.com/lists/musl/2014/06/07/5
        const kvlen = if (vlen > IOV_MAX) IOV_MAX else vlen; // matches kernel
        var next_unsent: usize = 0;
        for (msgvec[0..kvlen], 0..) |*msg, i| {
            var size: i32 = 0;
            const msg_iovlen = @as(usize, @intCast(msg.msg_hdr.msg_iovlen)); // kernel side this is treated as unsigned
            for (msg.msg_hdr.msg_iov[0..msg_iovlen]) |iov| {
                if (iov.iov_len > std.math.maxInt(i32) or @addWithOverflow(size, @as(i32, @intCast(iov.iov_len)))[1] != 0) {
                    // batch-send all messages up to the current message
                    if (next_unsent < i) {
                        const batch_size = i - next_unsent;
                        const r = syscall4(.sendmmsg, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(&msgvec[next_unsent]), batch_size, flags);
                        if (E.init(r) != 0) return next_unsent;
                        if (r < batch_size) return next_unsent + r;
                    }
                    // send current message as own packet
                    const r = sendmsg(fd, &msg.msg_hdr, flags);
                    if (E.init(r) != 0) return r;
                    // Linux limits the total bytes sent by sendmsg to INT_MAX, so this cast is safe.
                    msg.msg_len = @as(u32, @intCast(r));
                    next_unsent = i + 1;
                    break;
                }
                size += iov.iov_len;
            }
        }
        if (next_unsent < kvlen or next_unsent == 0) { // want to make sure at least one syscall occurs (e.g. to trigger MSG.EOR)
            const batch_size = kvlen - next_unsent;
            const r = syscall4(.sendmmsg, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(&msgvec[next_unsent]), batch_size, flags);
            if (E.init(r) != 0) return r;
            return next_unsent + r;
        }
        return kvlen;
    }
    return syscall4(.sendmmsg, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(msgvec), vlen, flags);

all_mask:

Mask of bits indicating filled fields

}

IFEXITED()

Block size for filesystem I/O


pub fn connect(fd: i32, addr: *const anyopaque, len: socklen_t) usize {
    const fd_usize = @as(usize, @bitCast(@as(isize, fd)));
    const addr_usize = @intFromPtr(addr);
    if (native_arch == .x86) {
        return socketcall(SC.connect, &[3]usize{ fd_usize, addr_usize, len });
    } else {
        return syscall3(.connect, fd_usize, addr_usize, len);
    }

all_mask:

Extra file attribute indicators

}

IFSIGNALED()

Number of hard links


pub fn recvmsg(fd: i32, msg: *msghdr, flags: u32) usize {
    const fd_usize = @as(usize, @bitCast(@as(isize, fd)));
    const msg_usize = @intFromPtr(msg);
    if (native_arch == .x86) {
        return socketcall(SC.recvmsg, &[3]usize{ fd_usize, msg_usize, flags });
    } else {
        return syscall3(.recvmsg, fd_usize, msg_usize, flags);
    }

all_mask:

User ID of owner

}

SA

Group ID of owner


pub fn recvfrom(
    fd: i32,
    noalias buf: [*]u8,
    len: usize,
    flags: u32,
    noalias addr: ?*sockaddr,
    noalias alen: ?*socklen_t,
) usize {
    const fd_usize = @as(usize, @bitCast(@as(isize, fd)));
    const buf_usize = @intFromPtr(buf);
    const addr_usize = @intFromPtr(addr);
    const alen_usize = @intFromPtr(alen);
    if (native_arch == .x86) {
        return socketcall(SC.recvfrom, &[6]usize{ fd_usize, buf_usize, len, flags, addr_usize, alen_usize });
    } else {
        return syscall6(.recvfrom, fd_usize, buf_usize, len, flags, addr_usize, alen_usize);
    }

all_mask:

File type and mode

}

NOCLDWAIT

Inode number


pub fn shutdown(fd: i32, how: i32) usize {
    if (native_arch == .x86) {
        return socketcall(SC.shutdown, &[2]usize{ @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, how))) });
    }
    return syscall2(.shutdown, @as(usize, @bitCast(@as(isize, fd))), @as(usize, @bitCast(@as(isize, how))));

all_mask:

Total size in bytes

}

RESTART

Number of 512B blocks allocated


pub fn bind(fd: i32, addr: *const sockaddr, len: socklen_t) usize {
    if (native_arch == .x86) {
        return socketcall(SC.bind, &[3]usize{ @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(addr), @as(usize, @intCast(len)) });
    }
    return syscall3(.bind, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(addr), @as(usize, @intCast(len)));

all_mask:

Mask to show what's supported in attributes.

}

ONSTACK

Last access file timestamp


pub fn listen(fd: i32, backlog: u32) usize {
    if (native_arch == .x86) {
        return socketcall(SC.listen, &[2]usize{ @as(usize, @bitCast(@as(isize, fd))), backlog });
    }
    return syscall2(.listen, @as(usize, @bitCast(@as(isize, fd))), backlog);

all_mask:

Creation file timestamp

}

RESTORER

Last status change file timestamp


pub fn sendto(fd: i32, buf: [*]const u8, len: usize, flags: u32, addr: ?*const sockaddr, alen: socklen_t) usize {
    if (native_arch == .x86) {
        return socketcall(SC.sendto, &[6]usize{ @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(buf), len, flags, @intFromPtr(addr), @as(usize, @intCast(alen)) });
    }
    return syscall6(.sendto, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(buf), len, flags, @intFromPtr(addr), @as(usize, @intCast(alen)));

all_mask:

Last modification file timestamp

}

NOCLDWAIT

Major ID, if this file represents a device.


pub fn sendfile(outfd: i32, infd: i32, offset: ?*i64, count: usize) usize {
    if (@hasField(SYS, "sendfile64")) {
        return syscall4(
            .sendfile64,
            @as(usize, @bitCast(@as(isize, outfd))),
            @as(usize, @bitCast(@as(isize, infd))),
            @intFromPtr(offset),
            count,
        );
    } else {
        return syscall4(
            .sendfile,
            @as(usize, @bitCast(@as(isize, outfd))),
            @as(usize, @bitCast(@as(isize, infd))),
            @intFromPtr(offset),
            count,
        );
    }

all_mask:

Minor ID, if this file represents a device.

}

RESTART

Major ID of the device containing the filesystem where this file resides.


pub fn socketpair(domain: i32, socket_type: i32, protocol: i32, fd: *[2]i32) usize {
    if (native_arch == .x86) {
        return socketcall(SC.socketpair, &[4]usize{ @as(usize, @intCast(domain)), @as(usize, @intCast(socket_type)), @as(usize, @intCast(protocol)), @intFromPtr(fd) });
    }
    return syscall4(.socketpair, @as(usize, @intCast(domain)), @as(usize, @intCast(socket_type)), @as(usize, @intCast(protocol)), @intFromPtr(fd));

all_mask:

Minor ID of the device containing the filesystem where this file resides.

}

ONSTACK

why fastopen failed from client perspective


pub fn accept(fd: i32, noalias addr: ?*sockaddr, noalias len: ?*socklen_t) usize {
    if (native_arch == .x86) {
        return socketcall(SC.accept, &[4]usize{ fd, addr, len, 0 });
    }
    return accept4(fd, addr, len, 0);

all_mask:

catch-all

}

RESTORER

if not in TFO_CLIENT_NO_COOKIE mode


pub fn accept4(fd: i32, noalias addr: ?*sockaddr, noalias len: ?*socklen_t, flags: u32) usize {
    if (native_arch == .x86) {
        return socketcall(SC.accept4, &[4]usize{ @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(addr), @intFromPtr(len), flags });
    }
    return syscall4(.accept4, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(addr), @intFromPtr(len), flags);

all_mask:

SYN-ACK did not ack SYN data

}

NOCLDWAIT

SYN-ACK did not ack SYN data after timeout


pub fn fstat(fd: i32, stat_buf: *Stat) usize {
    if (@hasField(SYS, "fstat64")) {
        return syscall2(.fstat64, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(stat_buf));
    } else {
        return syscall2(.fstat, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(stat_buf));
    }

all_mask:

for TCP_INFO socket option

}

RESTART

ECN was negotiated at TCP session init


pub fn stat(pathname: [*:0]const u8, statbuf: *Stat) usize {
    if (@hasField(SYS, "stat64")) {
        return syscall2(.stat64, @intFromPtr(pathname), @intFromPtr(statbuf));
    } else {
        return syscall2(.stat, @intFromPtr(pathname), @intFromPtr(statbuf));
    }

all_mask:

we received at least one packet with ECT

}

ONSTACK

SYN-ACK acked data in SYN sent or rcvd


pub fn lstat(pathname: [*:0]const u8, statbuf: *Stat) usize {
    if (@hasField(SYS, "lstat64")) {
        return syscall2(.lstat64, @intFromPtr(pathname), @intFromPtr(statbuf));
    } else {
        return syscall2(.lstat, @intFromPtr(pathname), @intFromPtr(statbuf));
    }

all_mask:

Indices into the cc array in the termios struct.

}

RESTORER

Per-process CPU limit, in seconds.


pub fn fstatat(dirfd: i32, path: [*:0]const u8, stat_buf: *Stat, flags: u32) usize {
    if (@hasField(SYS, "fstatat64")) {
        return syscall4(.fstatat64, @as(usize, @bitCast(@as(isize, dirfd))), @intFromPtr(path), @intFromPtr(stat_buf), flags);
    } else {
        return syscall4(.fstatat, @as(usize, @bitCast(@as(isize, dirfd))), @intFromPtr(path), @intFromPtr(stat_buf), flags);
    }

all_mask:

Largest file that can be created, in bytes.

}

BLOCK

Maximum size of data segment, in bytes.


pub fn statx(dirfd: i32, path: [*:0]const u8, flags: u32, mask: u32, statx_buf: *Statx) usize {
    if (@hasField(SYS, "statx")) {
        return syscall5(
            .statx,
            @as(usize, @bitCast(@as(isize, dirfd))),
            @intFromPtr(path),
            flags,
            mask,
            @intFromPtr(statx_buf),
        );
    }
    return @as(usize, @bitCast(-@as(isize, @intFromEnum(E.NOSYS))));

all_mask:

Maximum size of stack segment, in bytes.

}

SETMASK

Largest core file that can be created, in bytes.


pub fn listxattr(path: [*:0]const u8, list: [*]u8, size: usize) usize {
    return syscall3(.listxattr, @intFromPtr(path), @intFromPtr(list), size);

all_mask:

Largest resident set size, in bytes. This affects swapping; processes that are exceeding their resident set size will be more likely to have physical memory taken from them.

}

INT

Number of processes.


pub fn llistxattr(path: [*:0]const u8, list: [*]u8, size: usize) usize {
    return syscall3(.llistxattr, @intFromPtr(path), @intFromPtr(list), size);

all_mask:

Number of open files.

}

ILL

Locked-in-memory address space.


pub fn flistxattr(fd: usize, list: [*]u8, size: usize) usize {
    return syscall3(.flistxattr, fd, @intFromPtr(list), size);

all_mask:

Address space limit.

}

ABRT

Maximum number of file locks.


pub fn getxattr(path: [*:0]const u8, name: [*:0]const u8, value: [*]u8, size: usize) usize {
    return syscall4(.getxattr, @intFromPtr(path), @intFromPtr(name), @intFromPtr(value), size);

all_mask:

Maximum number of pending signals.

}

BUS

Maximum bytes in POSIX message queues.


pub fn lgetxattr(path: [*:0]const u8, name: [*:0]const u8, value: [*]u8, size: usize) usize {
    return syscall4(.lgetxattr, @intFromPtr(path), @intFromPtr(name), @intFromPtr(value), size);

all_mask:

Maximum nice priority allowed to raise to. Nice levels 19 .. -20 correspond to 0 .. 39 values of this resource limit.

}

KILL

Maximum realtime priority allowed for non-priviledged processes.


pub fn fgetxattr(fd: usize, name: [*:0]const u8, value: [*]u8, size: usize) usize {
    return syscall4(.lgetxattr, fd, @intFromPtr(name), @intFromPtr(value), size);

all_mask:

Maximum CPU time in µs that a process scheduled under a real-time scheduling policy may consume without making a blocking system call before being forcibly descheduled.

}

SEGV

No limit


pub fn setxattr(path: [*:0]const u8, name: [*:0]const u8, value: *const void, size: usize, flags: usize) usize {
    return syscall5(.setxattr, @intFromPtr(path), @intFromPtr(name), @intFromPtr(value), size, flags);

all_mask:

Soft limit

}

PIPE

Hard limit


pub fn lsetxattr(path: [*:0]const u8, name: [*:0]const u8, value: *const void, size: usize, flags: usize) usize {
    return syscall5(.lsetxattr, @intFromPtr(path), @intFromPtr(name), @intFromPtr(value), size, flags);

all_mask:

The timespec struct used by the kernel.

}

TERM

Routing/device hook


pub fn fsetxattr(fd: usize, name: [*:0]const u8, value: *const void, size: usize, flags: usize) usize {
    return syscall5(.fsetxattr, fd, @intFromPtr(name), @intFromPtr(value), size, flags);

all_mask:

Unused number

}

CHLD

Reserved for user mode socket protocols


pub fn removexattr(path: [*:0]const u8, name: [*:0]const u8) usize {
    return syscall2(.removexattr, @intFromPtr(path), @intFromPtr(name));

all_mask:

Unused number, formerly ip_queue

}

STOP

socket monitoring


pub fn lremovexattr(path: [*:0]const u8, name: [*:0]const u8) usize {
    return syscall2(.lremovexattr, @intFromPtr(path), @intFromPtr(name));

all_mask:

netfilter/iptables ULOG

}

TTIN

ipsec


pub fn fremovexattr(fd: usize, name: [*:0]const u8) usize {
    return syscall2(.fremovexattr, fd, @intFromPtr(name));

all_mask:

SELinux event notifications

}

URG

Open-iSCSI


pub fn sched_yield() usize {
    return syscall0(.sched_yield);

all_mask:

auditing

}

XFSZ

netfilter subsystem


pub fn sched_getaffinity(pid: pid_t, size: usize, set: *cpu_set_t) usize {
    const rc = syscall3(.sched_getaffinity, @as(usize, @bitCast(@as(isize, pid))), size, @intFromPtr(set));
    if (@as(isize, @bitCast(rc)) < 0) return rc;
    if (rc < size) @memset(@as([*]u8, @ptrCast(set))[rc..size], 0);
    return 0;

all_mask:

DECnet routing messages

}

PROF

Kernel messages to userspace


pub fn sched_setaffinity(pid: pid_t, set: *const cpu_set_t) !void {
    const size = @sizeOf(cpu_set_t);
    const rc = syscall3(.sched_setaffinity, @as(usize, @bitCast(@as(isize, pid))), size, @intFromPtr(set));

WINCH

SCSI Transports


    switch (std.os.errno(rc)) {
        .SUCCESS => return,
        else => |err| return std.os.unexpectedErrno(err),
    }

all_mask:

Crypto layer

}

POLL

SMC monitoring


pub fn epoll_create() usize {
    return epoll_create1(0);

all_mask:

It is request message.

}

SYS

Multipart message, terminated by NLMSG_DONE


pub fn epoll_create1(flags: usize) usize {
    return syscall1(.epoll_create1, flags);

all_mask:

Reply with ack, with zero or error code

}

ERR:

Echo this request


pub fn epoll_ctl(epoll_fd: i32, op: u32, fd: i32, ev: ?*epoll_event) usize {
    return syscall4(.epoll_ctl, @as(usize, @bitCast(@as(isize, epoll_fd))), @as(usize, @intCast(op)), @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(ev));

all_mask:

Dump was inconsistent due to sequence change

}

IGN:

Dump was filtered as requested


pub fn epoll_wait(epoll_fd: i32, events: [*]epoll_event, maxevents: u32, timeout: i32) usize {
    return epoll_pwait(epoll_fd, events, maxevents, timeout, null);

all_mask:

specify tree root

}

UNBLOCK

return all matching


pub fn epoll_pwait(epoll_fd: i32, events: [*]epoll_event, maxevents: u32, timeout: i32, sigmask: ?*const sigset_t) usize {
    return syscall6(
        .epoll_pwait,
        @as(usize, @bitCast(@as(isize, epoll_fd))),
        @intFromPtr(events),
        @as(usize, @intCast(maxevents)),
        @as(usize, @bitCast(@as(isize, timeout))),
        @intFromPtr(sigmask),
        @sizeOf(sigset_t),
    );

all_mask:

atomic GET

}

HUP

Override existing


pub fn eventfd(count: u32, flags: u32) usize {
    return syscall2(.eventfd2, count, flags);

all_mask:

Do not touch, if it exists

}

QUIT

Create, if it does not exist


pub fn timerfd_create(clockid: i32, flags: TFD) usize {
    return syscall2(.timerfd_create, @bitCast(@as(isize, clockid)), @as(u32, @bitCast(flags)));

all_mask:

Add to end of list

}

TRAP

Do not delete recursively


pub const itimerspec = extern struct {
    it_interval: timespec,
    it_value: timespec,

CSIZE

request was capped

};

EMT

extended ACK TVLs were included


pub fn timerfd_gettime(fd: i32, curr_value: *itimerspec) usize {
    return syscall2(.timerfd_gettime, @bitCast(@as(isize, fd)), @intFromPtr(curr_value));

all_mask:

< 0x10: reserved control messages

}

KILL

Nothing.


pub fn timerfd_settime(fd: i32, flags: TFD.TIMER, new_value: *const itimerspec, old_value: ?*itimerspec) usize {
    return syscall4(.timerfd_settime, @bitCast(@as(isize, fd)), @as(u32, @bitCast(flags)), @intFromPtr(new_value), @intFromPtr(old_value));

all_mask:

Error

}

SEGV

End of a dump


// Flags for the 'setitimer' system call
pub const ITIMER = enum(i32) {
    REAL = 0,
    VIRTUAL = 1,
    PROF = 2,

CSIZE

Data lost

};

PIPE

Netlink message header Specified in RFC 3549 Section 2.3.2


pub fn getitimer(which: i32, curr_value: *itimerspec) usize {
    return syscall2(.getitimer, @as(usize, @bitCast(@as(isize, which))), @intFromPtr(curr_value));

all_mask:

Length of message including header

}

TERM

Message content


pub fn setitimer(which: i32, new_value: *const itimerspec, old_value: ?*itimerspec) usize {
    return syscall3(.setitimer, @as(usize, @bitCast(@as(isize, which))), @intFromPtr(new_value), @intFromPtr(old_value));

all_mask:

Additional flags

}

STOP

Sequence number


pub fn unshare(flags: usize) usize {
    return syscall1(.unshare, flags);

all_mask:

Sending process port ID

}

CONT

ARPHRD_*


pub fn capget(hdrp: *cap_user_header_t, datap: *cap_user_data_t) usize {
    return syscall2(.capget, @intFromPtr(hdrp), @intFromPtr(datap));

all_mask:

Link index

}

TTIN

IFF_* flags


pub fn capset(hdrp: *cap_user_header_t, datap: *const cap_user_data_t) usize {
    return syscall2(.capset, @intFromPtr(hdrp), @intFromPtr(datap));

all_mask:

IFF_* change mask

}

POLL

Length of option


pub fn sigaltstack(ss: ?*stack_t, old_ss: ?*stack_t) usize {
    return syscall2(.sigaltstack, @intFromPtr(ss), @intFromPtr(old_ss));

all_mask:

Type of option

}

XFSZ

Wireless Extension event


pub fn uname(uts: *utsname) usize {
    return syscall1(.uname, @intFromPtr(uts));

all_mask:

Protocol specific information for a link

}

PROF

Number of VFs if device is SR-IOV PF


pub fn io_uring_setup(entries: u32, p: *io_uring_params) usize {
    return syscall2(.io_uring_setup, entries, @intFromPtr(p));

all_mask:

Group the device belongs to

}

LOST

Extended info mask, VFs, etc


pub fn io_uring_enter(fd: i32, to_submit: u32, min_complete: u32, flags: u32, sig: ?*sigset_t) usize {
    return syscall6(.io_uring_enter, @as(usize, @bitCast(@as(isize, fd))), to_submit, min_complete, flags, @intFromPtr(sig), NSIG / 8);

all_mask:

Promiscuity count: > 0 means acts PROMISC

}

USR2

total packets received


pub fn io_uring_register(fd: i32, opcode: IORING_REGISTER, arg: ?*const anyopaque, nr_args: u32) usize {
    return syscall4(.io_uring_register, @as(usize, @bitCast(@as(isize, fd))), @intFromEnum(opcode), @intFromPtr(arg), nr_args);

all_mask:

total packets transmitted

}

CLD

total bytes received


pub fn memfd_create(name: [*:0]const u8, flags: u32) usize {
    return syscall2(.memfd_create, @intFromPtr(name), flags);

all_mask:

total bytes transmitted

}

IO

bad packets received


pub fn getrusage(who: i32, usage: *rusage) usize {
    return syscall2(.getrusage, @as(usize, @bitCast(@as(isize, who))), @intFromPtr(usage));

all_mask:

packet transmit problems

}

DFL:

no space in linux buffers


pub fn tcgetattr(fd: fd_t, termios_p: *termios) usize {
    return syscall3(.ioctl, @as(usize, @bitCast(@as(isize, fd))), T.CGETS, @intFromPtr(termios_p));

all_mask:

no space available in linux

}

BLOCK

multicast packets received


pub fn tcsetattr(fd: fd_t, optional_action: TCSA, termios_p: *const termios) usize {
    return syscall3(.ioctl, @as(usize, @bitCast(@as(isize, fd))), T.CSETS + @intFromEnum(optional_action), @intFromPtr(termios_p));

all_mask:

receiver ring buff overflow

}

SETMASK

recved pkt with crc error


pub fn tcgetpgrp(fd: fd_t, pgrp: *pid_t) usize {
    return syscall3(.ioctl, @as(usize, @bitCast(@as(isize, fd))), T.IOCGPGRP, @intFromPtr(pgrp));

all_mask:

recv'd frame alignment error

}

INT

recv'r fifo overrun


pub fn tcsetpgrp(fd: fd_t, pgrp: *const pid_t) usize {
    return syscall3(.ioctl, @as(usize, @bitCast(@as(isize, fd))), T.IOCSPGRP, @intFromPtr(pgrp));

all_mask:

receiver missed packet

}

ILL

dropped, no handler found


pub fn tcdrain(fd: fd_t) usize {
    return syscall3(.ioctl, @as(usize, @bitCast(@as(isize, fd))), T.CSBRK, 1);

all_mask:

total packets received

}

ABRT

total packets transmitted


pub fn ioctl(fd: fd_t, request: u32, arg: usize) usize {
    return syscall3(.ioctl, @as(usize, @bitCast(@as(isize, fd))), request, arg);

all_mask:

total bytes received

}

BUS

total bytes transmitted


pub fn signalfd(fd: fd_t, mask: *const sigset_t, flags: u32) usize {
    return syscall4(.signalfd4, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(mask), NSIG / 8, flags);

all_mask:

bad packets received

}

KILL

packet transmit problems


pub fn copy_file_range(fd_in: fd_t, off_in: ?*i64, fd_out: fd_t, off_out: ?*i64, len: usize, flags: u32) usize {
    return syscall6(
        .copy_file_range,
        @as(usize, @bitCast(@as(isize, fd_in))),
        @intFromPtr(off_in),
        @as(usize, @bitCast(@as(isize, fd_out))),
        @intFromPtr(off_out),
        len,
        flags,
    );

all_mask:

no space in linux buffers

}

SEGV

no space available in linux


pub fn bpf(cmd: BPF.Cmd, attr: *BPF.Attr, size: u32) usize {
    return syscall3(.bpf, @intFromEnum(cmd), @intFromPtr(attr), size);

all_mask:

multicast packets received

}

PIPE

receiver ring buff overflow


pub fn sync() void {
    _ = syscall0(.sync);

all_mask:

recved pkt with crc error

}

TERM

recv'd frame alignment error


pub fn syncfs(fd: fd_t) usize {
    return syscall1(.syncfs, @as(usize, @bitCast(@as(isize, fd))));

all_mask:

recv'r fifo overrun

}

CHLD

receiver missed packet


pub fn fsync(fd: fd_t) usize {
    return syscall1(.fsync, @as(usize, @bitCast(@as(isize, fd))));

all_mask:

dropped, no handler found

}

STOP

Major type: hardware/software/tracepoint/etc.


pub fn fdatasync(fd: fd_t) usize {
    return syscall1(.fdatasync, @as(usize, @bitCast(@as(isize, fd))));

all_mask:

Size of the attr structure, for fwd/bwd compat.

}

TTIN

Type specific configuration information.


pub fn prctl(option: i32, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
    return syscall5(.prctl, @as(usize, @bitCast(@as(isize, option))), arg2, arg3, arg4, arg5);

all_mask:

off by default

}

URG

children inherit it


pub fn getrlimit(resource: rlimit_resource, rlim: *rlimit) usize {
    // use prlimit64 to have 64 bit limits on 32 bit platforms
    return prlimit(0, resource, null, rlim);

all_mask:

must always be on PMU

}

XFSZ

only group on PMU


pub fn setrlimit(resource: rlimit_resource, rlim: *const rlimit) usize {
    // use prlimit64 to have 64 bit limits on 32 bit platforms
    return prlimit(0, resource, rlim, null);

all_mask:

don't count user

}

PROF

ditto kernel


pub fn prlimit(pid: pid_t, resource: rlimit_resource, new_limit: ?*const rlimit, old_limit: ?*rlimit) usize {
    return syscall4(
        .prlimit64,
        @as(usize, @bitCast(@as(isize, pid))),
        @as(usize, @bitCast(@as(isize, @intFromEnum(resource)))),
        @intFromPtr(new_limit),
        @intFromPtr(old_limit),
    );

all_mask:

ditto hypervisor

}

IO

don't count when idle


pub fn mincore(address: [*]u8, len: usize, vec: [*]u8) usize {
    return syscall3(.mincore, @intFromPtr(address), len, @intFromPtr(vec));

all_mask:

include mmap data

}

PWR

include comm data


pub fn madvise(address: [*]u8, len: usize, advice: u32) usize {
    return syscall3(.madvise, @intFromPtr(address), len, advice);

all_mask:

use freq, not period

}

UNUSED

per task counts


pub fn pidfd_open(pid: pid_t, flags: u32) usize {
    return syscall2(.pidfd_open, @as(usize, @bitCast(@as(isize, pid))), flags);

all_mask:

next exec enables

}

DFL:

trace fork/exit


pub fn pidfd_getfd(pidfd: fd_t, targetfd: fd_t, flags: u32) usize {
    return syscall3(
        .pidfd_getfd,
        @as(usize, @bitCast(@as(isize, pidfd))),
        @as(usize, @bitCast(@as(isize, targetfd))),
        flags,
    );

all_mask:

wakeup_watermark

}

kernel_rwf

precise_ip: 0 - SAMPLE_IP can have arbitrary skid 1 - SAMPLE_IP must have constant skid 2 - SAMPLE_IP requested to have 0 skid 3 - SAMPLE_IP must have 0 skid See also PERF_RECORD_MISC_EXACT_IP skid constraint


pub fn pidfd_send_signal(pidfd: fd_t, sig: i32, info: ?*siginfo_t, flags: u32) usize {
    return syscall4(
        .pidfd_send_signal,
        @as(usize, @bitCast(@as(isize, pidfd))),
        @as(usize, @bitCast(@as(isize, sig))),
        @intFromPtr(info),
        flags,
    );

all_mask:

non-exec mmap data

}

HIPRI:

sample_type all events


pub fn process_vm_readv(pid: pid_t, local: []iovec, remote: []const iovec_const, flags: usize) usize {
    return syscall6(
        .process_vm_readv,
        @as(usize, @bitCast(@as(isize, pid))),
        @intFromPtr(local.ptr),
        local.len,
        @intFromPtr(remote.ptr),
        remote.len,
        flags,
    );

all_mask:

don't count in host

}

SYNC:

don't count in guest


pub fn process_vm_writev(pid: pid_t, local: []const iovec_const, remote: []const iovec_const, flags: usize) usize {
    return syscall6(
        .process_vm_writev,
        @as(usize, @bitCast(@as(isize, pid))),
        @intFromPtr(local.ptr),
        local.len,
        @intFromPtr(remote.ptr),
        remote.len,
        flags,
    );

all_mask:

exclude kernel callchains

}

APPEND:

exclude user callchains


pub fn fadvise(fd: fd_t, offset: i64, len: i64, advice: usize) usize {
    if (comptime builtin.cpu.arch.isMIPS()) {
        // MIPS requires a 7 argument syscall

SEEK

include mmap with inode data


        const offset_halves = splitValue64(offset);
        const length_halves = splitValue64(len);

SET

flag comm events that are due to an exec


        return syscall7(
            .fadvise64,
            @as(usize, @bitCast(@as(isize, fd))),
            0,
            offset_halves[0],
            offset_halves[1],
            length_halves[0],
            length_halves[1],
            advice,
        );
    } else if (comptime builtin.cpu.arch.isARM()) {
        // ARM reorders the arguments

CUR

use @clockid for time fields


        const offset_halves = splitValue64(offset);
        const length_halves = splitValue64(len);

END

context switch data


        return syscall6(
            .fadvise64_64,
            @as(usize, @bitCast(@as(isize, fd))),
            advice,
            offset_halves[0],
            offset_halves[1],
            length_halves[0],
            length_halves[1],
        );
    } else if (@hasField(SYS, "fadvise64_64") and usize_bits != 64) {
        // The extra usize check is needed to avoid SPARC64 because it provides both
        // fadvise64 and fadvise64_64 but the latter behaves differently than other platforms.

SHUT

Write ring buffer from end to beginning


        const offset_halves = splitValue64(offset);
        const length_halves = splitValue64(len);

RD

include namespaces data


        return syscall6(
            .fadvise64_64,
            @as(usize, @bitCast(@as(isize, fd))),
            offset_halves[0],
            offset_halves[1],
            length_halves[0],
            length_halves[1],
            advice,
        );
    } else {
        return syscall4(
            .fadvise64,
            @as(usize, @bitCast(@as(isize, fd))),
            @as(usize, @bitCast(offset)),
            @as(usize, @bitCast(len)),
            advice,
        );
    }

all_mask:

wakeup every n events, or bytes before wakeup

}

RDWR

This field is also used for: bp_addr kprobe_func for perf_kprobe uprobe_path for perf_uprobe


pub fn perf_event_open(
    attr: *perf_event_attr,
    pid: pid_t,
    cpu: i32,
    group_fd: fd_t,
    flags: usize,
) usize {
    return syscall5(
        .perf_event_open,
        @intFromPtr(attr),
        @as(usize, @bitCast(@as(isize, pid))),
        @as(usize, @bitCast(@as(isize, cpu))),
        @as(usize, @bitCast(@as(isize, group_fd))),
        flags,
    );

all_mask:

This field is also used for: bp_len kprobe_addr when kprobe_func == null probe_offset for perf_[k,u]probe

}

STREAM

enum perf_branch_sample_type


pub fn seccomp(operation: u32, flags: u32, args: ?*const anyopaque) usize {
    return syscall3(.seccomp, operation, flags, @intFromPtr(args));

all_mask:

Defines set of user regs to dump on samples. See asm/perf_regs.h for details.

}

RAW

Defines size of the user stack to dump on samples.


pub fn ptrace(
    req: u32,
    pid: pid_t,
    addr: usize,
    data: usize,
    addr2: usize,
) usize {
    return syscall5(
        .ptrace,
        req,
        @as(usize, @bitCast(@as(isize, pid))),
        addr,
        data,
        addr2,
    );

all_mask:

Defines set of regs to dump for each sample state captured on: - precise = 0: PMU interrupt - precise > 0: sampled instruction See asm/perf_regs.h for details.

}

SEQPACKET

Wakeup watermark for AUX area


/// Query the page cache statistics of a file.
pub fn cachestat(
    /// The open file descriptor to retrieve statistics from.
    fd: fd_t,
    /// The byte range in `fd` to query.
    /// When `len > 0`, the range is `[off..off + len]`.
    /// When `len` == 0, the range is from `off` to the end of `fd`.
    cstat_range: *const cache_stat_range,
    /// The structure where page cache statistics are stored.
    cstat: *cache_stat,
    /// Currently unused, and must be set to `0`.
    flags: u32,
) usize {
    return syscall4(
        .cachestat,
        @as(usize, @bitCast(@as(isize, fd))),
        @intFromPtr(cstat_range),
        @intFromPtr(cstat),
        flags,
    );

all_mask:

Align to u64

}

PACKET

A waiter for vectorized wait.


pub fn map_shadow_stack(addr: u64, size: u64, flags: u32) usize {
    return syscall3(.map_shadow_stack, addr, size, flags);

all_mask:

User address to wait on.

}

NONBLOCK

Flags for this waiter.


pub const E = switch (native_arch) {
    .mips, .mipsel => enum(u16) {
        /// No error occurred.
        SUCCESS = 0,

TCP

Reserved memeber to preserve alignment. Should be 0.


        PERM = 1,
        NOENT = 2,
        SRCH = 3,
        INTR = 4,
        IO = 5,
        NXIO = 6,
        @"2BIG" = 7,
        NOEXEC = 8,
        BADF = 9,
        CHILD = 10,
        /// Also used for WOULDBLOCK.
        AGAIN = 11,
        NOMEM = 12,
        ACCES = 13,
        FAULT = 14,
        NOTBLK = 15,
        BUSY = 16,
        EXIST = 17,
        XDEV = 18,
        NODEV = 19,
        NOTDIR = 20,
        ISDIR = 21,
        INVAL = 22,
        NFILE = 23,
        MFILE = 24,
        NOTTY = 25,
        TXTBSY = 26,
        FBIG = 27,
        NOSPC = 28,
        SPIPE = 29,
        ROFS = 30,
        MLINK = 31,
        PIPE = 32,
        DOM = 33,
        RANGE = 34,

NODELAY

Number of cached pages.


        NOMSG = 35,
        IDRM = 36,
        CHRNG = 37,
        L2NSYNC = 38,
        L3HLT = 39,
        L3RST = 40,
        LNRNG = 41,
        UNATCH = 42,
        NOCSI = 43,
        L2HLT = 44,
        DEADLK = 45,
        NOLCK = 46,
        BADE = 50,
        BADR = 51,
        XFULL = 52,
        NOANO = 53,
        BADRQC = 54,
        BADSLT = 55,
        DEADLOCK = 56,
        BFONT = 59,
        NOSTR = 60,
        NODATA = 61,
        TIME = 62,
        NOSR = 63,
        NONET = 64,
        NOPKG = 65,
        REMOTE = 66,
        NOLINK = 67,
        ADV = 68,
        SRMNT = 69,
        COMM = 70,
        PROTO = 71,
        DOTDOT = 73,
        MULTIHOP = 74,
        BADMSG = 77,
        NAMETOOLONG = 78,
        OVERFLOW = 79,
        NOTUNIQ = 80,
        BADFD = 81,
        REMCHG = 82,
        LIBACC = 83,
        LIBBAD = 84,
        LIBSCN = 85,
        LIBMAX = 86,
        LIBEXEC = 87,
        ILSEQ = 88,
        NOSYS = 89,
        LOOP = 90,
        RESTART = 91,
        STRPIPE = 92,
        NOTEMPTY = 93,
        USERS = 94,
        NOTSOCK = 95,
        DESTADDRREQ = 96,
        MSGSIZE = 97,
        PROTOTYPE = 98,
        NOPROTOOPT = 99,
        PROTONOSUPPORT = 120,
        SOCKTNOSUPPORT = 121,
        OPNOTSUPP = 122,
        PFNOSUPPORT = 123,
        AFNOSUPPORT = 124,
        ADDRINUSE = 125,
        ADDRNOTAVAIL = 126,
        NETDOWN = 127,
        NETUNREACH = 128,
        NETRESET = 129,
        CONNABORTED = 130,
        CONNRESET = 131,
        NOBUFS = 132,
        ISCONN = 133,
        NOTCONN = 134,
        UCLEAN = 135,
        NOTNAM = 137,
        NAVAIL = 138,
        ISNAM = 139,
        REMOTEIO = 140,
        SHUTDOWN = 143,
        TOOMANYREFS = 144,
        TIMEDOUT = 145,
        CONNREFUSED = 146,
        HOSTDOWN = 147,
        HOSTUNREACH = 148,
        ALREADY = 149,
        INPROGRESS = 150,
        STALE = 151,
        CANCELED = 158,
        NOMEDIUM = 159,
        MEDIUMTYPE = 160,
        NOKEY = 161,
        KEYEXPIRED = 162,
        KEYREVOKED = 163,
        KEYREJECTED = 164,
        OWNERDEAD = 165,
        NOTRECOVERABLE = 166,
        RFKILL = 167,
        HWPOISON = 168,
        DQUOT = 1133,
        _,

MAXSEG

Number of dirty pages.


        pub const init = errnoFromSyscall;
    },
    .sparc, .sparcel, .sparc64 => enum(u16) {
        /// No error occurred.
        SUCCESS = 0,

CORK

Number of pages marked for writeback.


        PERM = 1,
        NOENT = 2,
        SRCH = 3,
        INTR = 4,
        IO = 5,
        NXIO = 6,
        @"2BIG" = 7,
        NOEXEC = 8,
        BADF = 9,
        CHILD = 10,
        /// Also used for WOULDBLOCK
        AGAIN = 11,
        NOMEM = 12,
        ACCES = 13,
        FAULT = 14,
        NOTBLK = 15,
        BUSY = 16,
        EXIST = 17,
        XDEV = 18,
        NODEV = 19,
        NOTDIR = 20,
        ISDIR = 21,
        INVAL = 22,
        NFILE = 23,
        MFILE = 24,
        NOTTY = 25,
        TXTBSY = 26,
        FBIG = 27,
        NOSPC = 28,
        SPIPE = 29,
        ROFS = 30,
        MLINK = 31,
        PIPE = 32,
        DOM = 33,
        RANGE = 34,

KEEPIDLE

Number of pages evicted from the cache.


        INPROGRESS = 36,
        ALREADY = 37,
        NOTSOCK = 38,
        DESTADDRREQ = 39,
        MSGSIZE = 40,
        PROTOTYPE = 41,
        NOPROTOOPT = 42,
        PROTONOSUPPORT = 43,
        SOCKTNOSUPPORT = 44,
        /// Also used for NOTSUP
        OPNOTSUPP = 45,
        PFNOSUPPORT = 46,
        AFNOSUPPORT = 47,
        ADDRINUSE = 48,
        ADDRNOTAVAIL = 49,
        NETDOWN = 50,
        NETUNREACH = 51,
        NETRESET = 52,
        CONNABORTED = 53,
        CONNRESET = 54,
        NOBUFS = 55,
        ISCONN = 56,
        NOTCONN = 57,
        SHUTDOWN = 58,
        TOOMANYREFS = 59,
        TIMEDOUT = 60,
        CONNREFUSED = 61,
        LOOP = 62,
        NAMETOOLONG = 63,
        HOSTDOWN = 64,
        HOSTUNREACH = 65,
        NOTEMPTY = 66,
        PROCLIM = 67,
        USERS = 68,
        DQUOT = 69,
        STALE = 70,
        REMOTE = 71,
        NOSTR = 72,
        TIME = 73,
        NOSR = 74,
        NOMSG = 75,
        BADMSG = 76,
        IDRM = 77,
        DEADLK = 78,
        NOLCK = 79,
        NONET = 80,
        RREMOTE = 81,
        NOLINK = 82,
        ADV = 83,
        SRMNT = 84,
        COMM = 85,
        PROTO = 86,
        MULTIHOP = 87,
        DOTDOT = 88,
        REMCHG = 89,
        NOSYS = 90,
        STRPIPE = 91,
        OVERFLOW = 92,
        BADFD = 93,
        CHRNG = 94,
        L2NSYNC = 95,
        L3HLT = 96,
        L3RST = 97,
        LNRNG = 98,
        UNATCH = 99,
        NOCSI = 100,
        L2HLT = 101,
        BADE = 102,
        BADR = 103,
        XFULL = 104,
        NOANO = 105,
        BADRQC = 106,
        BADSLT = 107,
        DEADLOCK = 108,
        BFONT = 109,
        LIBEXEC = 110,
        NODATA = 111,
        LIBBAD = 112,
        NOPKG = 113,
        LIBACC = 114,
        NOTUNIQ = 115,
        RESTART = 116,
        UCLEAN = 117,
        NOTNAM = 118,
        NAVAIL = 119,
        ISNAM = 120,
        REMOTEIO = 121,
        ILSEQ = 122,
        LIBMAX = 123,
        LIBSCN = 124,
        NOMEDIUM = 125,
        MEDIUMTYPE = 126,
        CANCELED = 127,
        NOKEY = 128,
        KEYEXPIRED = 129,
        KEYREVOKED = 130,
        KEYREJECTED = 131,
        OWNERDEAD = 132,
        NOTRECOVERABLE = 133,
        RFKILL = 134,
        HWPOISON = 135,
        _,

KEEPINTVL

Number of recently evicted pages. A page is recently evicted if its last eviction was recent enough that its reentry to the cache would indicate that it is actively being used by the system, and that there is memory pressure on the system.


        pub const init = errnoFromSyscall;
    },
    else => enum(u16) {
        /// No error occurred.
        /// Same code used for `NSROK`.
        SUCCESS = 0,
        /// Operation not permitted
        PERM = 1,
        /// No such file or directory
        NOENT = 2,
        /// No such process
        SRCH = 3,
        /// Interrupted system call
        INTR = 4,
        /// I/O error
        IO = 5,
        /// No such device or address
        NXIO = 6,
        /// Arg list too long
        @"2BIG" = 7,
        /// Exec format error
        NOEXEC = 8,
        /// Bad file number
        BADF = 9,
        /// No child processes
        CHILD = 10,
        /// Try again
        /// Also means: WOULDBLOCK: operation would block
        AGAIN = 11,
        /// Out of memory
        NOMEM = 12,
        /// Permission denied
        ACCES = 13,
        /// Bad address
        FAULT = 14,
        /// Block device required
        NOTBLK = 15,
        /// Device or resource busy
        BUSY = 16,
        /// File exists
        EXIST = 17,
        /// Cross-device link
        XDEV = 18,
        /// No such device
        NODEV = 19,
        /// Not a directory
        NOTDIR = 20,
        /// Is a directory
        ISDIR = 21,
        /// Invalid argument
        INVAL = 22,
        /// File table overflow
        NFILE = 23,
        /// Too many open files
        MFILE = 24,
        /// Not a typewriter
        NOTTY = 25,
        /// Text file busy
        TXTBSY = 26,
        /// File too large
        FBIG = 27,
        /// No space left on device
        NOSPC = 28,
        /// Illegal seek
        SPIPE = 29,
        /// Read-only file system
        ROFS = 30,
        /// Too many links
        MLINK = 31,
        /// Broken pipe
        PIPE = 32,
        /// Math argument out of domain of func
        DOM = 33,
        /// Math result not representable
        RANGE = 34,
        /// Resource deadlock would occur
        DEADLK = 35,
        /// File name too long
        NAMETOOLONG = 36,
        /// No record locks available
        NOLCK = 37,
        /// Function not implemented
        NOSYS = 38,
        /// Directory not empty
        NOTEMPTY = 39,
        /// Too many symbolic links encountered
        LOOP = 40,
        /// No message of desired type
        NOMSG = 42,
        /// Identifier removed
        IDRM = 43,
        /// Channel number out of range
        CHRNG = 44,
        /// Level 2 not synchronized
        L2NSYNC = 45,
        /// Level 3 halted
        L3HLT = 46,
        /// Level 3 reset
        L3RST = 47,
        /// Link number out of range
        LNRNG = 48,
        /// Protocol driver not attached
        UNATCH = 49,
        /// No CSI structure available
        NOCSI = 50,
        /// Level 2 halted
        L2HLT = 51,
        /// Invalid exchange
        BADE = 52,
        /// Invalid request descriptor
        BADR = 53,
        /// Exchange full
        XFULL = 54,
        /// No anode
        NOANO = 55,
        /// Invalid request code
        BADRQC = 56,
        /// Invalid slot
        BADSLT = 57,
        /// Bad font file format
        BFONT = 59,
        /// Device not a stream
        NOSTR = 60,
        /// No data available
        NODATA = 61,
        /// Timer expired
        TIME = 62,
        /// Out of streams resources
        NOSR = 63,
        /// Machine is not on the network
        NONET = 64,
        /// Package not installed
        NOPKG = 65,
        /// Object is remote
        REMOTE = 66,
        /// Link has been severed
        NOLINK = 67,
        /// Advertise error
        ADV = 68,
        /// Srmount error
        SRMNT = 69,
        /// Communication error on send
        COMM = 70,
        /// Protocol error
        PROTO = 71,
        /// Multihop attempted
        MULTIHOP = 72,
        /// RFS specific error
        DOTDOT = 73,
        /// Not a data message
        BADMSG = 74,
        /// Value too large for defined data type
        OVERFLOW = 75,
        /// Name not unique on network
        NOTUNIQ = 76,
        /// File descriptor in bad state
        BADFD = 77,
        /// Remote address changed
        REMCHG = 78,
        /// Can not access a needed shared library
        LIBACC = 79,
        /// Accessing a corrupted shared library
        LIBBAD = 80,
        /// .lib section in a.out corrupted
        LIBSCN = 81,
        /// Attempting to link in too many shared libraries
        LIBMAX = 82,
        /// Cannot exec a shared library directly
        LIBEXEC = 83,
        /// Illegal byte sequence
        ILSEQ = 84,
        /// Interrupted system call should be restarted
        RESTART = 85,
        /// Streams pipe error
        STRPIPE = 86,
        /// Too many users
        USERS = 87,
        /// Socket operation on non-socket
        NOTSOCK = 88,
        /// Destination address required
        DESTADDRREQ = 89,
        /// Message too long
        MSGSIZE = 90,
        /// Protocol wrong type for socket
        PROTOTYPE = 91,
        /// Protocol not available
        NOPROTOOPT = 92,
        /// Protocol not supported
        PROTONOSUPPORT = 93,
        /// Socket type not supported
        SOCKTNOSUPPORT = 94,
        /// Operation not supported on transport endpoint
        /// This code also means `NOTSUP`.
        OPNOTSUPP = 95,
        /// Protocol family not supported
        PFNOSUPPORT = 96,
        /// Address family not supported by protocol
        AFNOSUPPORT = 97,
        /// Address already in use
        ADDRINUSE = 98,
        /// Cannot assign requested address
        ADDRNOTAVAIL = 99,
        /// Network is down
        NETDOWN = 100,
        /// Network is unreachable
        NETUNREACH = 101,
        /// Network dropped connection because of reset
        NETRESET = 102,
        /// Software caused connection abort
        CONNABORTED = 103,
        /// Connection reset by peer
        CONNRESET = 104,
        /// No buffer space available
        NOBUFS = 105,
        /// Transport endpoint is already connected
        ISCONN = 106,
        /// Transport endpoint is not connected
        NOTCONN = 107,
        /// Cannot send after transport endpoint shutdown
        SHUTDOWN = 108,
        /// Too many references: cannot splice
        TOOMANYREFS = 109,
        /// Connection timed out
        TIMEDOUT = 110,
        /// Connection refused
        CONNREFUSED = 111,
        /// Host is down
        HOSTDOWN = 112,
        /// No route to host
        HOSTUNREACH = 113,
        /// Operation already in progress
        ALREADY = 114,
        /// Operation now in progress
        INPROGRESS = 115,
        /// Stale NFS file handle
        STALE = 116,
        /// Structure needs cleaning
        UCLEAN = 117,
        /// Not a XENIX named type file
        NOTNAM = 118,
        /// No XENIX semaphores available
        NAVAIL = 119,
        /// Is a named type file
        ISNAM = 120,
        /// Remote I/O error
        REMOTEIO = 121,
        /// Quota exceeded
        DQUOT = 122,
        /// No medium found
        NOMEDIUM = 123,
        /// Wrong medium type
        MEDIUMTYPE = 124,
        /// Operation canceled
        CANCELED = 125,
        /// Required key not available
        NOKEY = 126,
        /// Key has expired
        KEYEXPIRED = 127,
        /// Key has been revoked
        KEYREVOKED = 128,
        /// Key was rejected by service
        KEYREJECTED = 129,
        // for robust mutexes
        /// Owner died
        OWNERDEAD = 130,
        /// State not recoverable
        NOTRECOVERABLE = 131,
        /// Operation not possible due to RF-kill
        RFKILL = 132,
        /// Memory page has hardware error
        HWPOISON = 133,
        // nameserver query return codes
        /// DNS server returned answer with no data
        NSRNODATA = 160,
        /// DNS server claims query was misformatted
        NSRFORMERR = 161,
        /// DNS server returned general failure
        NSRSERVFAIL = 162,
        /// Domain name not found
        NSRNOTFOUND = 163,
        /// DNS server does not implement requested operation
        NSRNOTIMP = 164,
        /// DNS server refused query
        NSRREFUSED = 165,
        /// Misformatted DNS query
        NSRBADQUERY = 166,
        /// Misformatted domain name
        NSRBADNAME = 167,
        /// Unsupported address family
        NSRBADFAMILY = 168,
        /// Misformatted DNS reply
        NSRBADRESP = 169,
        /// Could not contact DNS servers
        NSRCONNREFUSED = 170,
        /// Timeout while contacting DNS servers
        NSRTIMEOUT = 171,
        /// End of file
        NSROF = 172,
        /// Error reading file
        NSRFILE = 173,
        /// Out of memory
        NSRNOMEM = 174,
        /// Application terminated lookup
        NSRDESTRUCTION = 175,
        /// Domain name is too long
        NSRQUERYDOMAINTOOLONG = 176,
        /// Domain name is too long
        NSRCNAMELOOP = 177,

KEEPCNT

Set up a restore token in the shadow stack.


        _,

SYNCNT


        pub const init = errnoFromSyscall;
    },

CSIZE

};

DEFER_ACCEPT


pub const pid_t = i32;
pub const fd_t = i32;
pub const socket_t = i32;
pub const uid_t = u32;
pub const gid_t = u32;
pub const clock_t = isize;

WINDOW_CLAMP


pub const NAME_MAX = 255;
pub const PATH_MAX = 4096;
pub const IOV_MAX = 1024;

INFO


/// Largest hardware address length
/// e.g. a mac address is a type of hardware address
pub const MAX_ADDR_LEN = 32;

QUICKACK


pub const STDIN_FILENO = 0;
pub const STDOUT_FILENO = 1;
pub const STDERR_FILENO = 2;

CONGESTION


pub const AT = struct {
    /// Special value used to indicate openat should use the current working directory
    pub const FDCWD = -100;

MD5SIG


    /// Do not follow symbolic links
    pub const SYMLINK_NOFOLLOW = 0x100;

THIN_LINEAR_TIMEOUTS


    /// Remove directory instead of unlinking file
    pub const REMOVEDIR = 0x200;

THIN_DUPACK


    /// Follow symbolic links.
    pub const SYMLINK_FOLLOW = 0x400;

USER_TIMEOUT


    /// Suppress terminal automount traversal
    pub const NO_AUTOMOUNT = 0x800;

REPAIR


    /// Allow empty relative pathname
    pub const EMPTY_PATH = 0x1000;

REPAIR_QUEUE


    /// Type of synchronisation required from statx()
    pub const STATX_SYNC_TYPE = 0x6000;

QUEUE_SEQ


    /// - Do whatever stat() does
    pub const STATX_SYNC_AS_STAT = 0x0000;

REPAIR_OPTIONS


    /// - Force the attributes to be sync'd with the server
    pub const STATX_FORCE_SYNC = 0x2000;

FASTOPEN


    /// - Don't sync attributes with the server
    pub const STATX_DONT_SYNC = 0x4000;

TIMESTAMP


    /// Apply to the entire subtree
    pub const RECURSIVE = 0x8000;

CSIZE

};

CC_INFO


pub const FALLOC = struct {
    /// Default is extend size
    pub const FL_KEEP_SIZE = 0x01;

SAVE_SYN


    /// De-allocates range
    pub const FL_PUNCH_HOLE = 0x02;

SAVED_SYN


    /// Reserved codepoint
    pub const FL_NO_HIDE_STALE = 0x04;

REPAIR_WINDOW


    /// Removes a range of a file without leaving a hole in the file
    pub const FL_COLLAPSE_RANGE = 0x08;

FASTOPEN_CONNECT


    /// Converts a range of file to zeros preferably without issuing data IO
    pub const FL_ZERO_RANGE = 0x10;

ULP


    /// Inserts space within the file size without overwriting any existing data
    pub const FL_INSERT_RANGE = 0x20;

MD5SIG_EXT


    /// Unshares shared blocks within the file size without overwriting any existing data
    pub const FL_UNSHARE_RANGE = 0x40;

CSIZE

};

FASTOPEN_NO_COOKIE


pub const FUTEX = struct {
    pub const WAIT = 0;
    pub const WAKE = 1;
    pub const FD = 2;
    pub const REQUEUE = 3;
    pub const CMP_REQUEUE = 4;
    pub const WAKE_OP = 5;
    pub const LOCK_PI = 6;
    pub const UNLOCK_PI = 7;
    pub const TRYLOCK_PI = 8;
    pub const WAIT_BITSET = 9;
    pub const WAKE_BITSET = 10;
    pub const WAIT_REQUEUE_PI = 11;
    pub const CMP_REQUEUE_PI = 12;

ZEROCOPY_RECEIVE


    pub const PRIVATE_FLAG = 128;

INQ


    pub const CLOCK_REALTIME = 256;

CM_INQ


    /// Max numbers of elements in a `futex_waitv` array.
    pub const WAITV_MAX = 128;

CSIZE

};

REPAIR_ON


pub const FUTEX2 = struct {
    pub const SIZE_U8 = 0x00;
    pub const SIZE_U16 = 0x01;
    pub const SIZE_U32 = 0x02;
    pub const SIZE_U64 = 0x03;
    pub const NUMA = 0x04;

REPAIR_OFF


    pub const PRIVATE = FUTEX.PRIVATE_FLAG;

CSIZE

};

PF


pub const PROT = struct {
    /// page can not be accessed
    pub const NONE = 0x0;
    /// page can be read
    pub const READ = 0x1;
    /// page can be written
    pub const WRITE = 0x2;
    /// page can be executed
    pub const EXEC = 0x4;
    /// page may be used for atomic ops
    pub const SEM = switch (native_arch) {
        // TODO: also xtensa
        .mips, .mipsel, .mips64, .mips64el => 0x10,
        else => 0x8,
    };
    /// mprotect flag: extend change to start of growsdown vma
    pub const GROWSDOWN = 0x01000000;
    /// mprotect flag: extend change to end of growsup vma
    pub const GROWSUP = 0x02000000;

CSIZE

};

LOCAL


pub const FD_CLOEXEC = 1;

UNIX


pub const F_OK = 0;
pub const X_OK = 1;
pub const W_OK = 2;
pub const R_OK = 4;

FILE


pub const W = struct {
    pub const NOHANG = 1;
    pub const UNTRACED = 2;
    pub const STOPPED = 2;
    pub const EXITED = 4;
    pub const CONTINUED = 8;
    pub const NOWAIT = 0x1000000;

INET


    pub fn EXITSTATUS(s: u32) u8 {
        return @as(u8, @intCast((s & 0xff00) >> 8));
    }
    pub fn TERMSIG(s: u32) u32 {
        return s & 0x7f;
    }
    pub fn STOPSIG(s: u32) u32 {
        return EXITSTATUS(s);
    }
    pub fn IFEXITED(s: u32) bool {
        return TERMSIG(s) == 0;
    }
    pub fn IFSTOPPED(s: u32) bool {
        return @as(u16, @truncate(((s & 0xffff) *% 0x10001) >> 8)) > 0x7f00;
    }
    pub fn IFSIGNALED(s: u32) bool {
        return (s & 0xffff) -% 1 < 0xff;
    }

CSIZE

};

IPX


// waitid id types
pub const P = enum(c_uint) {
    ALL = 0,
    PID = 1,
    PGID = 2,
    PIDFD = 3,
    _,

CSIZE

};

NETROM


pub const SA = if (is_mips) struct {
    pub const NOCLDSTOP = 1;
    pub const NOCLDWAIT = 0x10000;
    pub const SIGINFO = 8;
    pub const RESTART = 0x10000000;
    pub const RESETHAND = 0x80000000;
    pub const ONSTACK = 0x08000000;
    pub const NODEFER = 0x40000000;
    pub const RESTORER = 0x04000000;
} else if (is_sparc) struct {
    pub const NOCLDSTOP = 0x8;
    pub const NOCLDWAIT = 0x100;
    pub const SIGINFO = 0x200;
    pub const RESTART = 0x2;
    pub const RESETHAND = 0x4;
    pub const ONSTACK = 0x1;
    pub const NODEFER = 0x20;
    pub const RESTORER = 0x04000000;
} else struct {
    pub const NOCLDSTOP = 1;
    pub const NOCLDWAIT = 2;
    pub const SIGINFO = 4;
    pub const RESTART = 0x10000000;
    pub const RESETHAND = 0x80000000;
    pub const ONSTACK = 0x08000000;
    pub const NODEFER = 0x40000000;
    pub const RESTORER = 0x04000000;

CSIZE

};

ATMPVC


pub const SIG = if (is_mips) struct {
    pub const BLOCK = 1;
    pub const UNBLOCK = 2;
    pub const SETMASK = 3;

X25


    pub const HUP = 1;
    pub const INT = 2;
    pub const QUIT = 3;
    pub const ILL = 4;
    pub const TRAP = 5;
    pub const ABRT = 6;
    pub const IOT = ABRT;
    pub const BUS = 7;
    pub const FPE = 8;
    pub const KILL = 9;
    pub const USR1 = 10;
    pub const SEGV = 11;
    pub const USR2 = 12;
    pub const PIPE = 13;
    pub const ALRM = 14;
    pub const TERM = 15;
    pub const STKFLT = 16;
    pub const CHLD = 17;
    pub const CONT = 18;
    pub const STOP = 19;
    pub const TSTP = 20;
    pub const TTIN = 21;
    pub const TTOU = 22;
    pub const URG = 23;
    pub const XCPU = 24;
    pub const XFSZ = 25;
    pub const VTALRM = 26;
    pub const PROF = 27;
    pub const WINCH = 28;
    pub const IO = 29;
    pub const POLL = 29;
    pub const PWR = 30;
    pub const SYS = 31;
    pub const UNUSED = SIG.SYS;

INET6


    pub const ERR: ?Sigaction.handler_fn = @ptrFromInt(maxInt(usize));
    pub const DFL: ?Sigaction.handler_fn = @ptrFromInt(0);
    pub const IGN: ?Sigaction.handler_fn = @ptrFromInt(1);
} else if (is_sparc) struct {
    pub const BLOCK = 1;
    pub const UNBLOCK = 2;
    pub const SETMASK = 4;

ROSE


    pub const HUP = 1;
    pub const INT = 2;
    pub const QUIT = 3;
    pub const ILL = 4;
    pub const TRAP = 5;
    pub const ABRT = 6;
    pub const EMT = 7;
    pub const FPE = 8;
    pub const KILL = 9;
    pub const BUS = 10;
    pub const SEGV = 11;
    pub const SYS = 12;
    pub const PIPE = 13;
    pub const ALRM = 14;
    pub const TERM = 15;
    pub const URG = 16;
    pub const STOP = 17;
    pub const TSTP = 18;
    pub const CONT = 19;
    pub const CHLD = 20;
    pub const TTIN = 21;
    pub const TTOU = 22;
    pub const POLL = 23;
    pub const XCPU = 24;
    pub const XFSZ = 25;
    pub const VTALRM = 26;
    pub const PROF = 27;
    pub const WINCH = 28;
    pub const LOST = 29;
    pub const USR1 = 30;
    pub const USR2 = 31;
    pub const IOT = ABRT;
    pub const CLD = CHLD;
    pub const PWR = LOST;
    pub const IO = SIG.POLL;

DECnet


    pub const ERR: ?Sigaction.handler_fn = @ptrFromInt(maxInt(usize));
    pub const DFL: ?Sigaction.handler_fn = @ptrFromInt(0);
    pub const IGN: ?Sigaction.handler_fn = @ptrFromInt(1);
} else struct {
    pub const BLOCK = 0;
    pub const UNBLOCK = 1;
    pub const SETMASK = 2;

NETBEUI


    pub const HUP = 1;
    pub const INT = 2;
    pub const QUIT = 3;
    pub const ILL = 4;
    pub const TRAP = 5;
    pub const ABRT = 6;
    pub const IOT = ABRT;
    pub const BUS = 7;
    pub const FPE = 8;
    pub const KILL = 9;
    pub const USR1 = 10;
    pub const SEGV = 11;
    pub const USR2 = 12;
    pub const PIPE = 13;
    pub const ALRM = 14;
    pub const TERM = 15;
    pub const STKFLT = 16;
    pub const CHLD = 17;
    pub const CONT = 18;
    pub const STOP = 19;
    pub const TSTP = 20;
    pub const TTIN = 21;
    pub const TTOU = 22;
    pub const URG = 23;
    pub const XCPU = 24;
    pub const XFSZ = 25;
    pub const VTALRM = 26;
    pub const PROF = 27;
    pub const WINCH = 28;
    pub const IO = 29;
    pub const POLL = 29;
    pub const PWR = 30;
    pub const SYS = 31;
    pub const UNUSED = SIG.SYS;

SECURITY


    pub const ERR: ?Sigaction.handler_fn = @ptrFromInt(maxInt(usize));
    pub const DFL: ?Sigaction.handler_fn = @ptrFromInt(0);
    pub const IGN: ?Sigaction.handler_fn = @ptrFromInt(1);

CSIZE

};

NETLINK


pub const kernel_rwf = u32;

ROUTE


pub const RWF = struct {
    pub const HIPRI: kernel_rwf = 0x00000001;
    pub const DSYNC: kernel_rwf = 0x00000002;
    pub const SYNC: kernel_rwf = 0x00000004;
    pub const NOWAIT: kernel_rwf = 0x00000008;
    pub const APPEND: kernel_rwf = 0x00000010;

CSIZE

};

ASH


pub const SEEK = struct {
    pub const SET = 0;
    pub const CUR = 1;
    pub const END = 2;

CSIZE

};

ATMSVC


pub const SHUT = struct {
    pub const RD = 0;
    pub const WR = 1;
    pub const RDWR = 2;

CSIZE

};

SNA


pub const SOCK = struct {
    pub const STREAM = if (is_mips) 2 else 1;
    pub const DGRAM = if (is_mips) 1 else 2;
    pub const RAW = 3;
    pub const RDM = 4;
    pub const SEQPACKET = 5;
    pub const DCCP = 6;
    pub const PACKET = 10;
    pub const CLOEXEC = if (is_sparc) 0o20000000 else 0o2000000;
    pub const NONBLOCK = if (is_mips) 0o200 else if (is_sparc) 0o40000 else 0o4000;

CSIZE

};

PPPOX


pub const TCP = struct {
    /// Turn off Nagle's algorithm
    pub const NODELAY = 1;
    /// Limit MSS
    pub const MAXSEG = 2;
    /// Never send partially complete segments.
    pub const CORK = 3;
    /// Start keeplives after this period, in seconds
    pub const KEEPIDLE = 4;
    /// Interval between keepalives
    pub const KEEPINTVL = 5;
    /// Number of keepalives before death
    pub const KEEPCNT = 6;
    /// Number of SYN retransmits
    pub const SYNCNT = 7;
    /// Life time of orphaned FIN-WAIT-2 state
    pub const LINGER2 = 8;
    /// Wake up listener only when data arrive
    pub const DEFER_ACCEPT = 9;
    /// Bound advertised window
    pub const WINDOW_CLAMP = 10;
    /// Information about this connection.
    pub const INFO = 11;
    /// Block/reenable quick acks
    pub const QUICKACK = 12;
    /// Congestion control algorithm
    pub const CONGESTION = 13;
    /// TCP MD5 Signature (RFC2385)
    pub const MD5SIG = 14;
    /// Use linear timeouts for thin streams
    pub const THIN_LINEAR_TIMEOUTS = 16;
    /// Fast retrans. after 1 dupack
    pub const THIN_DUPACK = 17;
    /// How long for loss retry before timeout
    pub const USER_TIMEOUT = 18;
    /// TCP sock is under repair right now
    pub const REPAIR = 19;
    pub const REPAIR_QUEUE = 20;
    pub const QUEUE_SEQ = 21;
    pub const REPAIR_OPTIONS = 22;
    /// Enable FastOpen on listeners
    pub const FASTOPEN = 23;
    pub const TIMESTAMP = 24;
    /// limit number of unsent bytes in write queue
    pub const NOTSENT_LOWAT = 25;
    /// Get Congestion Control (optional) info
    pub const CC_INFO = 26;
    /// Record SYN headers for new connections
    pub const SAVE_SYN = 27;
    /// Get SYN headers recorded for connection
    pub const SAVED_SYN = 28;
    /// Get/set window parameters
    pub const REPAIR_WINDOW = 29;
    /// Attempt FastOpen with connect
    pub const FASTOPEN_CONNECT = 30;
    /// Attach a ULP to a TCP connection
    pub const ULP = 31;
    /// TCP MD5 Signature with extensions
    pub const MD5SIG_EXT = 32;
    /// Set the key for Fast Open (cookie)
    pub const FASTOPEN_KEY = 33;
    /// Enable TFO without a TFO cookie
    pub const FASTOPEN_NO_COOKIE = 34;
    pub const ZEROCOPY_RECEIVE = 35;
    /// Notify bytes available to read as a cmsg on read
    pub const INQ = 36;
    pub const CM_INQ = INQ;
    /// delay outgoing packets by XX usec
    pub const TX_DELAY = 37;

WANPIPE


    pub const REPAIR_ON = 1;
    pub const REPAIR_OFF = 0;
    /// Turn off without window probes
    pub const REPAIR_OFF_NO_WP = -1;

CSIZE

};

IB


pub const PF = struct {
    pub const UNSPEC = 0;
    pub const LOCAL = 1;
    pub const UNIX = LOCAL;
    pub const FILE = LOCAL;
    pub const INET = 2;
    pub const AX25 = 3;
    pub const IPX = 4;
    pub const APPLETALK = 5;
    pub const NETROM = 6;
    pub const BRIDGE = 7;
    pub const ATMPVC = 8;
    pub const X25 = 9;
    pub const INET6 = 10;
    pub const ROSE = 11;
    pub const DECnet = 12;
    pub const NETBEUI = 13;
    pub const SECURITY = 14;
    pub const KEY = 15;
    pub const NETLINK = 16;
    pub const ROUTE = PF.NETLINK;
    pub const PACKET = 17;
    pub const ASH = 18;
    pub const ECONET = 19;
    pub const ATMSVC = 20;
    pub const RDS = 21;
    pub const SNA = 22;
    pub const IRDA = 23;
    pub const PPPOX = 24;
    pub const WANPIPE = 25;
    pub const LLC = 26;
    pub const IB = 27;

MPLS

    pub const MPLS = 28;

CAN

    pub const CAN = 29;

TIPC

    pub const TIPC = 30;

BLUETOOTH

    pub const BLUETOOTH = 31;

IUCV

    pub const IUCV = 32;

RXRPC

    pub const RXRPC = 33;

ISDN

    pub const ISDN = 34;

PHONET

    pub const PHONET = 35;

IEEE802154

    pub const IEEE802154 = 36;

CAIF

    pub const CAIF = 37;

ALG

    pub const ALG = 38;

NFC

    pub const NFC = 39;

VSOCK

    pub const VSOCK = 40;

KCM

    pub const KCM = 41;

QIPCRTR

    pub const QIPCRTR = 42;

SMC

    pub const SMC = 43;

XDP

    pub const XDP = 44;

MAX

    pub const MAX = 45;

CSIZE

};

UNSPEC


pub const AF = struct {
    pub const UNSPEC = PF.UNSPEC;

LOCAL

    pub const LOCAL = PF.LOCAL;

UNIX

    pub const UNIX = AF.LOCAL;

FILE

    pub const FILE = AF.LOCAL;

INET

    pub const INET = PF.INET;

AX25

    pub const AX25 = PF.AX25;

IPX

    pub const IPX = PF.IPX;

APPLETALK

    pub const APPLETALK = PF.APPLETALK;

NETROM

    pub const NETROM = PF.NETROM;

BRIDGE

    pub const BRIDGE = PF.BRIDGE;

ATMPVC

    pub const ATMPVC = PF.ATMPVC;

X25

    pub const X25 = PF.X25;

INET6

    pub const INET6 = PF.INET6;

ROSE

    pub const ROSE = PF.ROSE;

DECnet

    pub const DECnet = PF.DECnet;

NETBEUI

    pub const NETBEUI = PF.NETBEUI;

SECURITY

    pub const SECURITY = PF.SECURITY;

KEY

    pub const KEY = PF.KEY;

NETLINK

    pub const NETLINK = PF.NETLINK;

ROUTE

    pub const ROUTE = PF.ROUTE;

PACKET

    pub const PACKET = PF.PACKET;

ASH

    pub const ASH = PF.ASH;

ECONET

    pub const ECONET = PF.ECONET;

ATMSVC

    pub const ATMSVC = PF.ATMSVC;

RDS

    pub const RDS = PF.RDS;

SNA

    pub const SNA = PF.SNA;

IRDA

    pub const IRDA = PF.IRDA;

PPPOX

    pub const PPPOX = PF.PPPOX;

WANPIPE

    pub const WANPIPE = PF.WANPIPE;

LLC

    pub const LLC = PF.LLC;

IB

    pub const IB = PF.IB;

MPLS

    pub const MPLS = PF.MPLS;

CAN

    pub const CAN = PF.CAN;

TIPC

    pub const TIPC = PF.TIPC;

BLUETOOTH

    pub const BLUETOOTH = PF.BLUETOOTH;

IUCV

    pub const IUCV = PF.IUCV;

RXRPC

    pub const RXRPC = PF.RXRPC;

ISDN

    pub const ISDN = PF.ISDN;

PHONET

    pub const PHONET = PF.PHONET;

IEEE802154

    pub const IEEE802154 = PF.IEEE802154;

CAIF

    pub const CAIF = PF.CAIF;

ALG

    pub const ALG = PF.ALG;

NFC

    pub const NFC = PF.NFC;

VSOCK

    pub const VSOCK = PF.VSOCK;

KCM

    pub const KCM = PF.KCM;

QIPCRTR

    pub const QIPCRTR = PF.QIPCRTR;

SMC

    pub const SMC = PF.SMC;

XDP

    pub const XDP = PF.XDP;

MAX

    pub const MAX = PF.MAX;

CSIZE

};

DEBUG


pub const SO = if (is_mips) struct {

DEBUG

    pub const DEBUG = 1;
    pub const REUSEADDR = 0x0004;

KEEPALIVE

    pub const KEEPALIVE = 0x0008;

DONTROUTE

    pub const DONTROUTE = 0x0010;

BROADCAST

    pub const BROADCAST = 0x0020;

LINGER

    pub const LINGER = 0x0080;

OOBINLINE

    pub const OOBINLINE = 0x0100;

REUSEPORT

    pub const REUSEPORT = 0x0200;

SNDBUF

    pub const SNDBUF = 0x1001;

RCVBUF

    pub const RCVBUF = 0x1002;

SNDLOWAT

    pub const SNDLOWAT = 0x1003;

RCVLOWAT

    pub const RCVLOWAT = 0x1004;

RCVTIMEO

    pub const RCVTIMEO = 0x1006;

SNDTIMEO

    pub const SNDTIMEO = 0x1005;

ERROR

    pub const ERROR = 0x1007;

TYPE

    pub const TYPE = 0x1008;

ACCEPTCONN

    pub const ACCEPTCONN = 0x1009;

PROTOCOL

    pub const PROTOCOL = 0x1028;

DOMAIN

    pub const DOMAIN = 0x1029;

NO_CHECK

    pub const NO_CHECK = 11;

PRIORITY

    pub const PRIORITY = 12;

BSDCOMPAT

    pub const BSDCOMPAT = 14;

PASSCRED

    pub const PASSCRED = 17;

PEERCRED

    pub const PEERCRED = 18;

PEERSEC

    pub const PEERSEC = 30;

SNDBUFFORCE

    pub const SNDBUFFORCE = 31;

RCVBUFFORCE

    pub const RCVBUFFORCE = 33;

SECURITY_AUTHENTICATION

    pub const SECURITY_AUTHENTICATION = 22;

SECURITY_ENCRYPTION_TRANSPORT

    pub const SECURITY_ENCRYPTION_TRANSPORT = 23;

SECURITY_ENCRYPTION_NETWORK

    pub const SECURITY_ENCRYPTION_NETWORK = 24;

BINDTODEVICE

    pub const BINDTODEVICE = 25;

ATTACH_FILTER

    pub const ATTACH_FILTER = 26;

DETACH_FILTER

    pub const DETACH_FILTER = 27;

GET_FILTER

    pub const GET_FILTER = ATTACH_FILTER;

PEERNAME

    pub const PEERNAME = 28;

TIMESTAMP_OLD

    pub const TIMESTAMP_OLD = 29;

PASSSEC

    pub const PASSSEC = 34;

TIMESTAMPNS_OLD

    pub const TIMESTAMPNS_OLD = 35;

MARK

    pub const MARK = 36;

TIMESTAMPING_OLD

    pub const TIMESTAMPING_OLD = 37;

RXQ_OVFL

    pub const RXQ_OVFL = 40;

WIFI_STATUS

    pub const WIFI_STATUS = 41;

PEEK_OFF

    pub const PEEK_OFF = 42;

NOFCS

    pub const NOFCS = 43;

LOCK_FILTER

    pub const LOCK_FILTER = 44;

SELECT_ERR_QUEUE

    pub const SELECT_ERR_QUEUE = 45;

BUSY_POLL

    pub const BUSY_POLL = 46;

MAX_PACING_RATE

    pub const MAX_PACING_RATE = 47;

BPF_EXTENSIONS

    pub const BPF_EXTENSIONS = 48;

INCOMING_CPU

    pub const INCOMING_CPU = 49;

ATTACH_BPF

    pub const ATTACH_BPF = 50;

DETACH_BPF

    pub const DETACH_BPF = DETACH_FILTER;

ATTACH_REUSEPORT_CBPF

    pub const ATTACH_REUSEPORT_CBPF = 51;

ATTACH_REUSEPORT_EBPF

    pub const ATTACH_REUSEPORT_EBPF = 52;

CNX_ADVICE

    pub const CNX_ADVICE = 53;

MEMINFO

    pub const MEMINFO = 55;

INCOMING_NAPI_ID

    pub const INCOMING_NAPI_ID = 56;

COOKIE

    pub const COOKIE = 57;

PEERGROUPS

    pub const PEERGROUPS = 59;

ZEROCOPY

    pub const ZEROCOPY = 60;

TXTIME

    pub const TXTIME = 61;

BINDTOIFINDEX

    pub const BINDTOIFINDEX = 62;

TIMESTAMP_NEW

    pub const TIMESTAMP_NEW = 63;

TIMESTAMPNS_NEW

    pub const TIMESTAMPNS_NEW = 64;

TIMESTAMPING_NEW

    pub const TIMESTAMPING_NEW = 65;

RCVTIMEO_NEW

    pub const RCVTIMEO_NEW = 66;

SNDTIMEO_NEW

    pub const SNDTIMEO_NEW = 67;

DETACH_REUSEPORT_BPF

    pub const DETACH_REUSEPORT_BPF = 68;
} else if (is_ppc or is_ppc64) struct {

DEBUG

    pub const DEBUG = 1;

REUSEADDR

    pub const REUSEADDR = 2;

TYPE

    pub const TYPE = 3;

ERROR

    pub const ERROR = 4;

DONTROUTE

    pub const DONTROUTE = 5;

BROADCAST

    pub const BROADCAST = 6;

SNDBUF

    pub const SNDBUF = 7;

RCVBUF

    pub const RCVBUF = 8;

KEEPALIVE

    pub const KEEPALIVE = 9;

OOBINLINE

    pub const OOBINLINE = 10;

NO_CHECK

    pub const NO_CHECK = 11;

PRIORITY

    pub const PRIORITY = 12;

LINGER

    pub const LINGER = 13;

BSDCOMPAT

    pub const BSDCOMPAT = 14;

REUSEPORT

    pub const REUSEPORT = 15;

RCVLOWAT

    pub const RCVLOWAT = 16;

SNDLOWAT

    pub const SNDLOWAT = 17;

RCVTIMEO

    pub const RCVTIMEO = 18;

SNDTIMEO

    pub const SNDTIMEO = 19;

PASSCRED

    pub const PASSCRED = 20;

PEERCRED

    pub const PEERCRED = 21;

ACCEPTCONN

    pub const ACCEPTCONN = 30;

PEERSEC

    pub const PEERSEC = 31;

SNDBUFFORCE

    pub const SNDBUFFORCE = 32;

RCVBUFFORCE

    pub const RCVBUFFORCE = 33;

PROTOCOL

    pub const PROTOCOL = 38;

DOMAIN

    pub const DOMAIN = 39;

SECURITY_AUTHENTICATION

    pub const SECURITY_AUTHENTICATION = 22;

SECURITY_ENCRYPTION_TRANSPORT

    pub const SECURITY_ENCRYPTION_TRANSPORT = 23;

SECURITY_ENCRYPTION_NETWORK

    pub const SECURITY_ENCRYPTION_NETWORK = 24;

BINDTODEVICE

    pub const BINDTODEVICE = 25;

ATTACH_FILTER

    pub const ATTACH_FILTER = 26;

DETACH_FILTER

    pub const DETACH_FILTER = 27;

GET_FILTER

    pub const GET_FILTER = ATTACH_FILTER;

PEERNAME

    pub const PEERNAME = 28;

TIMESTAMP_OLD

    pub const TIMESTAMP_OLD = 29;

PASSSEC

    pub const PASSSEC = 34;

TIMESTAMPNS_OLD

    pub const TIMESTAMPNS_OLD = 35;

MARK

    pub const MARK = 36;

TIMESTAMPING_OLD

    pub const TIMESTAMPING_OLD = 37;

RXQ_OVFL

    pub const RXQ_OVFL = 40;

WIFI_STATUS

    pub const WIFI_STATUS = 41;

PEEK_OFF

    pub const PEEK_OFF = 42;

NOFCS

    pub const NOFCS = 43;

LOCK_FILTER

    pub const LOCK_FILTER = 44;

SELECT_ERR_QUEUE

    pub const SELECT_ERR_QUEUE = 45;

BUSY_POLL

    pub const BUSY_POLL = 46;

MAX_PACING_RATE

    pub const MAX_PACING_RATE = 47;

BPF_EXTENSIONS

    pub const BPF_EXTENSIONS = 48;

INCOMING_CPU

    pub const INCOMING_CPU = 49;

ATTACH_BPF

    pub const ATTACH_BPF = 50;

DETACH_BPF

    pub const DETACH_BPF = DETACH_FILTER;

ATTACH_REUSEPORT_CBPF

    pub const ATTACH_REUSEPORT_CBPF = 51;

ATTACH_REUSEPORT_EBPF

    pub const ATTACH_REUSEPORT_EBPF = 52;

CNX_ADVICE

    pub const CNX_ADVICE = 53;

MEMINFO

    pub const MEMINFO = 55;

INCOMING_NAPI_ID

    pub const INCOMING_NAPI_ID = 56;

COOKIE

    pub const COOKIE = 57;

PEERGROUPS

    pub const PEERGROUPS = 59;

ZEROCOPY

    pub const ZEROCOPY = 60;

TXTIME

    pub const TXTIME = 61;

BINDTOIFINDEX

    pub const BINDTOIFINDEX = 62;

TIMESTAMP_NEW

    pub const TIMESTAMP_NEW = 63;

TIMESTAMPNS_NEW

    pub const TIMESTAMPNS_NEW = 64;

TIMESTAMPING_NEW

    pub const TIMESTAMPING_NEW = 65;

RCVTIMEO_NEW

    pub const RCVTIMEO_NEW = 66;

SNDTIMEO_NEW

    pub const SNDTIMEO_NEW = 67;

DETACH_REUSEPORT_BPF

    pub const DETACH_REUSEPORT_BPF = 68;
} else if (is_sparc) struct {

DEBUG

    pub const DEBUG = 1;

REUSEADDR

    pub const REUSEADDR = 4;

TYPE

    pub const TYPE = 4104;

ERROR

    pub const ERROR = 4103;

DONTROUTE

    pub const DONTROUTE = 16;

BROADCAST

    pub const BROADCAST = 32;

SNDBUF

    pub const SNDBUF = 4097;

RCVBUF

    pub const RCVBUF = 4098;

KEEPALIVE

    pub const KEEPALIVE = 8;

OOBINLINE

    pub const OOBINLINE = 256;

NO_CHECK

    pub const NO_CHECK = 11;

PRIORITY

    pub const PRIORITY = 12;

LINGER

    pub const LINGER = 128;

BSDCOMPAT

    pub const BSDCOMPAT = 1024;

REUSEPORT

    pub const REUSEPORT = 512;

PASSCRED

    pub const PASSCRED = 2;

PEERCRED

    pub const PEERCRED = 64;

RCVLOWAT

    pub const RCVLOWAT = 2048;

SNDLOWAT

    pub const SNDLOWAT = 4096;

RCVTIMEO

    pub const RCVTIMEO = 8192;

SNDTIMEO

    pub const SNDTIMEO = 16384;

ACCEPTCONN

    pub const ACCEPTCONN = 32768;

PEERSEC

    pub const PEERSEC = 30;

SNDBUFFORCE

    pub const SNDBUFFORCE = 4106;

RCVBUFFORCE

    pub const RCVBUFFORCE = 4107;

PROTOCOL

    pub const PROTOCOL = 4136;

DOMAIN

    pub const DOMAIN = 4137;

SECURITY_AUTHENTICATION

    pub const SECURITY_AUTHENTICATION = 20481;

SECURITY_ENCRYPTION_TRANSPORT

    pub const SECURITY_ENCRYPTION_TRANSPORT = 20482;

SECURITY_ENCRYPTION_NETWORK

    pub const SECURITY_ENCRYPTION_NETWORK = 20484;

BINDTODEVICE

    pub const BINDTODEVICE = 13;

ATTACH_FILTER

    pub const ATTACH_FILTER = 26;

DETACH_FILTER

    pub const DETACH_FILTER = 27;

GET_FILTER

    pub const GET_FILTER = 26;

PEERNAME

    pub const PEERNAME = 28;

TIMESTAMP_OLD

    pub const TIMESTAMP_OLD = 29;

PASSSEC

    pub const PASSSEC = 31;

TIMESTAMPNS_OLD

    pub const TIMESTAMPNS_OLD = 33;

MARK

    pub const MARK = 34;

TIMESTAMPING_OLD

    pub const TIMESTAMPING_OLD = 35;

RXQ_OVFL

    pub const RXQ_OVFL = 36;

WIFI_STATUS

    pub const WIFI_STATUS = 37;

PEEK_OFF

    pub const PEEK_OFF = 38;

NOFCS

    pub const NOFCS = 39;

LOCK_FILTER

    pub const LOCK_FILTER = 40;

SELECT_ERR_QUEUE

    pub const SELECT_ERR_QUEUE = 41;

BUSY_POLL

    pub const BUSY_POLL = 48;

MAX_PACING_RATE

    pub const MAX_PACING_RATE = 49;

BPF_EXTENSIONS

    pub const BPF_EXTENSIONS = 50;

INCOMING_CPU

    pub const INCOMING_CPU = 51;

ATTACH_BPF

    pub const ATTACH_BPF = 52;

DETACH_BPF

    pub const DETACH_BPF = 27;

ATTACH_REUSEPORT_CBPF

    pub const ATTACH_REUSEPORT_CBPF = 53;

ATTACH_REUSEPORT_EBPF

    pub const ATTACH_REUSEPORT_EBPF = 54;

CNX_ADVICE

    pub const CNX_ADVICE = 55;

MEMINFO

    pub const MEMINFO = 57;

INCOMING_NAPI_ID

    pub const INCOMING_NAPI_ID = 58;

COOKIE

    pub const COOKIE = 59;

PEERGROUPS

    pub const PEERGROUPS = 61;

ZEROCOPY

    pub const ZEROCOPY = 62;

TXTIME

    pub const TXTIME = 63;

BINDTOIFINDEX

    pub const BINDTOIFINDEX = 65;

TIMESTAMP_NEW

    pub const TIMESTAMP_NEW = 70;

TIMESTAMPNS_NEW

    pub const TIMESTAMPNS_NEW = 66;

TIMESTAMPING_NEW

    pub const TIMESTAMPING_NEW = 67;

RCVTIMEO_NEW

    pub const RCVTIMEO_NEW = 68;

SNDTIMEO_NEW

    pub const SNDTIMEO_NEW = 69;

DETACH_REUSEPORT_BPF

    pub const DETACH_REUSEPORT_BPF = 71;
} else struct {

DEBUG

    pub const DEBUG = 1;

REUSEADDR

    pub const REUSEADDR = 2;

TYPE

    pub const TYPE = 3;

ERROR

    pub const ERROR = 4;

DONTROUTE

    pub const DONTROUTE = 5;

BROADCAST

    pub const BROADCAST = 6;

SNDBUF

    pub const SNDBUF = 7;

RCVBUF

    pub const RCVBUF = 8;

KEEPALIVE

    pub const KEEPALIVE = 9;

OOBINLINE

    pub const OOBINLINE = 10;

NO_CHECK

    pub const NO_CHECK = 11;

PRIORITY

    pub const PRIORITY = 12;

LINGER

    pub const LINGER = 13;

BSDCOMPAT

    pub const BSDCOMPAT = 14;

REUSEPORT

    pub const REUSEPORT = 15;

PASSCRED

    pub const PASSCRED = 16;

PEERCRED

    pub const PEERCRED = 17;

RCVLOWAT

    pub const RCVLOWAT = 18;

SNDLOWAT

    pub const SNDLOWAT = 19;

RCVTIMEO

    pub const RCVTIMEO = 20;

SNDTIMEO

    pub const SNDTIMEO = 21;

ACCEPTCONN

    pub const ACCEPTCONN = 30;

PEERSEC

    pub const PEERSEC = 31;

SNDBUFFORCE

    pub const SNDBUFFORCE = 32;

RCVBUFFORCE

    pub const RCVBUFFORCE = 33;

PROTOCOL

    pub const PROTOCOL = 38;

DOMAIN

    pub const DOMAIN = 39;

SECURITY_AUTHENTICATION

    pub const SECURITY_AUTHENTICATION = 22;

SECURITY_ENCRYPTION_TRANSPORT

    pub const SECURITY_ENCRYPTION_TRANSPORT = 23;

SECURITY_ENCRYPTION_NETWORK

    pub const SECURITY_ENCRYPTION_NETWORK = 24;

BINDTODEVICE

    pub const BINDTODEVICE = 25;

ATTACH_FILTER

    pub const ATTACH_FILTER = 26;

DETACH_FILTER

    pub const DETACH_FILTER = 27;

GET_FILTER

    pub const GET_FILTER = ATTACH_FILTER;

PEERNAME

    pub const PEERNAME = 28;

TIMESTAMP_OLD

    pub const TIMESTAMP_OLD = 29;

PASSSEC

    pub const PASSSEC = 34;

TIMESTAMPNS_OLD

    pub const TIMESTAMPNS_OLD = 35;

MARK

    pub const MARK = 36;

TIMESTAMPING_OLD

    pub const TIMESTAMPING_OLD = 37;

RXQ_OVFL

    pub const RXQ_OVFL = 40;

WIFI_STATUS

    pub const WIFI_STATUS = 41;

PEEK_OFF

    pub const PEEK_OFF = 42;

NOFCS

    pub const NOFCS = 43;

LOCK_FILTER

    pub const LOCK_FILTER = 44;

SELECT_ERR_QUEUE

    pub const SELECT_ERR_QUEUE = 45;

BUSY_POLL

    pub const BUSY_POLL = 46;

MAX_PACING_RATE

    pub const MAX_PACING_RATE = 47;

BPF_EXTENSIONS

    pub const BPF_EXTENSIONS = 48;

INCOMING_CPU

    pub const INCOMING_CPU = 49;

ATTACH_BPF

    pub const ATTACH_BPF = 50;

DETACH_BPF

    pub const DETACH_BPF = DETACH_FILTER;

ATTACH_REUSEPORT_CBPF

    pub const ATTACH_REUSEPORT_CBPF = 51;

ATTACH_REUSEPORT_EBPF

    pub const ATTACH_REUSEPORT_EBPF = 52;

CNX_ADVICE

    pub const CNX_ADVICE = 53;

MEMINFO

    pub const MEMINFO = 55;

INCOMING_NAPI_ID

    pub const INCOMING_NAPI_ID = 56;

COOKIE

    pub const COOKIE = 57;

PEERGROUPS

    pub const PEERGROUPS = 59;

ZEROCOPY

    pub const ZEROCOPY = 60;

TXTIME

    pub const TXTIME = 61;

BINDTOIFINDEX

    pub const BINDTOIFINDEX = 62;

TIMESTAMP_NEW

    pub const TIMESTAMP_NEW = 63;

TIMESTAMPNS_NEW

    pub const TIMESTAMPNS_NEW = 64;

TIMESTAMPING_NEW

    pub const TIMESTAMPING_NEW = 65;

RCVTIMEO_NEW

    pub const RCVTIMEO_NEW = 66;

SNDTIMEO_NEW

    pub const SNDTIMEO_NEW = 67;

DETACH_REUSEPORT_BPF

    pub const DETACH_REUSEPORT_BPF = 68;

CSIZE

};

WIFI_STATUS


pub const SCM = struct {
    pub const WIFI_STATUS = SO.WIFI_STATUS;

TIMESTAMPING_OPT_STATS

    pub const TIMESTAMPING_OPT_STATS = 54;

TIMESTAMPING_PKTINFO

    pub const TIMESTAMPING_PKTINFO = 58;

TXTIME

    pub const TXTIME = SO.TXTIME;

CSIZE

};

SOCKET


pub const SOL = struct {
    pub const SOCKET = if (is_mips or is_sparc) 65535 else 1;

IP


IP

    pub const IP = 0;

IPV6

    pub const IPV6 = 41;

ICMPV6

    pub const ICMPV6 = 58;

DECNET


RAW

    pub const RAW = 255;
    pub const DECNET = 261;
    pub const X25 = 262;

PACKET

    pub const PACKET = 263;

ATM

    pub const ATM = 264;

AAL

    pub const AAL = 265;

IRDA

    pub const IRDA = 266;

NETBEUI

    pub const NETBEUI = 267;

LLC

    pub const LLC = 268;

DCCP

    pub const DCCP = 269;

NETLINK

    pub const NETLINK = 270;

TIPC

    pub const TIPC = 271;

RXRPC

    pub const RXRPC = 272;

PPPOL2TP

    pub const PPPOL2TP = 273;

BLUETOOTH

    pub const BLUETOOTH = 274;

PNPIPE

    pub const PNPIPE = 275;

RDS

    pub const RDS = 276;

IUCV

    pub const IUCV = 277;

CAIF

    pub const CAIF = 278;

ALG

    pub const ALG = 279;

NFC

    pub const NFC = 280;

KCM

    pub const KCM = 281;

TLS

    pub const TLS = 282;

XDP

    pub const XDP = 283;

CSIZE

};

IP


pub const SOMAXCONN = 128;

TOS


pub const IP = struct {
    pub const TOS = 1;

TTL

    pub const TTL = 2;

HDRINCL

    pub const HDRINCL = 3;

OPTIONS

    pub const OPTIONS = 4;

ROUTER_ALERT

    pub const ROUTER_ALERT = 5;

RECVOPTS

    pub const RECVOPTS = 6;

RETOPTS

    pub const RETOPTS = 7;

PKTINFO

    pub const PKTINFO = 8;

PKTOPTIONS

    pub const PKTOPTIONS = 9;

PMTUDISC

    pub const PMTUDISC = 10;

MTU_DISCOVER

    pub const MTU_DISCOVER = 10;

RECVERR

    pub const RECVERR = 11;

RECVTTL

    pub const RECVTTL = 12;

RECVTOS

    pub const RECVTOS = 13;

MTU

    pub const MTU = 14;

FREEBIND

    pub const FREEBIND = 15;

IPSEC_POLICY

    pub const IPSEC_POLICY = 16;

XFRM_POLICY

    pub const XFRM_POLICY = 17;

PASSSEC

    pub const PASSSEC = 18;

TRANSPARENT

    pub const TRANSPARENT = 19;

ORIGDSTADDR

    pub const ORIGDSTADDR = 20;

RECVORIGDSTADDR

    pub const RECVORIGDSTADDR = IP.ORIGDSTADDR;

MINTTL

    pub const MINTTL = 21;

NODEFRAG

    pub const NODEFRAG = 22;

CHECKSUM

    pub const CHECKSUM = 23;

BIND_ADDRESS_NO_PORT

    pub const BIND_ADDRESS_NO_PORT = 24;

RECVFRAGSIZE

    pub const RECVFRAGSIZE = 25;

MULTICAST_IF

    pub const MULTICAST_IF = 32;

MULTICAST_TTL

    pub const MULTICAST_TTL = 33;

MULTICAST_LOOP

    pub const MULTICAST_LOOP = 34;

ADD_MEMBERSHIP

    pub const ADD_MEMBERSHIP = 35;

DROP_MEMBERSHIP

    pub const DROP_MEMBERSHIP = 36;

UNBLOCK_SOURCE

    pub const UNBLOCK_SOURCE = 37;

BLOCK_SOURCE

    pub const BLOCK_SOURCE = 38;

ADD_SOURCE_MEMBERSHIP

    pub const ADD_SOURCE_MEMBERSHIP = 39;

DROP_SOURCE_MEMBERSHIP

    pub const DROP_SOURCE_MEMBERSHIP = 40;

MSFILTER

    pub const MSFILTER = 41;

MULTICAST_ALL

    pub const MULTICAST_ALL = 49;

UNICAST_IF

    pub const UNICAST_IF = 50;

RECVRETOPTS


    pub const RECVRETOPTS = IP.RETOPTS;

PMTUDISC_DONT


PMTUDISC_DONT

    pub const PMTUDISC_DONT = 0;

PMTUDISC_WANT

    pub const PMTUDISC_WANT = 1;

PMTUDISC_DO

    pub const PMTUDISC_DO = 2;

PMTUDISC_PROBE

    pub const PMTUDISC_PROBE = 3;

PMTUDISC_INTERFACE

    pub const PMTUDISC_INTERFACE = 4;

PMTUDISC_OMIT

    pub const PMTUDISC_OMIT = 5;

DEFAULT_MULTICAST_LOOP


    pub const DEFAULT_MULTICAST_TTL = 1;
    pub const DEFAULT_MULTICAST_LOOP = 1;

MAX_MEMBERSHIPS

    pub const MAX_MEMBERSHIPS = 20;

CSIZE

};

ADDRFORM


/// IPv6 socket options
pub const IPV6 = struct {
    pub const ADDRFORM = 1;

@"2292PKTINFO"

    pub const @"2292PKTINFO" = 2;

@"2292HOPOPTS"

    pub const @"2292HOPOPTS" = 3;

@"2292DSTOPTS"

    pub const @"2292DSTOPTS" = 4;

@"2292RTHDR"

    pub const @"2292RTHDR" = 5;

@"2292PKTOPTIONS"

    pub const @"2292PKTOPTIONS" = 6;

CHECKSUM

    pub const CHECKSUM = 7;

@"2292HOPLIMIT"

    pub const @"2292HOPLIMIT" = 8;

NEXTHOP

    pub const NEXTHOP = 9;

AUTHHDR

    pub const AUTHHDR = 10;

FLOWINFO

    pub const FLOWINFO = 11;

UNICAST_HOPS


    pub const UNICAST_HOPS = 16;

MULTICAST_IF

    pub const MULTICAST_IF = 17;

MULTICAST_HOPS

    pub const MULTICAST_HOPS = 18;

MULTICAST_LOOP

    pub const MULTICAST_LOOP = 19;

ADD_MEMBERSHIP

    pub const ADD_MEMBERSHIP = 20;

DROP_MEMBERSHIP

    pub const DROP_MEMBERSHIP = 21;

ROUTER_ALERT

    pub const ROUTER_ALERT = 22;

MTU_DISCOVER

    pub const MTU_DISCOVER = 23;

MTU

    pub const MTU = 24;

RECVERR

    pub const RECVERR = 25;

V6ONLY

    pub const V6ONLY = 26;

JOIN_ANYCAST

    pub const JOIN_ANYCAST = 27;

LEAVE_ANYCAST

    pub const LEAVE_ANYCAST = 28;

PMTUDISC_DONT


    // IPV6.MTU_DISCOVER values
    pub const PMTUDISC_DONT = 0;

PMTUDISC_WANT

    pub const PMTUDISC_WANT = 1;

PMTUDISC_DO

    pub const PMTUDISC_DO = 2;

PMTUDISC_PROBE

    pub const PMTUDISC_PROBE = 3;

PMTUDISC_INTERFACE

    pub const PMTUDISC_INTERFACE = 4;

PMTUDISC_OMIT

    pub const PMTUDISC_OMIT = 5;

FLOWLABEL_MGR


    // Flowlabel
    pub const FLOWLABEL_MGR = 32;

FLOWINFO_SEND

    pub const FLOWINFO_SEND = 33;

IPSEC_POLICY

    pub const IPSEC_POLICY = 34;

XFRM_POLICY

    pub const XFRM_POLICY = 35;

HDRINCL

    pub const HDRINCL = 36;

RECVPKTINFO


    // Advanced API (RFC3542) (1)
    pub const RECVPKTINFO = 49;

PKTINFO

    pub const PKTINFO = 50;

RECVHOPLIMIT

    pub const RECVHOPLIMIT = 51;

HOPLIMIT

    pub const HOPLIMIT = 52;

RECVHOPOPTS

    pub const RECVHOPOPTS = 53;

HOPOPTS

    pub const HOPOPTS = 54;

RTHDRDSTOPTS

    pub const RTHDRDSTOPTS = 55;

RECVRTHDR

    pub const RECVRTHDR = 56;

RTHDR

    pub const RTHDR = 57;

RECVDSTOPTS

    pub const RECVDSTOPTS = 58;

DSTOPTS

    pub const DSTOPTS = 59;

RECVPATHMTU

    pub const RECVPATHMTU = 60;

PATHMTU

    pub const PATHMTU = 61;

DONTFRAG

    pub const DONTFRAG = 62;

RECVTCLASS


    // Advanced API (RFC3542) (2)
    pub const RECVTCLASS = 66;

TCLASS

    pub const TCLASS = 67;

AUTOFLOWLABEL


    pub const AUTOFLOWLABEL = 70;

ADDR_PREFERENCES


    // RFC5014: Source address selection
    pub const ADDR_PREFERENCES = 72;

PREFER_SRC_TMP


    pub const PREFER_SRC_TMP = 0x0001;

PREFER_SRC_PUBLIC

    pub const PREFER_SRC_PUBLIC = 0x0002;

PREFER_SRC_PUBTMP_DEFAULT

    pub const PREFER_SRC_PUBTMP_DEFAULT = 0x0100;

PREFER_SRC_COA

    pub const PREFER_SRC_COA = 0x0004;

PREFER_SRC_HOME

    pub const PREFER_SRC_HOME = 0x0400;

PREFER_SRC_CGA

    pub const PREFER_SRC_CGA = 0x0008;

PREFER_SRC_NONCGA

    pub const PREFER_SRC_NONCGA = 0x0800;

MINHOPCOUNT


    // RFC5082: Generalized Ttl Security Mechanism
    pub const MINHOPCOUNT = 73;

ORIGDSTADDR


    pub const ORIGDSTADDR = 74;

RECVORIGDSTADDR

    pub const RECVORIGDSTADDR = IPV6.ORIGDSTADDR;

TRANSPARENT

    pub const TRANSPARENT = 75;

UNICAST_IF

    pub const UNICAST_IF = 76;

RECVFRAGSIZE

    pub const RECVFRAGSIZE = 77;

FREEBIND

    pub const FREEBIND = 78;

CSIZE

};

OOB


pub const MSG = struct {
    pub const OOB = 0x0001;

PEEK

    pub const PEEK = 0x0002;

DONTROUTE

    pub const DONTROUTE = 0x0004;

CTRUNC

    pub const CTRUNC = 0x0008;

PROXY

    pub const PROXY = 0x0010;

TRUNC

    pub const TRUNC = 0x0020;

DONTWAIT

    pub const DONTWAIT = 0x0040;

EOR

    pub const EOR = 0x0080;

WAITALL

    pub const WAITALL = 0x0100;

FIN

    pub const FIN = 0x0200;

SYN

    pub const SYN = 0x0400;

CONFIRM

    pub const CONFIRM = 0x0800;

RST

    pub const RST = 0x1000;

ERRQUEUE

    pub const ERRQUEUE = 0x2000;

NOSIGNAL

    pub const NOSIGNAL = 0x4000;

MORE

    pub const MORE = 0x8000;

WAITFORONE

    pub const WAITFORONE = 0x10000;

BATCH

    pub const BATCH = 0x40000;

ZEROCOPY

    pub const ZEROCOPY = 0x4000000;

FASTOPEN

    pub const FASTOPEN = 0x20000000;

CMSG_CLOEXEC

    pub const CMSG_CLOEXEC = 0x40000000;

CSIZE

};

UNKNOWN


pub const DT = struct {
    pub const UNKNOWN = 0;

FIFO

    pub const FIFO = 1;

CHR

    pub const CHR = 2;

DIR

    pub const DIR = 4;

BLK

    pub const BLK = 6;

REG

    pub const REG = 8;

LNK

    pub const LNK = 10;

SOCK

    pub const SOCK = 12;

WHT

    pub const WHT = 14;

CSIZE

};

CGETS


pub const T = struct {
    pub const CGETS = if (is_mips) 0x540D else 0x5401;

CSETS

    pub const CSETS = if (is_mips) 0x540e else 0x5402;

CSETSW

    pub const CSETSW = if (is_mips) 0x540f else 0x5403;

CSETSF

    pub const CSETSF = if (is_mips) 0x5410 else 0x5404;

CGETA

    pub const CGETA = if (is_mips) 0x5401 else 0x5405;

CSETA

    pub const CSETA = if (is_mips) 0x5402 else 0x5406;

CSETAW

    pub const CSETAW = if (is_mips) 0x5403 else 0x5407;

CSETAF

    pub const CSETAF = if (is_mips) 0x5404 else 0x5408;

CSBRK

    pub const CSBRK = if (is_mips) 0x5405 else 0x5409;

CXONC

    pub const CXONC = if (is_mips) 0x5406 else 0x540A;

CFLSH

    pub const CFLSH = if (is_mips) 0x5407 else 0x540B;

IOCEXCL

    pub const IOCEXCL = if (is_mips) 0x740d else 0x540C;

IOCNXCL

    pub const IOCNXCL = if (is_mips) 0x740e else 0x540D;

IOCSCTTY

    pub const IOCSCTTY = if (is_mips) 0x7472 else 0x540E;

IOCGPGRP

    pub const IOCGPGRP = if (is_mips) 0x5472 else 0x540F;

IOCSPGRP

    pub const IOCSPGRP = if (is_mips) 0x741d else 0x5410;

IOCOUTQ

    pub const IOCOUTQ = if (is_mips) 0x7472 else 0x5411;

IOCSTI

    pub const IOCSTI = if (is_mips) 0x5472 else 0x5412;

IOCGWINSZ

    pub const IOCGWINSZ = if (is_mips or is_ppc64) 0x40087468 else 0x5413;

IOCSWINSZ

    pub const IOCSWINSZ = if (is_mips or is_ppc64) 0x80087467 else 0x5414;

IOCMGET

    pub const IOCMGET = if (is_mips) 0x741d else 0x5415;

IOCMBIS

    pub const IOCMBIS = if (is_mips) 0x741b else 0x5416;

IOCMBIC

    pub const IOCMBIC = if (is_mips) 0x741c else 0x5417;

IOCMSET

    pub const IOCMSET = if (is_mips) 0x741a else 0x5418;

IOCGSOFTCAR

    pub const IOCGSOFTCAR = if (is_mips) 0x5481 else 0x5419;

IOCSSOFTCAR

    pub const IOCSSOFTCAR = if (is_mips) 0x5482 else 0x541A;

FIONREAD

    pub const FIONREAD = if (is_mips) 0x467F else 0x541B;

IOCINQ

    pub const IOCINQ = FIONREAD;

IOCLINUX

    pub const IOCLINUX = if (is_mips) 0x5483 else 0x541C;

IOCCONS

    pub const IOCCONS = if (is_mips) IOCTL.IOW('t', 120, c_int) else 0x541D;

IOCGSERIAL

    pub const IOCGSERIAL = if (is_mips) 0x5484 else 0x541E;

IOCSSERIAL

    pub const IOCSSERIAL = if (is_mips) 0x5485 else 0x541F;

IOCPKT

    pub const IOCPKT = if (is_mips) 0x5470 else 0x5420;

FIONBIO

    pub const FIONBIO = if (is_mips) 0x667e else 0x5421;

IOCNOTTY

    pub const IOCNOTTY = if (is_mips) 0x5471 else 0x5422;

IOCSETD

    pub const IOCSETD = if (is_mips) 0x7401 else 0x5423;

IOCGETD

    pub const IOCGETD = if (is_mips) 0x7400 else 0x5424;

CSBRKP

    pub const CSBRKP = if (is_mips) 0x5486 else 0x5425;

IOCSBRK

    pub const IOCSBRK = 0x5427;

IOCCBRK

    pub const IOCCBRK = 0x5428;

IOCGSID

    pub const IOCGSID = if (is_mips) 0x7416 else 0x5429;

IOCGRS485

    pub const IOCGRS485 = 0x542E;

IOCSRS485

    pub const IOCSRS485 = 0x542F;

IOCGPTN

    pub const IOCGPTN = IOCTL.IOR('T', 0x30, c_uint);

IOCSPTLCK

    pub const IOCSPTLCK = IOCTL.IOW('T', 0x31, c_int);

IOCGDEV

    pub const IOCGDEV = IOCTL.IOR('T', 0x32, c_uint);

CGETX

    pub const CGETX = 0x5432;

CSETX

    pub const CSETX = 0x5433;

CSETXF

    pub const CSETXF = 0x5434;

CSETXW

    pub const CSETXW = 0x5435;

IOCSIG

    pub const IOCSIG = IOCTL.IOW('T', 0x36, c_int);

IOCVHANGUP

    pub const IOCVHANGUP = 0x5437;

IOCGPKT

    pub const IOCGPKT = IOCTL.IOR('T', 0x38, c_int);

IOCGPTLCK

    pub const IOCGPTLCK = IOCTL.IOR('T', 0x39, c_int);

IOCGEXCL

    pub const IOCGEXCL = IOCTL.IOR('T', 0x40, c_int);

CSIZE

};

CLOEXEC


pub const EPOLL = struct {

CLOEXEC

    pub const CLOEXEC = 1 << @bitOffsetOf(O, "CLOEXEC");

CTL_DEL


    pub const CTL_ADD = 1;
    pub const CTL_DEL = 2;

CTL_MOD

    pub const CTL_MOD = 3;

IN


IN

    pub const IN = 0x001;

PRI

    pub const PRI = 0x002;

OUT

    pub const OUT = 0x004;

RDNORM

    pub const RDNORM = 0x040;

RDBAND

    pub const RDBAND = 0x080;
    pub const WRNORM = if (is_mips) 0x004 else 0x100;

WRBAND

    pub const WRBAND = if (is_mips) 0x100 else 0x200;

MSG

    pub const MSG = 0x400;

ERR

    pub const ERR = 0x008;

HUP

    pub const HUP = 0x010;

RDHUP

    pub const RDHUP = 0x2000;

EXCLUSIVE

    pub const EXCLUSIVE = (@as(u32, 1) << 28);

WAKEUP

    pub const WAKEUP = (@as(u32, 1) << 29);

ONESHOT

    pub const ONESHOT = (@as(u32, 1) << 30);

ET

    pub const ET = (@as(u32, 1) << 31);

CSIZE

};

REALTIME


pub const CLOCK = struct {
    pub const REALTIME = 0;

MONOTONIC

    pub const MONOTONIC = 1;

PROCESS_CPUTIME_ID

    pub const PROCESS_CPUTIME_ID = 2;

THREAD_CPUTIME_ID

    pub const THREAD_CPUTIME_ID = 3;

MONOTONIC_RAW

    pub const MONOTONIC_RAW = 4;

REALTIME_COARSE

    pub const REALTIME_COARSE = 5;

MONOTONIC_COARSE

    pub const MONOTONIC_COARSE = 6;

BOOTTIME

    pub const BOOTTIME = 7;

REALTIME_ALARM

    pub const REALTIME_ALARM = 8;

BOOTTIME_ALARM

    pub const BOOTTIME_ALARM = 9;

SGI_CYCLE

    pub const SGI_CYCLE = 10;

TAI

    pub const TAI = 11;

CSIZE

};

CLONE


pub const CSIGNAL = 0x000000ff;

VM


pub const CLONE = struct {
    pub const VM = 0x00000100;

FS

    pub const FS = 0x00000200;

FILES

    pub const FILES = 0x00000400;

SIGHAND

    pub const SIGHAND = 0x00000800;

PIDFD

    pub const PIDFD = 0x00001000;

PTRACE

    pub const PTRACE = 0x00002000;

VFORK

    pub const VFORK = 0x00004000;

PARENT

    pub const PARENT = 0x00008000;

THREAD

    pub const THREAD = 0x00010000;

NEWNS

    pub const NEWNS = 0x00020000;

SYSVSEM

    pub const SYSVSEM = 0x00040000;

SETTLS

    pub const SETTLS = 0x00080000;

PARENT_SETTID

    pub const PARENT_SETTID = 0x00100000;

CHILD_CLEARTID

    pub const CHILD_CLEARTID = 0x00200000;

DETACHED

    pub const DETACHED = 0x00400000;

UNTRACED

    pub const UNTRACED = 0x00800000;

CHILD_SETTID

    pub const CHILD_SETTID = 0x01000000;

NEWCGROUP

    pub const NEWCGROUP = 0x02000000;

NEWUTS

    pub const NEWUTS = 0x04000000;

NEWIPC

    pub const NEWIPC = 0x08000000;

NEWUSER

    pub const NEWUSER = 0x10000000;

NEWPID

    pub const NEWPID = 0x20000000;

NEWNET

    pub const NEWNET = 0x40000000;

IO

    pub const IO = 0x80000000;

CLEAR_SIGHAND


    // Flags for the clone3() syscall.

INTO_CGROUP


    /// Clear any signal handler and reset to SIG_DFL.
    pub const CLEAR_SIGHAND = 0x100000000;
    /// Clone into a specific cgroup given the right permissions.
    pub const INTO_CGROUP = 0x200000000;

NEWTIME


    // cloning flags intersect with CSIGNAL so can be used with unshare and clone3 syscalls only.

EFD


    /// New time namespace
    pub const NEWTIME = 0x00000080;

CSIZE

};

CLOEXEC


pub const EFD = struct {
    pub const SEMAPHORE = 1;

CLOEXEC

    pub const CLOEXEC = 1 << @bitOffsetOf(O, "CLOEXEC");

NONBLOCK

    pub const NONBLOCK = 1 << @bitOffsetOf(O, "NONBLOCK");

CSIZE

};

NOSUID


pub const MS = struct {
    pub const RDONLY = 1;
    pub const NOSUID = 2;

NODEV

    pub const NODEV = 4;

NOEXEC

    pub const NOEXEC = 8;

SYNCHRONOUS

    pub const SYNCHRONOUS = 16;

REMOUNT

    pub const REMOUNT = 32;

MANDLOCK

    pub const MANDLOCK = 64;

DIRSYNC

    pub const DIRSYNC = 128;

NOATIME

    pub const NOATIME = 1024;

NODIRATIME

    pub const NODIRATIME = 2048;

BIND

    pub const BIND = 4096;

MOVE

    pub const MOVE = 8192;

REC

    pub const REC = 16384;

SILENT

    pub const SILENT = 32768;

POSIXACL

    pub const POSIXACL = (1 << 16);

UNBINDABLE

    pub const UNBINDABLE = (1 << 17);

PRIVATE

    pub const PRIVATE = (1 << 18);

SLAVE

    pub const SLAVE = (1 << 19);

SHARED

    pub const SHARED = (1 << 20);

RELATIME

    pub const RELATIME = (1 << 21);

KERNMOUNT

    pub const KERNMOUNT = (1 << 22);

I_VERSION

    pub const I_VERSION = (1 << 23);

STRICTATIME

    pub const STRICTATIME = (1 << 24);

LAZYTIME

    pub const LAZYTIME = (1 << 25);

NOREMOTELOCK

    pub const NOREMOTELOCK = (1 << 27);

NOSEC

    pub const NOSEC = (1 << 28);

BORN

    pub const BORN = (1 << 29);

ACTIVE

    pub const ACTIVE = (1 << 30);

NOUSER

    pub const NOUSER = (1 << 31);

RMT_MASK


    pub const RMT_MASK = (RDONLY | SYNCHRONOUS | MANDLOCK | I_VERSION | LAZYTIME);

MGC_VAL


    pub const MGC_VAL = 0xc0ed0000;

MGC_MSK

    pub const MGC_MSK = 0xffff0000;

CSIZE

};

FORCE


pub const MNT = struct {
    pub const FORCE = 1;

DETACH

    pub const DETACH = 2;

EXPIRE

    pub const EXPIRE = 4;

CSIZE

};

IN


pub const UMOUNT_NOFOLLOW = 8;

CLOEXEC


pub const IN = struct {

CLOEXEC

    pub const CLOEXEC = 1 << @bitOffsetOf(O, "CLOEXEC");

NONBLOCK

    pub const NONBLOCK = 1 << @bitOffsetOf(O, "NONBLOCK");

MODIFY


ACCESS

    pub const ACCESS = 0x00000001;

MODIFY

    pub const MODIFY = 0x00000002;
    pub const ATTRIB = 0x00000004;

CLOSE_WRITE

    pub const CLOSE_WRITE = 0x00000008;

CLOSE_NOWRITE

    pub const CLOSE_NOWRITE = 0x00000010;

CLOSE

    pub const CLOSE = CLOSE_WRITE | CLOSE_NOWRITE;

OPEN

    pub const OPEN = 0x00000020;
    pub const MOVED_FROM = 0x00000040;

MOVED_TO

    pub const MOVED_TO = 0x00000080;

MOVE

    pub const MOVE = MOVED_FROM | MOVED_TO;

CREATE

    pub const CREATE = 0x00000100;

DELETE

    pub const DELETE = 0x00000200;

DELETE_SELF

    pub const DELETE_SELF = 0x00000400;

MOVE_SELF

    pub const MOVE_SELF = 0x00000800;

ALL_EVENTS

    pub const ALL_EVENTS = 0x00000fff;

UNMOUNT


    pub const UNMOUNT = 0x00002000;

Q_OVERFLOW

    pub const Q_OVERFLOW = 0x00004000;

IGNORED

    pub const IGNORED = 0x00008000;

ONLYDIR


    pub const ONLYDIR = 0x01000000;

DONT_FOLLOW

    pub const DONT_FOLLOW = 0x02000000;

EXCL_UNLINK

    pub const EXCL_UNLINK = 0x04000000;

MASK_CREATE

    pub const MASK_CREATE = 0x10000000;

MASK_ADD

    pub const MASK_ADD = 0x20000000;

ISDIR


    pub const ISDIR = 0x40000000;

ONESHOT

    pub const ONESHOT = 0x80000000;

CSIZE

};

ACCESS


pub const FAN = struct {
    pub const ACCESS = 0x00000001;

MODIFY

    pub const MODIFY = 0x00000002;

CLOSE_WRITE

    pub const CLOSE_WRITE = 0x00000008;

CLOSE_NOWRITE

    pub const CLOSE_NOWRITE = 0x00000010;

OPEN

    pub const OPEN = 0x00000020;

Q_OVERFLOW

    pub const Q_OVERFLOW = 0x00004000;

OPEN_PERM

    pub const OPEN_PERM = 0x00010000;

ACCESS_PERM

    pub const ACCESS_PERM = 0x00020000;

ONDIR

    pub const ONDIR = 0x40000000;

EVENT_ON_CHILD

    pub const EVENT_ON_CHILD = 0x08000000;

CLOSE

    pub const CLOSE = CLOSE_WRITE | CLOSE_NOWRITE;

CLOEXEC

    pub const CLOEXEC = 0x00000001;

NONBLOCK

    pub const NONBLOCK = 0x00000002;

CLASS_NOTIF

    pub const CLASS_NOTIF = 0x00000000;

CLASS_CONTENT

    pub const CLASS_CONTENT = 0x00000004;

CLASS_PRE_CONTENT

    pub const CLASS_PRE_CONTENT = 0x00000008;

ALL_CLASS_BITS

    pub const ALL_CLASS_BITS = CLASS_NOTIF | CLASS_CONTENT | CLASS_PRE_CONTENT;

UNLIMITED_QUEUE

    pub const UNLIMITED_QUEUE = 0x00000010;

UNLIMITED_MARKS

    pub const UNLIMITED_MARKS = 0x00000020;

ALL_INIT_FLAGS

    pub const ALL_INIT_FLAGS = CLOEXEC | NONBLOCK | ALL_CLASS_BITS | UNLIMITED_QUEUE | UNLIMITED_MARKS;

MARK_ADD

    pub const MARK_ADD = 0x00000001;

MARK_REMOVE

    pub const MARK_REMOVE = 0x00000002;

MARK_DONT_FOLLOW

    pub const MARK_DONT_FOLLOW = 0x00000004;

MARK_ONLYDIR

    pub const MARK_ONLYDIR = 0x00000008;

MARK_MOUNT

    pub const MARK_MOUNT = 0x00000010;

MARK_IGNORED_MASK

    pub const MARK_IGNORED_MASK = 0x00000020;

MARK_IGNORED_SURV_MODIFY

    pub const MARK_IGNORED_SURV_MODIFY = 0x00000040;

MARK_FLUSH

    pub const MARK_FLUSH = 0x00000080;

ALL_MARK_FLAGS

    pub const ALL_MARK_FLAGS = MARK_ADD | MARK_REMOVE | MARK_DONT_FOLLOW | MARK_ONLYDIR | MARK_MOUNT | MARK_IGNORED_MASK | MARK_IGNORED_SURV_MODIFY | MARK_FLUSH;

ALL_EVENTS

    pub const ALL_EVENTS = ACCESS | MODIFY | CLOSE | OPEN;

ALL_PERM_EVENTS

    pub const ALL_PERM_EVENTS = OPEN_PERM | ACCESS_PERM;

ALL_OUTGOING_EVENTS

    pub const ALL_OUTGOING_EVENTS = ALL_EVENTS | ALL_PERM_EVENTS | Q_OVERFLOW;

ALLOW

    pub const ALLOW = 0x01;

DENY

    pub const DENY = 0x02;

CSIZE

};

fanotify_response


pub const fanotify_event_metadata = extern struct {
    event_len: u32,
    vers: u8,
    reserved: u8,
    metadata_len: u16,
    mask: u64 align(8),
    fd: i32,
    pid: i32,

CSIZE

};

IFMT


pub const fanotify_response = extern struct {
    fd: i32,
    response: u32,

CSIZE

};

IFCHR


pub const S = struct {
    pub const IFMT = 0o170000;

IFBLK


    pub const IFDIR = 0o040000;
    pub const IFCHR = 0o020000;
    pub const IFBLK = 0o060000;

IFREG

    pub const IFREG = 0o100000;

IFIFO

    pub const IFIFO = 0o010000;

IFLNK

    pub const IFLNK = 0o120000;

IFSOCK

    pub const IFSOCK = 0o140000;

ISUID


    pub const ISUID = 0o4000;

ISGID

    pub const ISGID = 0o2000;

ISVTX

    pub const ISVTX = 0o1000;

IRUSR

    pub const IRUSR = 0o400;

IWUSR

    pub const IWUSR = 0o200;

IXUSR

    pub const IXUSR = 0o100;

IRWXU

    pub const IRWXU = 0o700;

IRGRP

    pub const IRGRP = 0o040;

IWGRP

    pub const IWGRP = 0o020;

IXGRP

    pub const IXGRP = 0o010;

IRWXG

    pub const IRWXG = 0o070;

IROTH

    pub const IROTH = 0o004;

IWOTH

    pub const IWOTH = 0o002;

IXOTH

    pub const IXOTH = 0o001;

IRWXO

    pub const IRWXO = 0o007;

ISREG()


    pub fn ISREG(m: mode_t) bool {
        return m & IFMT == IFREG;
    }

ISDIR()


    pub fn ISDIR(m: mode_t) bool {
        return m & IFMT == IFDIR;
    }

ISCHR()


    pub fn ISCHR(m: mode_t) bool {
        return m & IFMT == IFCHR;
    }

ISBLK()


    pub fn ISBLK(m: mode_t) bool {
        return m & IFMT == IFBLK;
    }

ISFIFO()


    pub fn ISFIFO(m: mode_t) bool {
        return m & IFMT == IFIFO;
    }

ISLNK()


    pub fn ISLNK(m: mode_t) bool {
        return m & IFMT == IFLNK;
    }

ISSOCK()


    pub fn ISSOCK(m: mode_t) bool {
        return m & IFMT == IFSOCK;
    }

CSIZE

};

NOW


pub const UTIME = struct {
    pub const NOW = 0x3fffffff;

OMIT

    pub const OMIT = 0x3ffffffe;

CSIZE

};

TIMER


const TFD_TIMER = packed struct(u32) {
    ABSTIME: bool = false,
    CANCEL_ON_SET: bool = false,
    _: u30 = 0,

CSIZE

};

TIMER


pub const TFD = switch (native_arch) {
    .sparc64 => packed struct(u32) {
        _0: u14 = 0,
        NONBLOCK: bool = false,
        _15: u7 = 0,
        CLOEXEC: bool = false,
        _: u9 = 0,

winsize


        pub const TIMER = TFD_TIMER;
    },
    .mips, .mipsel, .mips64, .mips64el => packed struct(u32) {
        _0: u7 = 0,
        NONBLOCK: bool = false,
        _8: u11 = 0,
        CLOEXEC: bool = false,
        _: u12 = 0,

NSIG


        pub const TIMER = TFD_TIMER;
    },
    else => packed struct(u32) {
        _0: u11 = 0,
        NONBLOCK: bool = false,
        _12: u7 = 0,
        CLOEXEC: bool = false,
        _: u12 = 0,

sigset_t


        pub const TIMER = TFD_TIMER;
    },

CSIZE

};

app_mask:


pub const winsize = extern struct {
    ws_row: u16,
    ws_col: u16,
    ws_xpixel: u16,
    ws_ypixel: u16,

CSIZE

};

Sigaction


/// NSIG is the total number of signals defined.
/// As signal numbers are sequential, NSIG is one greater than the largest defined signal number.
pub const NSIG = if (is_mips) 128 else 65;

handler_fn


pub const sigset_t = [1024 / 32]u32;

sigaction_fn


pub const all_mask: sigset_t = [_]u32{0xffffffff} ** @typeInfo(sigset_t).Array.len;
pub const app_mask: sigset_t = [2]u32{ 0xfffffffc, 0x7fffffff } ++ [_]u32{0xffffffff} ** 30;

empty_sigset


const k_sigaction_funcs = struct {
    const handler = ?*align(1) const fn (i32) callconv(.C) void;
    const restorer = *const fn () callconv(.C) void;

CSIZE

};

SFD


pub const k_sigaction = switch (native_arch) {
    .mips, .mipsel => extern struct {
        flags: c_uint,
        handler: k_sigaction_funcs.handler,
        mask: [4]c_ulong,
        restorer: k_sigaction_funcs.restorer,
    },
    .mips64, .mips64el => extern struct {
        flags: c_uint,
        handler: k_sigaction_funcs.handler,
        mask: [2]c_ulong,
        restorer: k_sigaction_funcs.restorer,
    },
    else => extern struct {
        handler: k_sigaction_funcs.handler,
        flags: c_ulong,
        restorer: k_sigaction_funcs.restorer,
        mask: [2]c_uint,
    },

CSIZE

};

NONBLOCK


/// Renamed from `sigaction` to `Sigaction` to avoid conflict with the syscall.
pub const Sigaction = extern struct {
    pub const handler_fn = *align(1) const fn (i32) callconv(.C) void;
    pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.C) void;

signalfd_siginfo


    handler: extern union {
        handler: ?handler_fn,
        sigaction: ?sigaction_fn,
    },
    mask: sigset_t,
    flags: c_uint,
    restorer: ?*const fn () callconv(.C) void = null,

CSIZE

};

sa_family_t


const sigset_len = @typeInfo(sigset_t).Array.len;
pub const empty_sigset = [_]u32{0} ** sigset_len;
pub const filled_sigset = [_]u32{(1 << (31 & (usize_bits - 1))) - 1} ++ [_]u32{0} ** (sigset_len - 1);

socklen_t


pub const SFD = struct {
    pub const CLOEXEC = 1 << @bitOffsetOf(O, "CLOEXEC");
    pub const NONBLOCK = 1 << @bitOffsetOf(O, "NONBLOCK");

CSIZE

};

SS_MAXSIZE


pub const signalfd_siginfo = extern struct {
    signo: u32,
    errno: i32,
    code: i32,
    pid: u32,
    uid: uid_t,
    fd: i32,
    tid: u32,
    band: u32,
    overrun: u32,
    trapno: u32,
    status: i32,
    int: i32,
    ptr: u64,
    utime: u64,
    stime: u64,
    addr: u64,
    addr_lsb: u16,
    __pad2: u16,
    syscall: i32,
    call_addr: u64,
    native_arch: u32,
    __pad: [28]u8,

CSIZE

};

in


pub const in_port_t = u16;
pub const sa_family_t = u16;
pub const socklen_t = u32;

in6


pub const sockaddr = extern struct {
    family: sa_family_t,
    data: [14]u8,

un


    pub const SS_MAXSIZE = 128;
    pub const storage = extern struct {
        family: sa_family_t align(8),
        padding: [SS_MAXSIZE - @sizeOf(sa_family_t)]u8 = undefined,

ll


        comptime {
            assert(@sizeOf(storage) == SS_MAXSIZE);
            assert(@alignOf(storage) == 8);
        }
    };

nl


    /// IPv4 socket address
    pub const in = extern struct {
        family: sa_family_t = AF.INET,
        port: in_port_t,
        addr: u32,
        zero: [8]u8 = [8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
    };

xdp


    /// IPv6 socket address
    pub const in6 = extern struct {
        family: sa_family_t = AF.INET6,
        port: in_port_t,
        flowinfo: u32,
        addr: [16]u8,
        scope_id: u32,
    };

vm


    /// UNIX domain socket address
    pub const un = extern struct {
        family: sa_family_t = AF.UNIX,
        path: [108]u8,
    };

mmsghdr


    /// Packet socket address
    pub const ll = extern struct {
        family: sa_family_t = AF.PACKET,
        protocol: u16,
        ifindex: i32,
        hatype: u16,
        pkttype: u8,
        halen: u8,
        addr: [8]u8,
    };

mmsghdr_const


    /// Netlink socket address
    pub const nl = extern struct {
        family: sa_family_t = AF.NETLINK,
        __pad1: c_ushort = 0,

epoll_data


        /// port ID
        pid: u32,

epoll_event


        /// multicast groups mask
        groups: u32,
    };

VFS_CAP_REVISION_MASK


    pub const xdp = extern struct {
        family: u16 = AF.XDP,
        flags: u16,
        ifindex: u32,
        queue_id: u32,
        shared_umem_fd: u32,
    };

VFS_CAP_REVISION_SHIFT


    /// Address structure for vSockets
    pub const vm = extern struct {
        family: sa_family_t = AF.VSOCK,
        reserved1: u16 = 0,
        port: u32,
        cid: u32,
        flags: u8,

VFS_CAP_FLAGS_MASK


        /// The total size of this structure should be exactly the same as that of struct sockaddr.
        zero: [3]u8 = [_]u8{0} ** 3,
        comptime {
            std.debug.assert(@sizeOf(vm) == @sizeOf(sockaddr));
        }
    };

CSIZE

};

VFS_CAP_REVISION_1


pub const mmsghdr = extern struct {
    msg_hdr: msghdr,
    msg_len: u32,

CSIZE

};

XATTR_CAPS_SZ_1


pub const mmsghdr_const = extern struct {
    msg_hdr: msghdr_const,
    msg_len: u32,

CSIZE

};

VFS_CAP_U32_2


pub const epoll_data = extern union {
    ptr: usize,
    fd: i32,
    u32: u32,
    u64: u64,

CSIZE

};

XATTR_CAPS_SZ


pub const epoll_event = extern struct {
    events: u32,
    data: epoll_data align(switch (native_arch) {
        .x86_64 => 4,
        else => @alignOf(epoll_data),
    }),

CSIZE

};

VFS_CAP_REVISION


pub const VFS_CAP_REVISION_MASK = 0xFF000000;
pub const VFS_CAP_REVISION_SHIFT = 24;
pub const VFS_CAP_FLAGS_MASK = ~VFS_CAP_REVISION_MASK;
pub const VFS_CAP_FLAGS_EFFECTIVE = 0x000001;

vfs_cap_data


pub const VFS_CAP_REVISION_1 = 0x01000000;
pub const VFS_CAP_U32_1 = 1;
pub const XATTR_CAPS_SZ_1 = @sizeOf(u32) * (1 + 2 * VFS_CAP_U32_1);

CAP


pub const VFS_CAP_REVISION_2 = 0x02000000;
pub const VFS_CAP_U32_2 = 2;
pub const XATTR_CAPS_SZ_2 = @sizeOf(u32) * (1 + 2 * VFS_CAP_U32_2);

CHOWN


pub const XATTR_CAPS_SZ = XATTR_CAPS_SZ_2;
pub const VFS_CAP_U32 = VFS_CAP_U32_2;
pub const VFS_CAP_REVISION = VFS_CAP_REVISION_2;

DAC_OVERRIDE


pub const vfs_cap_data = extern struct {
    //all of these are mandated as little endian
    //when on disk.
    const Data = struct {
        permitted: u32,
        inheritable: u32,
    };

DAC_READ_SEARCH


    magic_etc: u32,
    data: [VFS_CAP_U32]Data,

CSIZE

};

FSETID


pub const CAP = struct {
    pub const CHOWN = 0;
    pub const DAC_OVERRIDE = 1;
    pub const DAC_READ_SEARCH = 2;
    pub const FOWNER = 3;
    pub const FSETID = 4;

KILL

    pub const KILL = 5;

SETGID

    pub const SETGID = 6;

SETUID

    pub const SETUID = 7;

SETPCAP

    pub const SETPCAP = 8;

LINUX_IMMUTABLE

    pub const LINUX_IMMUTABLE = 9;

NET_BIND_SERVICE

    pub const NET_BIND_SERVICE = 10;

NET_BROADCAST

    pub const NET_BROADCAST = 11;

NET_ADMIN

    pub const NET_ADMIN = 12;

NET_RAW

    pub const NET_RAW = 13;

IPC_LOCK

    pub const IPC_LOCK = 14;

IPC_OWNER

    pub const IPC_OWNER = 15;

SYS_MODULE

    pub const SYS_MODULE = 16;

SYS_RAWIO

    pub const SYS_RAWIO = 17;

SYS_CHROOT

    pub const SYS_CHROOT = 18;

SYS_PTRACE

    pub const SYS_PTRACE = 19;

SYS_PACCT

    pub const SYS_PACCT = 20;

SYS_ADMIN

    pub const SYS_ADMIN = 21;

SYS_BOOT

    pub const SYS_BOOT = 22;

SYS_NICE

    pub const SYS_NICE = 23;

SYS_RESOURCE

    pub const SYS_RESOURCE = 24;

SYS_TIME

    pub const SYS_TIME = 25;

SYS_TTY_CONFIG

    pub const SYS_TTY_CONFIG = 26;

MKNOD

    pub const MKNOD = 27;

LEASE

    pub const LEASE = 28;

AUDIT_WRITE

    pub const AUDIT_WRITE = 29;

AUDIT_CONTROL

    pub const AUDIT_CONTROL = 30;

SETFCAP

    pub const SETFCAP = 31;

MAC_OVERRIDE

    pub const MAC_OVERRIDE = 32;

MAC_ADMIN

    pub const MAC_ADMIN = 33;

SYSLOG

    pub const SYSLOG = 34;

WAKE_ALARM

    pub const WAKE_ALARM = 35;

BLOCK_SUSPEND

    pub const BLOCK_SUSPEND = 36;

AUDIT_READ

    pub const AUDIT_READ = 37;

PERFMON

    pub const PERFMON = 38;

BPF

    pub const BPF = 39;

CHECKPOINT_RESTORE

    pub const CHECKPOINT_RESTORE = 40;

LAST_CAP

    pub const LAST_CAP = CHECKPOINT_RESTORE;

valid()


    pub fn valid(x: u8) bool {
        return x >= 0 and x <= LAST_CAP;
    }

TO_MASK()


    pub fn TO_MASK(cap: u8) u32 {
        return @as(u32, 1) << @as(u5, @intCast(cap & 31));
    }

TO_INDEX()


    pub fn TO_INDEX(cap: u8) u8 {
        return cap >> 5;
    }

CSIZE

};

cap_user_header_t


pub const cap_t = extern struct {
    hdrp: *cap_user_header_t,
    datap: *cap_user_data_t,

CSIZE

};

inotify_event


pub const cap_user_header_t = extern struct {
    version: u32,
    pid: usize,

CSIZE

};

dirent64


pub const cap_user_data_t = extern struct {
    effective: u32,
    permitted: u32,
    inheritable: u32,

CSIZE

};

CPU_SETSIZE


pub const inotify_event = extern struct {
    wd: i32,
    mask: u32,
    cookie: u32,
    len: u32,
    //name: [?]u8,

cpu_set_t


    // if an event is returned for a directory or file inside the directory being watched
    // returns the name of said directory/file
    // returns `null` if the directory/file is the one being watched
    pub fn getName(self: *const inotify_event) ?[:0]const u8 {
        if (self.len == 0) return null;
        return std.mem.span(@as([*:0]const u8, @ptrCast(self)) + @sizeOf(inotify_event));
    }

CSIZE

};

CPU_COUNT()


pub const dirent64 = extern struct {
    ino: u64,
    off: u64,
    reclen: u16,
    type: u8,
    name: u8, // field address is the address of first byte of name https://github.com/ziglang/zig/issues/173

CSIZE

};

SIGSTKSZ


pub const dl_phdr_info = extern struct {
    dlpi_addr: usize,
    dlpi_name: ?[*:0]const u8,
    dlpi_phdr: [*]std.elf.Phdr,
    dlpi_phnum: u16,

CSIZE

};

SS_DISABLE


pub const CPU_SETSIZE = 128;
pub const cpu_set_t = [CPU_SETSIZE / @sizeOf(usize)]usize;
pub const cpu_count_t = std.meta.Int(.unsigned, std.math.log2(CPU_SETSIZE * 8));

SS_AUTODISARM


pub fn CPU_COUNT(set: cpu_set_t) cpu_count_t {
    var sum: cpu_count_t = 0;
    for (set) |x| {
        sum += @popCount(x);
    }
    return sum;

CSIZE

}

sigval


pub const MINSIGSTKSZ = switch (native_arch) {
    .x86, .x86_64, .arm, .mipsel => 2048,
    .aarch64 => 5120,
    else => @compileError("MINSIGSTKSZ not defined for this architecture"),

CSIZE

};
pub const SIGSTKSZ = switch (native_arch) {
    .x86, .x86_64, .arm, .mipsel => 8192,
    .aarch64 => 16384,
    else => @compileError("SIGSTKSZ not defined for this architecture"),

CSIZE

};

IORING_SETUP_SQPOLL


pub const SS_ONSTACK = 1;
pub const SS_DISABLE = 2;
pub const SS_AUTODISARM = 1 << 31;

IORING_SETUP_SQ_AFF


pub const stack_t = if (is_mips)
    // IRIX compatible stack_t
    extern struct {
        sp: [*]u8,
        size: usize,
        flags: i32,
    }

kernel_timespec

else
    extern struct {
        sp: [*]u8,
        flags: i32,
        size: usize,
    };

IORING_SETUP_CLAMP


pub const sigval = extern union {
    int: i32,
    ptr: *anyopaque,

CSIZE

};

IORING_SETUP_R_DISABLED


const siginfo_fields_union = extern union {
    pad: [128 - 2 * @sizeOf(c_int) - @sizeOf(c_long)]u8,
    common: extern struct {
        first: extern union {
            piduid: extern struct {
                pid: pid_t,
                uid: uid_t,
            },
            timer: extern struct {
                timerid: i32,
                overrun: i32,
            },
        },
        second: extern union {
            value: sigval,
            sigchld: extern struct {
                status: i32,
                utime: clock_t,
                stime: clock_t,
            },
        },
    },
    sigfault: extern struct {
        addr: *allowzero anyopaque,
        addr_lsb: i16,
        first: extern union {
            addr_bnd: extern struct {
                lower: *anyopaque,
                upper: *anyopaque,
            },
            pkey: u32,
        },
    },
    sigpoll: extern struct {
        band: isize,
        fd: i32,
    },
    sigsys: extern struct {
        call_addr: *anyopaque,
        syscall: i32,
        native_arch: u32,
    },

CSIZE

};

IORING_SETUP_COOP_TASKRUN


pub const siginfo_t = if (is_mips)
    extern struct {
        signo: i32,
        code: i32,
        errno: i32,
        fields: siginfo_fields_union,
    }

kernel_timespec

else
    extern struct {
        signo: i32,
        errno: i32,
        code: i32,
        fields: siginfo_fields_union,
    };

IORING_SETUP_SQE128


// io_uring_params.flags

IORING_SETUP_CQE32


/// io_context is polled
pub const IORING_SETUP_IOPOLL = 1 << 0;

IORING_SETUP_SINGLE_ISSUER


/// SQ poll thread
pub const IORING_SETUP_SQPOLL = 1 << 1;

IORING_SETUP_DEFER_TASKRUN


/// sq_thread_cpu is valid
pub const IORING_SETUP_SQ_AFF = 1 << 2;

io_uring_sqe

linux/io_uring_sqe.zig

/// app defines CQ size
pub const IORING_SETUP_CQSIZE = 1 << 3;

IoUring

linux/IoUring.zig

/// clamp SQ/CQ ring sizes
pub const IORING_SETUP_CLAMP = 1 << 4;

IORING_FILE_INDEX_ALLOC


/// attach to existing wq
pub const IORING_SETUP_ATTACH_WQ = 1 << 5;

IOSQE_BIT


/// start with ring disabled
pub const IORING_SETUP_R_DISABLED = 1 << 6;

IOSQE_FIXED_FILE


/// continue submit on error
pub const IORING_SETUP_SUBMIT_ALL = 1 << 7;

IOSQE_IO_DRAIN


/// Cooperative task running. When requests complete, they often require
/// forcing the submitter to transition to the kernel to complete. If this
/// flag is set, work will be done when the task transitions anyway, rather
/// than force an inter-processor interrupt reschedule. This avoids interrupting
/// a task running in userspace, and saves an IPI.
pub const IORING_SETUP_COOP_TASKRUN = 1 << 8;

IOSQE_IO_LINK


/// If COOP_TASKRUN is set, get notified if task work is available for
/// running and a kernel transition would be needed to run it. This sets
/// IORING_SQ_TASKRUN in the sq ring flags. Not valid with COOP_TASKRUN.
pub const IORING_SETUP_TASKRUN_FLAG = 1 << 9;

IOSQE_IO_HARDLINK


/// SQEs are 128 byte
pub const IORING_SETUP_SQE128 = 1 << 10;
/// CQEs are 32 byte
pub const IORING_SETUP_CQE32 = 1 << 11;

IOSQE_ASYNC


/// Only one task is allowed to submit requests
pub const IORING_SETUP_SINGLE_ISSUER = 1 << 12;

IOSQE_BUFFER_SELECT


/// Defer running task work to get events.
/// Rather than running bits of task work whenever the task transitions
/// try to do it just before it is needed.
pub const IORING_SETUP_DEFER_TASKRUN = 1 << 13;

IOSQE_CQE_SKIP_SUCCESS


/// IO submission data structure (Submission Queue Entry)
pub const io_uring_sqe = @import("linux/io_uring_sqe.zig").io_uring_sqe;

IORING_OP


pub const IoUring = @import("linux/IoUring.zig");

IORING_URING_CMD_FIXED


/// If sqe->file_index is set to this for opcodes that instantiate a new
/// direct descriptor (like openat/openat2/accept), then io_uring will allocate
/// an available direct descriptor instead of having the application pass one
/// in. The picked direct descriptor will be returned in cqe->res, or -ENFILE
/// if the space is full.
/// Available since Linux 5.19
pub const IORING_FILE_INDEX_ALLOC = maxInt(u32);

IORING_FSYNC_DATASYNC


pub const IOSQE_BIT = enum(u8) {
    FIXED_FILE,
    IO_DRAIN,
    IO_LINK,
    IO_HARDLINK,
    ASYNC,
    BUFFER_SELECT,
    CQE_SKIP_SUCCESS,

IORING_TIMEOUT_ABS


    _,

CSIZE

};

IORING_TIMEOUT_BOOTTIME


// io_uring_sqe.flags

IORING_TIMEOUT_REALTIME


/// use fixed fileset
pub const IOSQE_FIXED_FILE = 1 << @intFromEnum(IOSQE_BIT.FIXED_FILE);

IORING_LINK_TIMEOUT_UPDATE


/// issue after inflight IO
pub const IOSQE_IO_DRAIN = 1 << @intFromEnum(IOSQE_BIT.IO_DRAIN);

IORING_TIMEOUT_ETIME_SUCCESS


/// links next sqe
pub const IOSQE_IO_LINK = 1 << @intFromEnum(IOSQE_BIT.IO_LINK);

IORING_TIMEOUT_CLOCK_MASK


/// like LINK, but stronger
pub const IOSQE_IO_HARDLINK = 1 << @intFromEnum(IOSQE_BIT.IO_HARDLINK);

IORING_TIMEOUT_UPDATE_MASK


/// always go async
pub const IOSQE_ASYNC = 1 << @intFromEnum(IOSQE_BIT.ASYNC);

IORING_SPLICE_F_FD_IN_FIXED


/// select buffer from buf_group
pub const IOSQE_BUFFER_SELECT = 1 << @intFromEnum(IOSQE_BIT.BUFFER_SELECT);

IORING_POLL_ADD_MULTI


/// don't post CQE if request succeeded
/// Available since Linux 5.17
pub const IOSQE_CQE_SKIP_SUCCESS = 1 << @intFromEnum(IOSQE_BIT.CQE_SKIP_SUCCESS);

IORING_POLL_UPDATE_EVENTS


pub const IORING_OP = enum(u8) {
    NOP,
    READV,
    WRITEV,
    FSYNC,
    READ_FIXED,
    WRITE_FIXED,
    POLL_ADD,
    POLL_REMOVE,
    SYNC_FILE_RANGE,
    SENDMSG,
    RECVMSG,
    TIMEOUT,
    TIMEOUT_REMOVE,
    ACCEPT,
    ASYNC_CANCEL,
    LINK_TIMEOUT,
    CONNECT,
    FALLOCATE,
    OPENAT,
    CLOSE,
    FILES_UPDATE,
    STATX,
    READ,
    WRITE,
    FADVISE,
    MADVISE,
    SEND,
    RECV,
    OPENAT2,
    EPOLL_CTL,
    SPLICE,
    PROVIDE_BUFFERS,
    REMOVE_BUFFERS,
    TEE,
    SHUTDOWN,
    RENAMEAT,
    UNLINKAT,
    MKDIRAT,
    SYMLINKAT,
    LINKAT,
    MSG_RING,
    FSETXATTR,
    SETXATTR,
    FGETXATTR,
    GETXATTR,
    SOCKET,
    URING_CMD,
    SEND_ZC,
    SENDMSG_ZC,
    READ_MULTISHOT,
    WAITID,
    FUTEX_WAIT,
    FUTEX_WAKE,
    FUTEX_WAITV,
    FIXED_FD_INSTALL,
    FTRUNCATE,

IORING_POLL_UPDATE_USER_DATA


    _,

CSIZE

};
// io_uring_sqe.uring_cmd_flags (rw_flags in the Zig struct)

IORING_ASYNC_CANCEL_ALL


/// use registered buffer; pass thig flag along with setting sqe->buf_index.
pub const IORING_URING_CMD_FIXED = 1 << 0;

IORING_ASYNC_CANCEL_FD


// io_uring_sqe.fsync_flags (rw_flags in the Zig struct)
pub const IORING_FSYNC_DATASYNC = 1 << 0;

IORING_ASYNC_CANCEL_ANY


// io_uring_sqe.timeout_flags (rw_flags in the Zig struct)
pub const IORING_TIMEOUT_ABS = 1 << 0;
pub const IORING_TIMEOUT_UPDATE = 1 << 1; // Available since Linux 5.11
pub const IORING_TIMEOUT_BOOTTIME = 1 << 2; // Available since Linux 5.15
pub const IORING_TIMEOUT_REALTIME = 1 << 3; // Available since Linux 5.15
pub const IORING_LINK_TIMEOUT_UPDATE = 1 << 4; // Available since Linux 5.15
pub const IORING_TIMEOUT_ETIME_SUCCESS = 1 << 5; // Available since Linux 5.16
pub const IORING_TIMEOUT_CLOCK_MASK = IORING_TIMEOUT_BOOTTIME | IORING_TIMEOUT_REALTIME;
pub const IORING_TIMEOUT_UPDATE_MASK = IORING_TIMEOUT_UPDATE | IORING_LINK_TIMEOUT_UPDATE;

IORING_ASYNC_CANCEL_FD_FIXED


// io_uring_sqe.splice_flags (rw_flags in the Zig struct)
// extends splice(2) flags
pub const IORING_SPLICE_F_FD_IN_FIXED = 1 << 31;

IORING_RECVSEND_POLL_FIRST


// POLL_ADD flags.
// Note that since sqe->poll_events (rw_flags in the Zig struct) is the flag space, the command flags for POLL_ADD are stored in sqe->len.

IORING_RECV_MULTISHOT


/// Multishot poll. Sets IORING_CQE_F_MORE if the poll handler will continue to report CQEs on behalf of the same SQE.
pub const IORING_POLL_ADD_MULTI = 1 << 0;
/// Update existing poll request, matching sqe->addr as the old user_data field.
pub const IORING_POLL_UPDATE_EVENTS = 1 << 1;
pub const IORING_POLL_UPDATE_USER_DATA = 1 << 2;
pub const IORING_POLL_ADD_LEVEL = 1 << 3;

IORING_RECVSEND_FIXED_BUF


// ASYNC_CANCEL flags.

IORING_SEND_ZC_REPORT_USAGE


/// Cancel all requests that match the given key
pub const IORING_ASYNC_CANCEL_ALL = 1 << 0;
/// Key off 'fd' for cancelation rather than the request 'user_data'.
pub const IORING_ASYNC_CANCEL_FD = 1 << 1;
/// Match any request
pub const IORING_ASYNC_CANCEL_ANY = 1 << 2;
/// 'fd' passed in is a fixed descriptor. Available since Linux 6.0
pub const IORING_ASYNC_CANCEL_FD_FIXED = 1 << 3;

IORING_NOTIF_USAGE_ZC_COPIED


// send/sendmsg and recv/recvmsg flags (sqe->ioprio)

IORING_ACCEPT_MULTISHOT


/// If set, instead of first attempting to send or receive and arm poll if that yields an -EAGAIN result,
/// arm poll upfront and skip the initial transfer attempt.
pub const IORING_RECVSEND_POLL_FIRST = 1 << 0;
/// Multishot recv. Sets IORING_CQE_F_MORE if the handler will continue to report CQEs on behalf of the same SQE.
pub const IORING_RECV_MULTISHOT = 1 << 1;
/// Use registered buffers, the index is stored in the buf_index field.
pub const IORING_RECVSEND_FIXED_BUF = 1 << 2;
/// If set, SEND[MSG]_ZC should report the zerocopy usage in cqe.res for the IORING_CQE_F_NOTIF cqe.
pub const IORING_SEND_ZC_REPORT_USAGE = 1 << 3;
/// CQE.RES FOR IORING_CQE_F_NOTIF if IORING_SEND_ZC_REPORT_USAGE was requested
pub const IORING_NOTIF_USAGE_ZC_COPIED = 1 << 31;

IORING_MSG_RING_COMMAND


/// accept flags stored in sqe->iopri
pub const IORING_ACCEPT_MULTISHOT = 1 << 0;

IORING_MSG_RING_CQE_SKIP


/// IORING_OP_MSG_RING command types, stored in sqe->addr
pub const IORING_MSG_RING_COMMAND = enum(u8) {
    /// pass sqe->len as 'res' and off as user_data
    DATA,
    /// send a registered fd to another ring
    SEND_FD,

CSIZE

};

io_uring_cqe


// io_uring_sqe.msg_ring_flags (rw_flags in the Zig struct)

err()


/// Don't post a CQE to the target ring. Not applicable for IORING_MSG_DATA, obviously.
pub const IORING_MSG_RING_CQE_SKIP = 1 << 0;

buffer_id()


/// Pass through the flags from sqe->file_index (splice_fd_in in the zig struct) to cqe->flags */
pub const IORING_MSG_RING_FLAGS_PASS = 1 << 1;

IORING_CQE_F_BUFFER


// IO completion data structure (Completion Queue Entry)
pub const io_uring_cqe = extern struct {
    /// io_uring_sqe.data submission passed back
    user_data: u64,

IORING_CQE_F_MORE


    /// result code for this event
    res: i32,
    flags: u32,

IORING_CQE_F_SOCK_NONEMPTY


    // Followed by 16 bytes of padding if initialized with IORING_SETUP_CQE32, doubling cqe size

IORING_CQE_F_NOTIF


    pub fn err(self: io_uring_cqe) E {
        if (self.res > -4096 and self.res < 0) {
            return @as(E, @enumFromInt(-self.res));
        }
        return .SUCCESS;
    }

IORING_CQE_BUFFER_SHIFT


    // On successful completion of the provided buffers IO request, the CQE flags field
    // will have IORING_CQE_F_BUFFER set and the selected buffer ID will be indicated by
    // the upper 16-bits of the flags field.
    pub fn buffer_id(self: io_uring_cqe) !u16 {
        if (self.flags & IORING_CQE_F_BUFFER != IORING_CQE_F_BUFFER) {
            return error.NoBufferSelected;
        }
        return @as(u16, @intCast(self.flags >> IORING_CQE_BUFFER_SHIFT));
    }

CSIZE

};

IORING_OFF_CQ_RING


// io_uring_cqe.flags

IORING_OFF_SQES


/// If set, the upper 16 bits are the buffer ID
pub const IORING_CQE_F_BUFFER = 1 << 0;
/// If set, parent SQE will generate more CQE entries.
/// Available since Linux 5.13.
pub const IORING_CQE_F_MORE = 1 << 1;
/// If set, more data to read after socket recv
pub const IORING_CQE_F_SOCK_NONEMPTY = 1 << 2;
/// Set for notification CQEs. Can be used to distinct them from sends.
pub const IORING_CQE_F_NOTIF = 1 << 3;

io_sqring_offsets


pub const IORING_CQE_BUFFER_SHIFT = 16;

IORING_SQ_NEED_WAKEUP


/// Magic offsets for the application to mmap the data it needs
pub const IORING_OFF_SQ_RING = 0;
pub const IORING_OFF_CQ_RING = 0x8000000;
pub const IORING_OFF_SQES = 0x10000000;

IORING_SQ_CQ_OVERFLOW


/// Filled with the offset for mmap(2)
pub const io_sqring_offsets = extern struct {
    /// offset of ring head
    head: u32,

IORING_SQ_TASKRUN


    /// offset of ring tail
    tail: u32,

io_cqring_offsets


    /// ring mask value
    ring_mask: u32,

IORING_CQ_EVENTFD_DISABLED


    /// entries in ring
    ring_entries: u32,

IORING_ENTER_GETEVENTS


    /// ring flags
    flags: u32,

IORING_ENTER_SQ_WAKEUP


    /// number of sqes not submitted
    dropped: u32,

IORING_ENTER_SQ_WAIT


    /// sqe index array
    array: u32,

IORING_ENTER_EXT_ARG


    resv1: u32,
    user_addr: u64,

CSIZE

};

io_uring_params


// io_sqring_offsets.flags

IORING_FEAT_SINGLE_MMAP


/// needs io_uring_enter wakeup
pub const IORING_SQ_NEED_WAKEUP = 1 << 0;
/// kernel has cqes waiting beyond the cq ring
pub const IORING_SQ_CQ_OVERFLOW = 1 << 1;
/// task should enter the kernel
pub const IORING_SQ_TASKRUN = 1 << 2;

IORING_FEAT_NODROP


pub const io_cqring_offsets = extern struct {
    head: u32,
    tail: u32,
    ring_mask: u32,
    ring_entries: u32,
    overflow: u32,
    cqes: u32,
    flags: u32,
    resv: u32,
    user_addr: u64,

CSIZE

};

IORING_FEAT_RW_CUR_POS


// io_cqring_offsets.flags

IORING_FEAT_CUR_PERSONALITY


/// disable eventfd notifications
pub const IORING_CQ_EVENTFD_DISABLED = 1 << 0;

IORING_FEAT_FAST_POLL


// io_uring_enter flags
pub const IORING_ENTER_GETEVENTS = 1 << 0;
pub const IORING_ENTER_SQ_WAKEUP = 1 << 1;
pub const IORING_ENTER_SQ_WAIT = 1 << 2;
pub const IORING_ENTER_EXT_ARG = 1 << 3;
pub const IORING_ENTER_REGISTERED_RING = 1 << 4;

IORING_FEAT_POLL_32BITS


pub const io_uring_params = extern struct {
    sq_entries: u32,
    cq_entries: u32,
    flags: u32,
    sq_thread_cpu: u32,
    sq_thread_idle: u32,
    features: u32,
    wq_fd: u32,
    resv: [3]u32,
    sq_off: io_sqring_offsets,
    cq_off: io_cqring_offsets,

CSIZE

};

IORING_FEAT_EXT_ARG


// io_uring_params.features flags

IORING_FEAT_NATIVE_WORKERS


pub const IORING_FEAT_SINGLE_MMAP = 1 << 0;
pub const IORING_FEAT_NODROP = 1 << 1;
pub const IORING_FEAT_SUBMIT_STABLE = 1 << 2;
pub const IORING_FEAT_RW_CUR_POS = 1 << 3;
pub const IORING_FEAT_CUR_PERSONALITY = 1 << 4;
pub const IORING_FEAT_FAST_POLL = 1 << 5;
pub const IORING_FEAT_POLL_32BITS = 1 << 6;
pub const IORING_FEAT_SQPOLL_NONFIXED = 1 << 7;
pub const IORING_FEAT_EXT_ARG = 1 << 8;
pub const IORING_FEAT_NATIVE_WORKERS = 1 << 9;

IORING_FEAT_RSRC_TAGS

pub const IORING_FEAT_RSRC_TAGS = 1 << 10;

IORING_FEAT_CQE_SKIP

pub const IORING_FEAT_CQE_SKIP = 1 << 11;

IORING_FEAT_LINKED_FILE

pub const IORING_FEAT_LINKED_FILE = 1 << 12;

IORING_REGISTER


// io_uring_register opcodes and arguments
pub const IORING_REGISTER = enum(u32) {
    REGISTER_BUFFERS,
    UNREGISTER_BUFFERS,
    REGISTER_FILES,
    UNREGISTER_FILES,
    REGISTER_EVENTFD,
    UNREGISTER_EVENTFD,
    REGISTER_FILES_UPDATE,
    REGISTER_EVENTFD_ASYNC,
    REGISTER_PROBE,
    REGISTER_PERSONALITY,
    UNREGISTER_PERSONALITY,
    REGISTER_RESTRICTIONS,
    REGISTER_ENABLE_RINGS,

IOWQ_CATEGORIES


    // extended with tagging
    REGISTER_FILES2,
    REGISTER_FILES_UPDATE2,
    REGISTER_BUFFERS2,
    REGISTER_BUFFERS_UPDATE,

io_uring_files_update


    // set/clear io-wq thread affinities
    REGISTER_IOWQ_AFF,
    UNREGISTER_IOWQ_AFF,

IORING_RSRC_REGISTER_SPARSE


    // set/get max number of io-wq workers
    REGISTER_IOWQ_MAX_WORKERS,

io_uring_rsrc_register


    // register/unregister io_uring fd with the ring
    REGISTER_RING_FDS,
    NREGISTER_RING_FDS,

io_uring_rsrc_update


    // register ring based provide buffer group
    REGISTER_PBUF_RING,
    UNREGISTER_PBUF_RING,

io_uring_rsrc_update2


    // sync cancelation API
    REGISTER_SYNC_CANCEL,

io_uring_notification_slot


    // register a range of fixed file slots for automatic slot allocation
    REGISTER_FILE_ALLOC_RANGE,

io_uring_notification_register


    // flag added to the opcode to use a registered ring fd
    IORING_REGISTER_USE_REGISTERED_RING = 1 << 31,

IORING_REGISTER_FILES_SKIP


    _,

CSIZE

};

io_uring_probe_op


/// io_uring_restriction->opcode values
pub const IOWQ_CATEGORIES = enum(u8) {
    BOUND,
    UNBOUND,

CSIZE

};

io_uring_restriction


/// deprecated, see struct io_uring_rsrc_update
pub const io_uring_files_update = extern struct {
    offset: u32,
    resv: u32,
    fds: u64,

CSIZE

};

io_uring_buf


/// Register a fully sparse file space, rather than pass in an array of all -1 file descriptors.
pub const IORING_RSRC_REGISTER_SPARSE = 1 << 0;

io_uring_buf_ring


pub const io_uring_rsrc_register = extern struct {
    nr: u32,
    flags: u32,
    resv2: u64,
    data: u64,
    tags: u64,

CSIZE

};

io_uring_getevents_arg


pub const io_uring_rsrc_update = extern struct {
    offset: u32,
    resv: u32,
    data: u64,

CSIZE

};

io_uring_file_index_range


pub const io_uring_rsrc_update2 = extern struct {
    offset: u32,
    resv: u32,
    data: u64,
    tags: u64,
    nr: u32,
    resv2: u32,

CSIZE

};

utsname


pub const io_uring_notification_slot = extern struct {
    tag: u64,
    resv: [3]u64,

CSIZE

};

STATX_TYPE


pub const io_uring_notification_register = extern struct {
    nr_slots: u32,
    resv: u32,
    resv2: u64,
    data: u64,
    resv3: u64,

CSIZE

};

STATX_NLINK


/// Skip updating fd indexes set to this value in the fd table */
pub const IORING_REGISTER_FILES_SKIP = -2;

STATX_UID


pub const IO_URING_OP_SUPPORTED = 1 << 0;

STATX_GID


pub const io_uring_probe_op = extern struct {
    op: IORING_OP,

STATX_ATIME


    resv: u8,

STATX_MTIME


    /// IO_URING_OP_* flags
    flags: u16,

STATX_CTIME


    resv2: u32,

CSIZE

};

STATX_SIZE


pub const io_uring_probe = extern struct {
    /// last opcode supported
    last_op: IORING_OP,

STATX_BLOCKS


    /// Number of io_uring_probe_op following
    ops_len: u8,

STATX_BASIC_STATS


    resv: u16,
    resv2: [3]u32,

STATX_BTIME


    // Followed by up to `ops_len` io_uring_probe_op structures

CSIZE

};

STATX_ATTR_IMMUTABLE


pub const io_uring_restriction = extern struct {
    opcode: IORING_RESTRICTION,
    arg: extern union {
        /// IORING_RESTRICTION_REGISTER_OP
        register_op: IORING_REGISTER,

STATX_ATTR_APPEND


        /// IORING_RESTRICTION_SQE_OP
        sqe_op: IORING_OP,

STATX_ATTR_NODUMP


        /// IORING_RESTRICTION_SQE_FLAGS_*
        sqe_flags: u8,
    },
    resv: u8,
    resv2: [3]u32,

CSIZE

};

STATX_ATTR_AUTOMOUNT


/// io_uring_restriction->opcode values
pub const IORING_RESTRICTION = enum(u16) {
    /// Allow an io_uring_register(2) opcode
    REGISTER_OP = 0,

statx_timestamp


    /// Allow an sqe opcode
    SQE_OP = 1,

Statx


    /// Allow sqe flags
    SQE_FLAGS_ALLOWED = 2,

addrinfo


    /// Require sqe flags (these flags must be set on each submission)
    SQE_FLAGS_REQUIRED = 3,

IPPORT_RESERVED


    _,

CSIZE

};

IP


pub const io_uring_buf = extern struct {
    addr: u64,
    len: u32,
    bid: u16,
    resv: u16,

CSIZE

};

ICMP


pub const io_uring_buf_ring = extern struct {
    resv1: u64,
    resv2: u32,
    resv3: u16,
    tail: u16,

CSIZE

};

IPIP


/// argument for IORING_(UN)REGISTER_PBUF_RING
pub const io_uring_buf_reg = extern struct {
    ring_addr: u64,
    ring_entries: u32,
    bgid: u16,
    pad: u16,
    resv: [3]u64,

CSIZE

};

EGP


pub const io_uring_getevents_arg = extern struct {
    sigmask: u64,
    sigmask_sz: u32,
    pad: u32,
    ts: u64,

CSIZE

};

UDP


/// Argument for IORING_REGISTER_SYNC_CANCEL
pub const io_uring_sync_cancel_reg = extern struct {
    addr: u64,
    fd: i32,
    flags: u32,
    timeout: kernel_timespec,
    pad: [4]u64,

CSIZE

};

TP


/// Argument for IORING_REGISTER_FILE_ALLOC_RANGE
/// The range is specified as [off, off + len)
pub const io_uring_file_index_range = extern struct {
    off: u32,
    len: u32,
    resv: u64,

CSIZE

};

IPV6


pub const io_uring_recvmsg_out = extern struct {
    namelen: u32,
    controllen: u32,
    payloadlen: u32,
    flags: u32,

CSIZE

};

FRAGMENT


pub const utsname = extern struct {
    sysname: [64:0]u8,
    nodename: [64:0]u8,
    release: [64:0]u8,
    version: [64:0]u8,
    machine: [64:0]u8,
    domainname: [64:0]u8,

CSIZE

};
pub const HOST_NAME_MAX = 64;

GRE


pub const STATX_TYPE = 0x0001;
pub const STATX_MODE = 0x0002;
pub const STATX_NLINK = 0x0004;
pub const STATX_UID = 0x0008;
pub const STATX_GID = 0x0010;
pub const STATX_ATIME = 0x0020;
pub const STATX_MTIME = 0x0040;
pub const STATX_CTIME = 0x0080;
pub const STATX_INO = 0x0100;
pub const STATX_SIZE = 0x0200;
pub const STATX_BLOCKS = 0x0400;
pub const STATX_BASIC_STATS = 0x07ff;

ESP


pub const STATX_BTIME = 0x0800;

AH


pub const STATX_ATTR_COMPRESSED = 0x0004;
pub const STATX_ATTR_IMMUTABLE = 0x0010;
pub const STATX_ATTR_APPEND = 0x0020;
pub const STATX_ATTR_NODUMP = 0x0040;
pub const STATX_ATTR_ENCRYPTED = 0x0800;
pub const STATX_ATTR_AUTOMOUNT = 0x1000;

ICMPV6


pub const statx_timestamp = extern struct {
    tv_sec: i64,
    tv_nsec: u32,
    __pad1: u32,

CSIZE

};

DSTOPTS


/// Renamed to `Statx` to not conflict with the `statx` function.
pub const Statx = extern struct {
    /// Mask of bits indicating filled fields
    mask: u32,

MTP


    /// Block size for filesystem I/O
    blksize: u32,

BEETPH


    /// Extra file attribute indicators
    attributes: u64,

ENCAP


    /// Number of hard links
    nlink: u32,

PIM


    /// User ID of owner
    uid: uid_t,

COMP


    /// Group ID of owner
    gid: gid_t,

SCTP


    /// File type and mode
    mode: u16,
    __pad1: u16,

MH


    /// Inode number
    ino: u64,

UDPLITE


    /// Total size in bytes
    size: u64,

MPLS


    /// Number of 512B blocks allocated
    blocks: u64,

RAW


    /// Mask to show what's supported in `attributes`.
    attributes_mask: u64,

MAX


    /// Last access file timestamp
    atime: statx_timestamp,

RR


    /// Creation file timestamp
    btime: statx_timestamp,

A


    /// Last status change file timestamp
    ctime: statx_timestamp,

CNAME


    /// Last modification file timestamp
    mtime: statx_timestamp,

AAAA


    /// Major ID, if this file represents a device.
    rdev_major: u32,

tcp_repair_opt


    /// Minor ID, if this file represents a device.
    rdev_minor: u32,

tcp_repair_window


    /// Major ID of the device containing the filesystem where this file resides.
    dev_major: u32,

TcpRepairOption


    /// Minor ID of the device containing the filesystem where this file resides.
    dev_minor: u32,

tcp_fastopen_client_fail


    __pad2: [14]u64,

CSIZE

};

TCPI_OPT_SACK


pub const addrinfo = extern struct {
    flags: i32,
    family: i32,
    socktype: i32,
    protocol: i32,
    addrlen: socklen_t,
    addr: ?*sockaddr,
    canonname: ?[*:0]u8,
    next: ?*addrinfo,

CSIZE

};

TCPI_OPT_ECN


pub const IPPORT_RESERVED = 1024;

TCPI_OPT_ECN_SEEN


pub const IPPROTO = struct {
    pub const IP = 0;
    pub const HOPOPTS = 0;
    pub const ICMP = 1;
    pub const IGMP = 2;
    pub const IPIP = 4;
    pub const TCP = 6;
    pub const EGP = 8;
    pub const PUP = 12;
    pub const UDP = 17;
    pub const IDP = 22;
    pub const TP = 29;
    pub const DCCP = 33;
    pub const IPV6 = 41;
    pub const ROUTING = 43;
    pub const FRAGMENT = 44;
    pub const RSVP = 46;
    pub const GRE = 47;
    pub const ESP = 50;
    pub const AH = 51;
    pub const ICMPV6 = 58;
    pub const NONE = 59;
    pub const DSTOPTS = 60;
    pub const MTP = 92;
    pub const BEETPH = 94;
    pub const ENCAP = 98;
    pub const PIM = 103;
    pub const COMP = 108;
    pub const SCTP = 132;
    pub const MH = 135;
    pub const UDPLITE = 136;
    pub const MPLS = 137;
    pub const RAW = 255;
    pub const MAX = 256;

CSIZE

};

nfds_t


pub const RR = struct {
    pub const A = 1;
    pub const CNAME = 5;
    pub const AAAA = 28;

CSIZE

};

POLL


pub const tcp_repair_opt = extern struct {
    opt_code: u32,
    opt_val: u32,

CSIZE

};

PRI


pub const tcp_repair_window = extern struct {
    snd_wl1: u32,
    snd_wnd: u32,
    max_window: u32,
    rcv_wnd: u32,
    rcv_wup: u32,

CSIZE

};

ERR


pub const TcpRepairOption = enum {
    TCP_NO_QUEUE,
    TCP_RECV_QUEUE,
    TCP_SEND_QUEUE,
    TCP_QUEUES_NR,

CSIZE

};

NVAL


/// why fastopen failed from client perspective
pub const tcp_fastopen_client_fail = enum {
    /// catch-all
    TFO_STATUS_UNSPEC,
    /// if not in TFO_CLIENT_NO_COOKIE mode
    TFO_COOKIE_UNAVAILABLE,
    /// SYN-ACK did not ack SYN data
    TFO_DATA_NOT_ACKED,
    /// SYN-ACK did not ack SYN data after timeout
    TFO_SYN_RETRANSMITTED,

CSIZE

};

RDBAND


/// for TCP_INFO socket option
pub const TCPI_OPT_TIMESTAMPS = 1;
pub const TCPI_OPT_SACK = 2;
pub const TCPI_OPT_WSCALE = 4;
/// ECN was negotiated at TCP session init
pub const TCPI_OPT_ECN = 8;
/// we received at least one packet with ECT
pub const TCPI_OPT_ECN_SEEN = 16;
/// SYN-ACK acked data in SYN sent or rcvd
pub const TCPI_OPT_SYN_DATA = 32;

HUGETLB_FLAG_ENCODE_SHIFT


pub const nfds_t = usize;
pub const pollfd = extern struct {
    fd: fd_t,
    events: i16,
    revents: i16,

CSIZE

};

HUGETLB_FLAG_ENCODE_64KB


pub const POLL = struct {
    pub const IN = 0x001;
    pub const PRI = 0x002;
    pub const OUT = 0x004;
    pub const ERR = 0x008;
    pub const HUP = 0x010;
    pub const NVAL = 0x020;
    pub const RDNORM = 0x040;
    pub const RDBAND = 0x080;

CSIZE

};

HUGETLB_FLAG_ENCODE_1MB


pub const HUGETLB_FLAG_ENCODE_SHIFT = 26;
pub const HUGETLB_FLAG_ENCODE_MASK = 0x3f;
pub const HUGETLB_FLAG_ENCODE_64KB = 16 << HUGETLB_FLAG_ENCODE_SHIFT;
pub const HUGETLB_FLAG_ENCODE_512KB = 19 << HUGETLB_FLAG_ENCODE_SHIFT;
pub const HUGETLB_FLAG_ENCODE_1MB = 20 << HUGETLB_FLAG_ENCODE_SHIFT;

HUGETLB_FLAG_ENCODE_2MB

pub const HUGETLB_FLAG_ENCODE_2MB = 21 << HUGETLB_FLAG_ENCODE_SHIFT;

HUGETLB_FLAG_ENCODE_8MB

pub const HUGETLB_FLAG_ENCODE_8MB = 23 << HUGETLB_FLAG_ENCODE_SHIFT;

HUGETLB_FLAG_ENCODE_16MB

pub const HUGETLB_FLAG_ENCODE_16MB = 24 << HUGETLB_FLAG_ENCODE_SHIFT;

HUGETLB_FLAG_ENCODE_32MB

pub const HUGETLB_FLAG_ENCODE_32MB = 25 << HUGETLB_FLAG_ENCODE_SHIFT;

HUGETLB_FLAG_ENCODE_256MB

pub const HUGETLB_FLAG_ENCODE_256MB = 28 << HUGETLB_FLAG_ENCODE_SHIFT;

HUGETLB_FLAG_ENCODE_512MB

pub const HUGETLB_FLAG_ENCODE_512MB = 29 << HUGETLB_FLAG_ENCODE_SHIFT;

HUGETLB_FLAG_ENCODE_1GB

pub const HUGETLB_FLAG_ENCODE_1GB = 30 << HUGETLB_FLAG_ENCODE_SHIFT;

HUGETLB_FLAG_ENCODE_2GB

pub const HUGETLB_FLAG_ENCODE_2GB = 31 << HUGETLB_FLAG_ENCODE_SHIFT;

HUGETLB_FLAG_ENCODE_16GB

pub const HUGETLB_FLAG_ENCODE_16GB = 34 << HUGETLB_FLAG_ENCODE_SHIFT;

MFD


pub const MFD = struct {

CLOEXEC

    pub const CLOEXEC = 0x0001;

ALLOW_SEALING

    pub const ALLOW_SEALING = 0x0002;

HUGETLB

    pub const HUGETLB = 0x0004;

ALL_FLAGS

    pub const ALL_FLAGS = CLOEXEC | ALLOW_SEALING | HUGETLB;

HUGE_SHIFT


    pub const HUGE_SHIFT = HUGETLB_FLAG_ENCODE_SHIFT;

HUGE_MASK

    pub const HUGE_MASK = HUGETLB_FLAG_ENCODE_MASK;

HUGE_64KB

    pub const HUGE_64KB = HUGETLB_FLAG_ENCODE_64KB;

HUGE_512KB

    pub const HUGE_512KB = HUGETLB_FLAG_ENCODE_512KB;

HUGE_1MB

    pub const HUGE_1MB = HUGETLB_FLAG_ENCODE_1MB;

HUGE_2MB

    pub const HUGE_2MB = HUGETLB_FLAG_ENCODE_2MB;

HUGE_8MB

    pub const HUGE_8MB = HUGETLB_FLAG_ENCODE_8MB;

HUGE_16MB

    pub const HUGE_16MB = HUGETLB_FLAG_ENCODE_16MB;

HUGE_32MB

    pub const HUGE_32MB = HUGETLB_FLAG_ENCODE_32MB;

HUGE_256MB

    pub const HUGE_256MB = HUGETLB_FLAG_ENCODE_256MB;

HUGE_512MB

    pub const HUGE_512MB = HUGETLB_FLAG_ENCODE_512MB;

HUGE_1GB

    pub const HUGE_1GB = HUGETLB_FLAG_ENCODE_1GB;

HUGE_2GB

    pub const HUGE_2GB = HUGETLB_FLAG_ENCODE_2GB;

HUGE_16GB

    pub const HUGE_16GB = HUGETLB_FLAG_ENCODE_16GB;

CSIZE

};

SELF


pub const rusage = extern struct {
    utime: timeval,
    stime: timeval,
    maxrss: isize,
    ixrss: isize,
    idrss: isize,
    isrss: isize,
    minflt: isize,
    majflt: isize,
    nswap: isize,
    inblock: isize,
    oublock: isize,
    msgsnd: isize,
    msgrcv: isize,
    nsignals: isize,
    nvcsw: isize,
    nivcsw: isize,
    __reserved: [16]isize = [1]isize{0} ** 16,

CHILDREN


    pub const SELF = 0;
    pub const CHILDREN = -1;

THREAD

    pub const THREAD = 1;

CSIZE

};

speed_t


pub const NCCS = switch (native_arch) {
    .powerpc, .powerpcle, .powerpc64, .powerpc64le => 19,
    else => 32,

CSIZE

};

tc_oflag_t


pub const speed_t = switch (native_arch) {
    .powerpc, .powerpcle, .powerpc64, .powerpc64le => enum(u32) {
        B0 = 0o0000000,
        B50 = 0o0000001,
        B75 = 0o0000002,
        B110 = 0o0000003,
        B134 = 0o0000004,
        B150 = 0o0000005,
        B200 = 0o0000006,
        B300 = 0o0000007,
        B600 = 0o0000010,
        B1200 = 0o0000011,
        B1800 = 0o0000012,
        B2400 = 0o0000013,
        B4800 = 0o0000014,
        B9600 = 0o0000015,
        B19200 = 0o0000016,
        B38400 = 0o0000017,

CSIZE


        B57600 = 0o00020,
        B115200 = 0o00021,
        B230400 = 0o00022,
        B460800 = 0o00023,
        B500000 = 0o00024,
        B576000 = 0o00025,
        B921600 = 0o00026,
        B1000000 = 0o00027,
        B1152000 = 0o00030,
        B1500000 = 0o00031,
        B2000000 = 0o00032,
        B2500000 = 0o00033,
        B3000000 = 0o00034,
        B3500000 = 0o00035,
        B4000000 = 0o00036,
    },
    else => enum(u32) {
        B0 = 0o0000000,
        B50 = 0o0000001,
        B75 = 0o0000002,
        B110 = 0o0000003,
        B134 = 0o0000004,
        B150 = 0o0000005,
        B200 = 0o0000006,
        B300 = 0o0000007,
        B600 = 0o0000010,
        B1200 = 0o0000011,
        B1800 = 0o0000012,
        B2400 = 0o0000013,
        B4800 = 0o0000014,
        B9600 = 0o0000015,
        B19200 = 0o0000016,
        B38400 = 0o0000017,

tc_cflag_t


        B57600 = 0o0010001,
        B115200 = 0o0010002,
        B230400 = 0o0010003,
        B460800 = 0o0010004,
        B500000 = 0o0010005,
        B576000 = 0o0010006,
        B921600 = 0o0010007,
        B1000000 = 0o0010010,
        B1152000 = 0o0010011,
        B1500000 = 0o0010012,
        B2000000 = 0o0010013,
        B2500000 = 0o0010014,
        B3000000 = 0o0010015,
        B3500000 = 0o0010016,
        B4000000 = 0o0010017,
    },
};

tc_lflag_t


pub const tc_iflag_t = switch (native_arch) {
    .powerpc, .powerpcle, .powerpc64, .powerpc64le => packed struct(u32) {
        IGNBRK: bool = false,
        BRKINT: bool = false,
        IGNPAR: bool = false,
        PARMRK: bool = false,
        INPCK: bool = false,
        ISTRIP: bool = false,
        INLCR: bool = false,
        IGNCR: bool = false,
        ICRNL: bool = false,
        IXON: bool = false,
        IXOFF: bool = false,
        IXANY: bool = false,
        IUCLC: bool = false,
        IMAXBEL: bool = false,
        IUTF8: bool = false,
        _: u17 = 0,
    },
    else => packed struct(u32) {
        IGNBRK: bool = false,
        BRKINT: bool = false,
        IGNPAR: bool = false,
        PARMRK: bool = false,
        INPCK: bool = false,
        ISTRIP: bool = false,
        INLCR: bool = false,
        IGNCR: bool = false,
        ICRNL: bool = false,
        IUCLC: bool = false,
        IXON: bool = false,
        IXANY: bool = false,
        IXOFF: bool = false,
        IMAXBEL: bool = false,
        IUTF8: bool = false,
        _: u17 = 0,
    },
};

cc_t


pub const tc_oflag_t = switch (native_arch) {
    .powerpc, .powerpcle, .powerpc64, .powerpc64le => packed struct(u32) {
        OPOST: bool = false,
        ONLCR: bool = false,
        OLCUC: bool = false,
        OCRNL: bool = false,
        ONOCR: bool = false,
        ONLRET: bool = false,
        OFILL: bool = false,
        OFDEL: bool = false,
        NLDLY: u2 = 0,
        TABDLY: u2 = 0,
        CRDLY: u2 = 0,
        FFDLY: u1 = 0,
        BSDLY: u1 = 0,
        VTDLY: u1 = 0,
        _: u15 = 0,
    },
    else => packed struct(u32) {
        OPOST: bool = false,
        OLCUC: bool = false,
        ONLCR: bool = false,
        OCRNL: bool = false,
        ONOCR: bool = false,
        ONLRET: bool = false,
        OFILL: bool = false,
        OFDEL: bool = false,
        NLDLY: u1 = 0,
        CRDLY: u2 = 0,
        TABDLY: u2 = 0,
        BSDLY: u1 = 0,
        VTDLY: u1 = 0,
        FFDLY: u1 = 0,
        _: u16 = 0,
    },
};

V


pub const CSIZE = enum(u2) { CS5, CS6, CS7, CS8 };

TCSA


pub const tc_cflag_t = switch (native_arch) {
    .powerpc, .powerpcle, .powerpc64, .powerpc64le => packed struct(u32) {
        _0: u8 = 0,
        CSIZE: CSIZE = .CS5,
        CSTOPB: bool = false,
        CREAD: bool = false,
        PARENB: bool = false,
        PARODD: bool = false,
        HUPCL: bool = false,
        CLOCAL: bool = false,
        _: u16 = 0,
    },
    else => packed struct(u32) {
        _0: u4 = 0,
        CSIZE: CSIZE = .CS5,
        CSTOPB: bool = false,
        CREAD: bool = false,
        PARENB: bool = false,
        PARODD: bool = false,
        HUPCL: bool = false,
        CLOCAL: bool = false,
        _: u20 = 0,
    },
};

termios


pub const tc_lflag_t = switch (native_arch) {
    .powerpc, .powerpcle, .powerpc64, .powerpc64le => packed struct(u32) {
        _0: u1 = 0,
        ECHOE: bool = false,
        ECHOK: bool = false,
        ECHO: bool = false,
        ECHONL: bool = false,
        _5: u2 = 0,
        ISIG: bool = false,
        ICANON: bool = false,
        _9: u1 = 0,
        IEXTEN: bool = false,
        _11: u11 = 0,
        TOSTOP: bool = false,
        _23: u8 = 0,
        NOFLSH: bool = false,
    },
    .mips, .mipsel, .mips64, .mips64el => packed struct(u32) {
        ISIG: bool = false,
        ICANON: bool = false,
        _2: u1 = 0,
        ECHO: bool = false,
        ECHOE: bool = false,
        ECHOK: bool = false,
        ECHONL: bool = false,
        NOFLSH: bool = false,
        IEXTEN: bool = false,
        _9: u6 = 0,
        TOSTOP: bool = false,
        _: u16 = 0,
    },
    else => packed struct(u32) {
        ISIG: bool = false,
        ICANON: bool = false,
        _2: u1 = 0,
        ECHO: bool = false,
        ECHOE: bool = false,
        ECHOK: bool = false,
        ECHONL: bool = false,
        NOFLSH: bool = false,
        TOSTOP: bool = false,
        _9: u6 = 0,
        IEXTEN: bool = false,
        _: u16 = 0,
    },
};

SIOCGIFINDEX


pub const cc_t = u8;

IFNAMESIZE


/// Indices into the `cc` array in the `termios` struct.
pub const V = switch (native_arch) {
    .mips, .mipsel, .mips64, .mips64el => enum {
        INTR,
        QUIT,
        ERASE,
        KILL,
        MIN,
        TIME,
        EOL2,
        SWTC,
        START,
        STOP,
        SUSP,
        reserved,
        REPRINT,
        DISCARD,
        WERASE,
        LNEXT,
        EOF,
        EOL,
    },
    .powerpc, .powerpcle, .powerpc64, .powerpc64le => enum {
        INTR,
        QUIT,
        ERASE,
        KILL,
        EOF,
        MIN,
        EOL,
        TIME,
        EOL2,
        SWTC,
        WERASE,
        REPRINT,
        SUSP,
        START,
        STOP,
        LNEXT,
        DISCARD,
    },
    else => enum {
        INTR,
        QUIT,
        ERASE,
        KILL,
        EOF,
        TIME,
        MIN,
        SWTC,
        START,
        STOP,
        SUSP,
        EOL,
        REPRINT,
        DISCARD,
        WERASE,
        LNEXT,
        EOL2,
    },
};

ifmap


pub const TCSA = enum(c_uint) {
    NOW,
    DRAIN,
    FLUSH,
    _,
};

ifreq


pub const termios = switch (native_arch) {
    .powerpc, .powerpcle, .powerpc64, .powerpc64le => extern struct {
        iflag: tc_iflag_t,
        oflag: tc_oflag_t,
        cflag: tc_cflag_t,
        lflag: tc_lflag_t,
        cc: [NCCS]cc_t,
        line: cc_t,
        ispeed: speed_t,
        ospeed: speed_t,
    },
    else => extern struct {
        iflag: tc_iflag_t,
        oflag: tc_oflag_t,
        cflag: tc_cflag_t,
        lflag: tc_lflag_t,
        line: cc_t,
        cc: [NCCS]cc_t,
        ispeed: speed_t,
        ospeed: speed_t,
    },
};

rlimit_resource


pub const SIOCGIFINDEX = 0x8933;
pub const IFNAMESIZE = 16;

rlim_t


pub const ifmap = extern struct {
    mem_start: u32,
    mem_end: u32,
    base_addr: u16,
    irq: u8,
    dma: u8,
    port: u8,
};

RLIM


pub const ifreq = extern struct {
    ifrn: extern union {
        name: [IFNAMESIZE]u8,
    },
    ifru: extern union {
        addr: sockaddr,
        dstaddr: sockaddr,
        broadaddr: sockaddr,
        netmask: sockaddr,
        hwaddr: sockaddr,
        flags: i16,
        ivalue: i32,
        mtu: i32,
        map: ifmap,
        slave: [IFNAMESIZE - 1:0]u8,
        newname: [IFNAMESIZE - 1:0]u8,
        data: ?[*]u8,
    },
};

INFINITY


// doc comments copied from musl
pub const rlimit_resource = if (native_arch.isMIPS() or native_arch.isSPARC())
    arch_bits.rlimit_resource

kernel_timespec

else
    enum(c_int) {
        /// Per-process CPU limit, in seconds.
        CPU,

SAVED_CUR


        /// Largest file that can be created, in bytes.
        FSIZE,

rlimit


        /// Maximum size of data segment, in bytes.
        DATA,

MADV


        /// Maximum size of stack segment, in bytes.
        STACK,

NORMAL


        /// Largest core file that can be created, in bytes.
        CORE,

RANDOM


        /// Largest resident set size, in bytes.
        /// This affects swapping; processes that are exceeding their
        /// resident set size will be more likely to have physical memory
        /// taken from them.
        RSS,

SEQUENTIAL


        /// Number of processes.
        NPROC,

WILLNEED


        /// Number of open files.
        NOFILE,

DONTNEED


        /// Locked-in-memory address space.
        MEMLOCK,

FREE


        /// Address space limit.
        AS,

REMOVE


        /// Maximum number of file locks.
        LOCKS,

DONTFORK


        /// Maximum number of pending signals.
        SIGPENDING,

DOFORK


        /// Maximum bytes in POSIX message queues.
        MSGQUEUE,

MERGEABLE


        /// Maximum nice priority allowed to raise to.
        /// Nice levels 19 .. -20 correspond to 0 .. 39
        /// values of this resource limit.
        NICE,

UNMERGEABLE


        /// Maximum realtime priority allowed for non-priviledged
        /// processes.
        RTPRIO,

HUGEPAGE


        /// Maximum CPU time in µs that a process scheduled under a real-time
        /// scheduling policy may consume without making a blocking system
        /// call before being forcibly descheduled.
        RTTIME,

NOHUGEPAGE


        _,
    };

DONTDUMP


pub const rlim_t = u64;

DODUMP


pub const RLIM = struct {
    /// No limit
    pub const INFINITY = ~@as(rlim_t, 0);

WIPEONFORK


    pub const SAVED_MAX = INFINITY;
    pub const SAVED_CUR = INFINITY;
};

KEEPONFORK


pub const rlimit = extern struct {
    /// Soft limit
    cur: rlim_t,
    /// Hard limit
    max: rlim_t,
};

COLD


pub const MADV = struct {

NORMAL

    pub const NORMAL = 0;

RANDOM

    pub const RANDOM = 1;

SEQUENTIAL

    pub const SEQUENTIAL = 2;

WILLNEED

    pub const WILLNEED = 3;

DONTNEED

    pub const DONTNEED = 4;
    pub const FREE = 8;
    pub const REMOVE = 9;
    pub const DONTFORK = 10;
    pub const DOFORK = 11;
    pub const MERGEABLE = 12;
    pub const UNMERGEABLE = 13;
    pub const HUGEPAGE = 14;
    pub const NOHUGEPAGE = 15;
    pub const DONTDUMP = 16;
    pub const DODUMP = 17;
    pub const WIPEONFORK = 18;
    pub const KEEPONFORK = 19;
    pub const COLD = 20;
    pub const PAGEOUT = 21;
    pub const HWPOISON = 100;
    pub const SOFT_OFFLINE = 101;
};

RANDOM


pub const POSIX_FADV = switch (native_arch) {
    .s390x => if (@typeInfo(usize).Int.bits == 64) struct {

NORMAL

        pub const NORMAL = 0;

RANDOM

        pub const RANDOM = 1;

SEQUENTIAL

        pub const SEQUENTIAL = 2;

WILLNEED

        pub const WILLNEED = 3;
        pub const DONTNEED = 6;
        pub const NOREUSE = 7;
    } else struct {

NORMAL

        pub const NORMAL = 0;

RANDOM

        pub const RANDOM = 1;

SEQUENTIAL

        pub const SEQUENTIAL = 2;

WILLNEED

        pub const WILLNEED = 3;

DONTNEED

        pub const DONTNEED = 4;

NOREUSE

        pub const NOREUSE = 5;
    },
    else => struct {

NORMAL

        pub const NORMAL = 0;

RANDOM

        pub const RANDOM = 1;

SEQUENTIAL

        pub const SEQUENTIAL = 2;

WILLNEED

        pub const WILLNEED = 3;

DONTNEED

        pub const DONTNEED = 4;

NOREUSE

        pub const NOREUSE = 5;
    },
};

kernel_timespec


/// The timespec struct used by the kernel.
pub const kernel_timespec = if (@sizeOf(usize) >= 8) timespec else extern struct {
    tv_sec: i64,
    tv_nsec: i64,
};

timespec


pub const timespec = extern struct {
    tv_sec: isize,
    tv_nsec: isize,
};

XDP


pub const XDP = struct {

SHARED_UMEM

    pub const SHARED_UMEM = (1 << 0);

COPY

    pub const COPY = (1 << 1);

ZEROCOPY

    pub const ZEROCOPY = (1 << 2);

UMEM_UNALIGNED_CHUNK_FLAG

    pub const UMEM_UNALIGNED_CHUNK_FLAG = (1 << 0);

USE_NEED_WAKEUP

    pub const USE_NEED_WAKEUP = (1 << 3);

MMAP_OFFSETS


    pub const MMAP_OFFSETS = 1;

RX_RING

    pub const RX_RING = 2;

TX_RING

    pub const TX_RING = 3;

UMEM_REG

    pub const UMEM_REG = 4;

UMEM_FILL_RING

    pub const UMEM_FILL_RING = 5;

UMEM_COMPLETION_RING

    pub const UMEM_COMPLETION_RING = 6;

STATISTICS

    pub const STATISTICS = 7;

OPTIONS

    pub const OPTIONS = 8;

OPTIONS_ZEROCOPY


    pub const OPTIONS_ZEROCOPY = (1 << 0);

PGOFF_RX_RING


    pub const PGOFF_RX_RING = 0;

PGOFF_TX_RING

    pub const PGOFF_TX_RING = 0x80000000;

UMEM_PGOFF_FILL_RING

    pub const UMEM_PGOFF_FILL_RING = 0x100000000;

UMEM_PGOFF_COMPLETION_RING

    pub const UMEM_PGOFF_COMPLETION_RING = 0x180000000;
};

xdp_ring_offset


pub const xdp_ring_offset = extern struct {
    producer: u64,
    consumer: u64,
    desc: u64,
    flags: u64,
};

xdp_mmap_offsets


pub const xdp_mmap_offsets = extern struct {
    rx: xdp_ring_offset,
    tx: xdp_ring_offset,
    fr: xdp_ring_offset,
    cr: xdp_ring_offset,
};

xdp_umem_reg


pub const xdp_umem_reg = extern struct {
    addr: u64,
    len: u64,
    chunk_size: u32,
    headroom: u32,
    flags: u32,
};

xdp_statistics


pub const xdp_statistics = extern struct {
    rx_dropped: u64,
    rx_invalid_descs: u64,
    tx_invalid_descs: u64,
    rx_ring_full: u64,
    rx_fill_ring_empty_descs: u64,
    tx_ring_empty_descs: u64,
};

xdp_options


pub const xdp_options = extern struct {
    flags: u32,
};

XSK_UNALIGNED_BUF_OFFSET_SHIFT


pub const XSK_UNALIGNED_BUF_OFFSET_SHIFT = 48;

XSK_UNALIGNED_BUF_ADDR_MASK

pub const XSK_UNALIGNED_BUF_ADDR_MASK = (1 << XSK_UNALIGNED_BUF_OFFSET_SHIFT) - 1;

xdp_desc


pub const xdp_desc = extern struct {
    addr: u64,
    len: u32,
    options: u32,
};

SECUREBITS_DEFAULT


fn issecure_mask(comptime x: comptime_int) comptime_int {
    return 1 << x;
}

SECURE_NOROOT


pub const SECUREBITS_DEFAULT = 0x00000000;

SECURE_NOROOT_LOCKED


pub const SECURE_NOROOT = 0;
pub const SECURE_NOROOT_LOCKED = 1;

SECBIT_NOROOT


pub const SECBIT_NOROOT = issecure_mask(SECURE_NOROOT);

SECBIT_NOROOT_LOCKED

pub const SECBIT_NOROOT_LOCKED = issecure_mask(SECURE_NOROOT_LOCKED);

SECURE_NO_SETUID_FIXUP


pub const SECURE_NO_SETUID_FIXUP = 2;

SECURE_NO_SETUID_FIXUP_LOCKED

pub const SECURE_NO_SETUID_FIXUP_LOCKED = 3;

SECBIT_NO_SETUID_FIXUP


pub const SECBIT_NO_SETUID_FIXUP = issecure_mask(SECURE_NO_SETUID_FIXUP);

SECBIT_NO_SETUID_FIXUP_LOCKED

pub const SECBIT_NO_SETUID_FIXUP_LOCKED = issecure_mask(SECURE_NO_SETUID_FIXUP_LOCKED);

SECURE_KEEP_CAPS


pub const SECURE_KEEP_CAPS = 4;

SECURE_KEEP_CAPS_LOCKED

pub const SECURE_KEEP_CAPS_LOCKED = 5;

SECBIT_KEEP_CAPS


pub const SECBIT_KEEP_CAPS = issecure_mask(SECURE_KEEP_CAPS);

SECBIT_KEEP_CAPS_LOCKED

pub const SECBIT_KEEP_CAPS_LOCKED = issecure_mask(SECURE_KEEP_CAPS_LOCKED);

SECURE_NO_CAP_AMBIENT_RAISE


pub const SECURE_NO_CAP_AMBIENT_RAISE = 6;

SECURE_NO_CAP_AMBIENT_RAISE_LOCKED

pub const SECURE_NO_CAP_AMBIENT_RAISE_LOCKED = 7;

SECBIT_NO_CAP_AMBIENT_RAISE


pub const SECBIT_NO_CAP_AMBIENT_RAISE = issecure_mask(SECURE_NO_CAP_AMBIENT_RAISE);

SECBIT_NO_CAP_AMBIENT_RAISE_LOCKED

pub const SECBIT_NO_CAP_AMBIENT_RAISE_LOCKED = issecure_mask(SECURE_NO_CAP_AMBIENT_RAISE_LOCKED);

SECURE_ALL_BITS


pub const SECURE_ALL_BITS = issecure_mask(SECURE_NOROOT) |
    issecure_mask(SECURE_NO_SETUID_FIXUP) |
    issecure_mask(SECURE_KEEP_CAPS) |
    issecure_mask(SECURE_NO_CAP_AMBIENT_RAISE);

SECURE_ALL_LOCKS

pub const SECURE_ALL_LOCKS = SECURE_ALL_BITS << 1;

PR


pub const PR = enum(i32) {
    SET_PDEATHSIG = 1,
    GET_PDEATHSIG = 2,

UNALIGN_NOPRINT


    GET_DUMPABLE = 3,
    SET_DUMPABLE = 4,

UNALIGN_SIGBUS


    GET_UNALIGN = 5,
    SET_UNALIGN = 6,

FPEMU_NOPRINT


    GET_KEEPCAPS = 7,
    SET_KEEPCAPS = 8,

FPEMU_SIGFPE


    GET_FPEMU = 9,
    SET_FPEMU = 10,

FP_EXC_SW_ENABLE


    GET_FPEXC = 11,
    SET_FPEXC = 12,

FP_EXC_DIV


    GET_TIMING = 13,
    SET_TIMING = 14,

FP_EXC_OVF


    SET_NAME = 15,
    GET_NAME = 16,

FP_EXC_UND


    GET_ENDIAN = 19,
    SET_ENDIAN = 20,

FP_EXC_RES


    GET_SECCOMP = 21,
    SET_SECCOMP = 22,

FP_EXC_INV


    CAPBSET_READ = 23,
    CAPBSET_DROP = 24,

FP_EXC_DISABLED


    GET_TSC = 25,
    SET_TSC = 26,

FP_EXC_NONRECOV


    GET_SECUREBITS = 27,
    SET_SECUREBITS = 28,

FP_EXC_ASYNC


    SET_TIMERSLACK = 29,
    GET_TIMERSLACK = 30,

FP_EXC_PRECISE


    TASK_PERF_EVENTS_DISABLE = 31,
    TASK_PERF_EVENTS_ENABLE = 32,

TIMING_STATISTICAL


    MCE_KILL = 33,

TIMING_TIMESTAMP


    MCE_KILL_GET = 34,

ENDIAN_BIG


    SET_MM = 35,

ENDIAN_LITTLE


    SET_PTRACER = 0x59616d61,

ENDIAN_PPC_LITTLE


    SET_CHILD_SUBREAPER = 36,
    GET_CHILD_SUBREAPER = 37,

TSC_ENABLE


    SET_NO_NEW_PRIVS = 38,
    GET_NO_NEW_PRIVS = 39,

TSC_SIGSEGV


    GET_TID_ADDRESS = 40,

MCE_KILL_CLEAR


    SET_THP_DISABLE = 41,
    GET_THP_DISABLE = 42,

MCE_KILL_SET


    MPX_ENABLE_MANAGEMENT = 43,
    MPX_DISABLE_MANAGEMENT = 44,

MCE_KILL_LATE


    SET_FP_MODE = 45,
    GET_FP_MODE = 46,

MCE_KILL_EARLY


    CAP_AMBIENT = 47,

MCE_KILL_DEFAULT


    SVE_SET_VL = 50,
    SVE_GET_VL = 51,

SET_MM_START_CODE


    GET_SPECULATION_CTRL = 52,
    SET_SPECULATION_CTRL = 53,

SET_MM_END_CODE


    _,

SET_MM_START_DATA


    pub const UNALIGN_NOPRINT = 1;
    pub const UNALIGN_SIGBUS = 2;

SET_MM_END_DATA


    pub const FPEMU_NOPRINT = 1;
    pub const FPEMU_SIGFPE = 2;

SET_MM_START_STACK


    pub const FP_EXC_SW_ENABLE = 0x80;
    pub const FP_EXC_DIV = 0x010000;
    pub const FP_EXC_OVF = 0x020000;
    pub const FP_EXC_UND = 0x040000;
    pub const FP_EXC_RES = 0x080000;
    pub const FP_EXC_INV = 0x100000;
    pub const FP_EXC_DISABLED = 0;
    pub const FP_EXC_NONRECOV = 1;
    pub const FP_EXC_ASYNC = 2;
    pub const FP_EXC_PRECISE = 3;

SET_MM_START_BRK


    pub const TIMING_STATISTICAL = 0;
    pub const TIMING_TIMESTAMP = 1;

SET_MM_BRK


    pub const ENDIAN_BIG = 0;
    pub const ENDIAN_LITTLE = 1;
    pub const ENDIAN_PPC_LITTLE = 2;

SET_MM_ARG_START


    pub const TSC_ENABLE = 1;
    pub const TSC_SIGSEGV = 2;

SET_MM_ARG_END


    pub const MCE_KILL_CLEAR = 0;
    pub const MCE_KILL_SET = 1;

SET_MM_ENV_START


    pub const MCE_KILL_LATE = 0;
    pub const MCE_KILL_EARLY = 1;
    pub const MCE_KILL_DEFAULT = 2;

SET_MM_ENV_END


    pub const SET_MM_START_CODE = 1;
    pub const SET_MM_END_CODE = 2;
    pub const SET_MM_START_DATA = 3;
    pub const SET_MM_END_DATA = 4;
    pub const SET_MM_START_STACK = 5;
    pub const SET_MM_START_BRK = 6;
    pub const SET_MM_BRK = 7;
    pub const SET_MM_ARG_START = 8;
    pub const SET_MM_ARG_END = 9;
    pub const SET_MM_ENV_START = 10;
    pub const SET_MM_ENV_END = 11;

SET_MM_AUXV

    pub const SET_MM_AUXV = 12;

SET_MM_EXE_FILE

    pub const SET_MM_EXE_FILE = 13;

SET_MM_MAP

    pub const SET_MM_MAP = 14;

SET_MM_MAP_SIZE

    pub const SET_MM_MAP_SIZE = 15;

SET_PTRACER_ANY


    pub const SET_PTRACER_ANY = std.math.maxInt(c_ulong);

FP_MODE_FR


    pub const FP_MODE_FR = 1 << 0;

FP_MODE_FRE

    pub const FP_MODE_FRE = 1 << 1;

CAP_AMBIENT_IS_SET


    pub const CAP_AMBIENT_IS_SET = 1;

CAP_AMBIENT_RAISE

    pub const CAP_AMBIENT_RAISE = 2;

CAP_AMBIENT_LOWER

    pub const CAP_AMBIENT_LOWER = 3;

CAP_AMBIENT_CLEAR_ALL

    pub const CAP_AMBIENT_CLEAR_ALL = 4;

SVE_SET_VL_ONEXEC


    pub const SVE_SET_VL_ONEXEC = 1 << 18;

SVE_VL_LEN_MASK

    pub const SVE_VL_LEN_MASK = 0xffff;

SVE_VL_INHERIT

    pub const SVE_VL_INHERIT = 1 << 17;

SPEC_STORE_BYPASS


    pub const SPEC_STORE_BYPASS = 0;

SPEC_NOT_AFFECTED

    pub const SPEC_NOT_AFFECTED = 0;

SPEC_PRCTL

    pub const SPEC_PRCTL = 1 << 0;

SPEC_ENABLE

    pub const SPEC_ENABLE = 1 << 1;

SPEC_DISABLE

    pub const SPEC_DISABLE = 1 << 2;

SPEC_FORCE_DISABLE

    pub const SPEC_FORCE_DISABLE = 1 << 3;
};

prctl_mm_map


pub const prctl_mm_map = extern struct {
    start_code: u64,
    end_code: u64,
    start_data: u64,
    end_data: u64,
    start_brk: u64,
    brk: u64,
    start_stack: u64,
    arg_start: u64,
    arg_end: u64,
    env_start: u64,
    env_end: u64,
    auxv: *u64,
    auxv_size: u32,
    exe_fd: u32,
};

NETLINK


pub const NETLINK = struct {
    /// Routing/device hook

ROUTE

    pub const ROUTE = 0;

UNUSED


    /// Unused number
    pub const UNUSED = 1;

USERSOCK


    /// Reserved for user mode socket protocols
    pub const USERSOCK = 2;

FIREWALL


    /// Unused number, formerly ip_queue
    pub const FIREWALL = 3;

SOCK_DIAG


    /// socket monitoring
    pub const SOCK_DIAG = 4;

NFLOG


    /// netfilter/iptables ULOG
    pub const NFLOG = 5;

XFRM


    /// ipsec
    pub const XFRM = 6;

SELINUX


    /// SELinux event notifications
    pub const SELINUX = 7;

ISCSI


    /// Open-iSCSI
    pub const ISCSI = 8;

AUDIT


    /// auditing
    pub const AUDIT = 9;

FIB_LOOKUP


    pub const FIB_LOOKUP = 10;

CONNECTOR


    pub const CONNECTOR = 11;

NETFILTER


    /// netfilter subsystem
    pub const NETFILTER = 12;

IP6_FW


    pub const IP6_FW = 13;

DNRTMSG


    /// DECnet routing messages
    pub const DNRTMSG = 14;

KOBJECT_UEVENT


    /// Kernel messages to userspace
    pub const KOBJECT_UEVENT = 15;

GENERIC


    pub const GENERIC = 16;

SCSITRANSPORT


    // leave room for NETLINK_DM (DM Events)

ECRYPTFS


    /// SCSI Transports
    pub const SCSITRANSPORT = 18;

RDMA


    pub const ECRYPTFS = 19;

CRYPTO


    pub const RDMA = 20;

SMC


    /// Crypto layer
    pub const CRYPTO = 21;

NLM_F_REQUEST


    /// SMC monitoring
    pub const SMC = 22;
};

NLM_F_MULTI


// Flags values

NLM_F_ACK


/// It is request message.
pub const NLM_F_REQUEST = 0x01;

NLM_F_ECHO


/// Multipart message, terminated by NLMSG_DONE
pub const NLM_F_MULTI = 0x02;

NLM_F_DUMP_INTR


/// Reply with ack, with zero or error code
pub const NLM_F_ACK = 0x04;

NLM_F_DUMP_FILTERED


/// Echo this request
pub const NLM_F_ECHO = 0x08;

NLM_F_ROOT


/// Dump was inconsistent due to sequence change
pub const NLM_F_DUMP_INTR = 0x10;

NLM_F_MATCH


/// Dump was filtered as requested
pub const NLM_F_DUMP_FILTERED = 0x20;

NLM_F_ATOMIC


// Modifiers to GET request

NLM_F_DUMP


/// specify tree root
pub const NLM_F_ROOT = 0x100;

NLM_F_REPLACE


/// return all matching
pub const NLM_F_MATCH = 0x200;

NLM_F_EXCL


/// atomic GET
pub const NLM_F_ATOMIC = 0x400;
pub const NLM_F_DUMP = NLM_F_ROOT | NLM_F_MATCH;

NLM_F_CREATE


// Modifiers to NEW request

NLM_F_APPEND


/// Override existing
pub const NLM_F_REPLACE = 0x100;

NLM_F_NONREC


/// Do not touch, if it exists
pub const NLM_F_EXCL = 0x200;

NLM_F_CAPPED


/// Create, if it does not exist
pub const NLM_F_CREATE = 0x400;

NLM_F_ACK_TLVS


/// Add to end of list
pub const NLM_F_APPEND = 0x800;

NetlinkMessageType


// Modifiers to DELETE request

MIN_TYPE


/// Do not delete recursively
pub const NLM_F_NONREC = 0x100;

nlmsghdr


// Flags for ACK message

ifinfomsg


/// request was capped
pub const NLM_F_CAPPED = 0x100;

rtattr


/// extended ACK TVLs were included
pub const NLM_F_ACK_TLVS = 0x200;

ALIGNTO


pub const NetlinkMessageType = enum(u16) {
    /// < 0x10: reserved control messages
    pub const MIN_TYPE = 0x10;

IFLA


    /// Nothing.
    NOOP = 0x1,

TARGET_NETNSID:


    /// Error
    ERROR = 0x2,

rtnl_link_ifmap


    /// End of a dump
    DONE = 0x3,

rtnl_link_stats


    /// Data lost
    OVERRUN = 0x4,

rtnl_link_stats64


    // rtlink types

perf_event_attr


    RTM_NEWLINK = 16,
    RTM_DELLINK,
    RTM_GETLINK,
    RTM_SETLINK,

PERF


    RTM_NEWADDR = 20,
    RTM_DELADDR,
    RTM_GETADDR,

TYPE


    RTM_NEWROUTE = 24,
    RTM_DELROUTE,
    RTM_GETROUTE,

COUNT


    RTM_NEWNEIGH = 28,
    RTM_DELNEIGH,
    RTM_GETNEIGH,

HW


    RTM_NEWRULE = 32,
    RTM_DELRULE,
    RTM_GETRULE,

CACHE


    RTM_NEWQDISC = 36,
    RTM_DELQDISC,
    RTM_GETQDISC,

OP


    RTM_NEWTCLASS = 40,
    RTM_DELTCLASS,
    RTM_GETTCLASS,

RESULT


    RTM_NEWTFILTER = 44,
    RTM_DELTFILTER,
    RTM_GETTFILTER,

SW


    RTM_NEWACTION = 48,
    RTM_DELACTION,
    RTM_GETACTION,

SAMPLE


    RTM_NEWPREFIX = 52,

IP


    RTM_GETMULTICAST = 58,

TID


    RTM_GETANYCAST = 62,

TIME


    RTM_NEWNEIGHTBL = 64,
    RTM_GETNEIGHTBL = 66,
    RTM_SETNEIGHTBL,

ADDR


    RTM_NEWNDUSEROPT = 68,

READ


    RTM_NEWADDRLABEL = 72,
    RTM_DELADDRLABEL,
    RTM_GETADDRLABEL,

CALLCHAIN


    RTM_GETDCB = 78,
    RTM_SETDCB,

ID


    RTM_NEWNETCONF = 80,
    RTM_DELNETCONF,
    RTM_GETNETCONF = 82,

CPU


    RTM_NEWMDB = 84,
    RTM_DELMDB = 85,
    RTM_GETMDB = 86,

PERIOD


    RTM_NEWNSID = 88,
    RTM_DELNSID = 89,
    RTM_GETNSID = 90,

STREAM_ID


    RTM_NEWSTATS = 92,
    RTM_GETSTATS = 94,

RAW


    RTM_NEWCACHEREPORT = 96,

BRANCH_STACK


    RTM_NEWCHAIN = 100,
    RTM_DELCHAIN,
    RTM_GETCHAIN,

REGS_USER


    RTM_NEWNEXTHOP = 104,
    RTM_DELNEXTHOP,
    RTM_GETNEXTHOP,

STACK_USER


    _,
};

WEIGHT


/// Netlink message header
/// Specified in RFC 3549 Section 2.3.2
pub const nlmsghdr = extern struct {
    /// Length of message including header
    len: u32,

DATA_SRC


    /// Message content
    type: NetlinkMessageType,

IDENTIFIER


    /// Additional flags
    flags: u16,

TRANSACTION


    /// Sequence number
    seq: u32,

REGS_INTR


    /// Sending process port ID
    pid: u32,
};

PHYS_ADDR


pub const ifinfomsg = extern struct {
    family: u8,
    __pad1: u8 = 0,

MAX


    /// ARPHRD_*
    type: c_ushort,

BRANCH


    /// Link index
    index: c_int,

USER


    /// IFF_* flags
    flags: c_uint,

KERNEL


    /// IFF_* change mask
    change: c_uint,
};

HV


pub const rtattr = extern struct {
    /// Length of option
    len: c_ushort,

ANY


    /// Type of option
    type: IFLA,

ANY_CALL


    pub const ALIGNTO = 4;
};

ANY_RETURN


pub const IFLA = enum(c_ushort) {
    UNSPEC,
    ADDRESS,
    BROADCAST,
    IFNAME,
    MTU,
    LINK,
    QDISC,
    STATS,
    COST,
    PRIORITY,
    MASTER,

IND_CALL


    /// Wireless Extension event
    WIRELESS,

ABORT_TX


    /// Protocol specific information for a link
    PROTINFO,

IN_TX


    TXQLEN,
    MAP,
    WEIGHT,
    OPERSTATE,
    LINKMODE,
    LINKINFO,
    NET_NS_PID,
    IFALIAS,

NO_TX


    /// Number of VFs if device is SR-IOV PF
    NUM_VF,

COND


    VFINFO_LIST,
    STATS64,
    VF_PORTS,
    PORT_SELF,
    AF_SPEC,

CALL_STACK


    /// Group the device belongs to
    GROUP,

IND_JUMP


    NET_NS_FD,

CALL


    /// Extended info mask, VFs, etc
    EXT_MASK,

NO_FLAGS


    /// Promiscuity count: > 0 means acts PROMISC
    PROMISCUITY,

NO_CYCLES


    NUM_TX_QUEUES,
    NUM_RX_QUEUES,
    CARRIER,
    PHYS_PORT_ID,
    CARRIER_CHANGES,
    PHYS_SWITCH_ID,
    LINK_NETNSID,
    PHYS_PORT_NAME,
    PROTO_DOWN,
    GSO_MAX_SEGS,
    GSO_MAX_SIZE,
    PAD,
    XDP,
    EVENT,

TYPE_SAVE


    NEW_NETNSID,
    IF_NETNSID,

MAX


    CARRIER_UP_COUNT,
    CARRIER_DOWN_COUNT,
    NEW_IFINDEX,
    MIN_MTU,
    MAX_MTU,

FLAG


    _,

FD_NO_GROUP


    pub const TARGET_NETNSID: IFLA = .IF_NETNSID;
};

FD_OUTPUT


pub const rtnl_link_ifmap = extern struct {
    mem_start: u64,
    mem_end: u64,
    base_addr: u64,
    irq: u16,
    dma: u8,
    port: u8,
};

PID_CGROUP


pub const rtnl_link_stats = extern struct {
    /// total packets received
    rx_packets: u32,

FD_CLOEXEC


    /// total packets transmitted
    tx_packets: u32,

EVENT_IOC


    /// total bytes received
    rx_bytes: u32,

ENABLE


    /// total bytes transmitted
    tx_bytes: u32,

DISABLE


    /// bad packets received
    rx_errors: u32,

REFRESH


    /// packet transmit problems
    tx_errors: u32,

RESET


    /// no space in linux buffers
    rx_dropped: u32,

PERIOD


    /// no space available in linux
    tx_dropped: u32,

SET_OUTPUT


    /// multicast packets received
    multicast: u32,

SET_FILTER


    collisions: u32,

SET_BPF


    // detailed rx_errors

PAUSE_OUTPUT


    rx_length_errors: u32,

QUERY_BPF


    /// receiver ring buff overflow
    rx_over_errors: u32,

MODIFY_ATTRIBUTES


    /// recved pkt with crc error
    rx_crc_errors: u32,

IOC_FLAG_GROUP


    /// recv'd frame alignment error
    rx_frame_errors: u32,

AUDIT


    /// recv'r fifo overrun
    rx_fifo_errors: u32,

ARCH


    /// receiver missed packet
    rx_missed_errors: u32,

current:


    // detailed tx_errors
    tx_aborted_errors: u32,
    tx_carrier_errors: u32,
    tx_fifo_errors: u32,
    tx_heartbeat_errors: u32,
    tx_window_errors: u32,

PTRACE


    // for cslip etc

TRACEME


    rx_compressed: u32,
    tx_compressed: u32,

PEEKTEXT


    /// dropped, no handler found
    rx_nohandler: u32,
};

PEEKDATA


pub const rtnl_link_stats64 = extern struct {
    /// total packets received
    rx_packets: u64,

PEEKUSER


    /// total packets transmitted
    tx_packets: u64,

POKETEXT


    /// total bytes received
    rx_bytes: u64,

POKEDATA


    /// total bytes transmitted
    tx_bytes: u64,

POKEUSER


    /// bad packets received
    rx_errors: u64,

CONT


    /// packet transmit problems
    tx_errors: u64,

KILL


    /// no space in linux buffers
    rx_dropped: u64,

SINGLESTEP


    /// no space available in linux
    tx_dropped: u64,

GETREGS


    /// multicast packets received
    multicast: u64,

SETREGS


    collisions: u64,

GETFPREGS


    // detailed rx_errors

SETFPREGS


    rx_length_errors: u64,

ATTACH


    /// receiver ring buff overflow
    rx_over_errors: u64,

DETACH


    /// recved pkt with crc error
    rx_crc_errors: u64,

GETFPXREGS


    /// recv'd frame alignment error
    rx_frame_errors: u64,

SETFPXREGS


    /// recv'r fifo overrun
    rx_fifo_errors: u64,

SYSCALL


    /// receiver missed packet
    rx_missed_errors: u64,

SETOPTIONS


    // detailed tx_errors
    tx_aborted_errors: u64,
    tx_carrier_errors: u64,
    tx_fifo_errors: u64,
    tx_heartbeat_errors: u64,
    tx_window_errors: u64,

GETEVENTMSG


    // for cslip etc

GETSIGINFO


    rx_compressed: u64,
    tx_compressed: u64,

SETSIGINFO


    /// dropped, no handler found
    rx_nohandler: u64,
};

GETREGSET


pub const perf_event_attr = extern struct {
    /// Major type: hardware/software/tracepoint/etc.
    type: PERF.TYPE = undefined,
    /// Size of the attr structure, for fwd/bwd compat.
    size: u32 = @sizeOf(perf_event_attr),
    /// Type specific configuration information.
    config: u64 = 0,

SETREGSET


    sample_period_or_freq: u64 = 0,
    sample_type: u64 = 0,
    read_format: u64 = 0,

SEIZE


    flags: packed struct {
        /// off by default
        disabled: bool = false,
        /// children inherit it
        inherit: bool = false,
        /// must always be on PMU
        pinned: bool = false,
        /// only group on PMU
        exclusive: bool = false,
        /// don't count user
        exclude_user: bool = false,
        /// ditto kernel
        exclude_kernel: bool = false,
        /// ditto hypervisor
        exclude_hv: bool = false,
        /// don't count when idle
        exclude_idle: bool = false,
        /// include mmap data
        mmap: bool = false,
        /// include comm data
        comm: bool = false,
        /// use freq, not period
        freq: bool = false,
        /// per task counts
        inherit_stat: bool = false,
        /// next exec enables
        enable_on_exec: bool = false,
        /// trace fork/exit
        task: bool = false,
        /// wakeup_watermark
        watermark: bool = false,
        /// precise_ip:
        ///
        ///  0 - SAMPLE_IP can have arbitrary skid
        ///  1 - SAMPLE_IP must have constant skid
        ///  2 - SAMPLE_IP requested to have 0 skid
        ///  3 - SAMPLE_IP must have 0 skid
        ///
        ///  See also PERF_RECORD_MISC_EXACT_IP
        /// skid constraint
        precise_ip: u2 = 0,
        /// non-exec mmap data
        mmap_data: bool = false,
        /// sample_type all events
        sample_id_all: bool = false,

INTERRUPT


        /// don't count in host
        exclude_host: bool = false,
        /// don't count in guest
        exclude_guest: bool = false,

LISTEN


        /// exclude kernel callchains
        exclude_callchain_kernel: bool = false,
        /// exclude user callchains
        exclude_callchain_user: bool = false,
        /// include mmap with inode data
        mmap2: bool = false,
        /// flag comm events that are due to an exec
        comm_exec: bool = false,
        /// use @clockid for time fields
        use_clockid: bool = false,
        /// context switch data
        context_switch: bool = false,
        /// Write ring buffer from end to beginning
        write_backward: bool = false,
        /// include namespaces data
        namespaces: bool = false,

PEEKSIGINFO


        __reserved_1: u35 = 0,
    } = .{},
    /// wakeup every n events, or
    /// bytes before wakeup
    wakeup_events_or_watermark: u32 = 0,

GETSIGMASK


    bp_type: u32 = 0,

SETSIGMASK


    /// This field is also used for:
    /// bp_addr
    /// kprobe_func for perf_kprobe
    /// uprobe_path for perf_uprobe
    config1: u64 = 0,
    /// This field is also used for:
    /// bp_len
    /// kprobe_addr when kprobe_func == null
    /// probe_offset for perf_[k,u]probe
    config2: u64 = 0,

SECCOMP_GET_FILTER


    /// enum perf_branch_sample_type
    branch_sample_type: u64 = 0,

SECCOMP_GET_METADATA


    /// Defines set of user regs to dump on samples.
    /// See asm/perf_regs.h for details.
    sample_regs_user: u64 = 0,

GET_SYSCALL_INFO


    /// Defines size of the user stack to dump on samples.
    sample_stack_user: u32 = 0,

futex_waitv


    clockid: i32 = 0,
    /// Defines set of regs to dump for each sample
    /// state captured on:
    ///  - precise = 0: PMU interrupt
    ///  - precise > 0: sampled instruction
    ///
    /// See asm/perf_regs.h for details.
    sample_regs_intr: u64 = 0,

cache_stat_range


    /// Wakeup watermark for AUX area
    aux_watermark: u32 = 0,
    sample_max_stack: u16 = 0,
    /// Align to u64
    __reserved_2: u16 = 0,
};

cache_stat


pub const PERF = struct {
    pub const TYPE = enum(u32) {
        HARDWARE,
        SOFTWARE,
        TRACEPOINT,
        HW_CACHE,
        RAW,
        BREAKPOINT,
        MAX,
        _,
    };

SHADOW_STACK


    pub const COUNT = struct {
        pub const HW = enum(u32) {
            CPU_CYCLES,
            INSTRUCTIONS,
            CACHE_REFERENCES,
            CACHE_MISSES,
            BRANCH_INSTRUCTIONS,
            BRANCH_MISSES,
            BUS_CYCLES,
            STALLED_CYCLES_FRONTEND,
            STALLED_CYCLES_BACKEND,
            REF_CPU_CYCLES,
            MAX,

SET_TOKEN:


            pub const CACHE = enum(u32) {
                L1D,
                L1I,
                LL,
                DTLB,
                ITLB,
                BPU,
                NODE,
                MAX,

                pub const OP = enum(u32) {
                    READ,
                    WRITE,
                    PREFETCH,
                    MAX,
                };

                pub const RESULT = enum(u32) {
                    ACCESS,
                    MISS,
                    MAX,
                };
            };
        };

        pub const SW = enum(u32) {
            CPU_CLOCK,
            TASK_CLOCK,
            PAGE_FAULTS,
            CONTEXT_SWITCHES,
            CPU_MIGRATIONS,
            PAGE_FAULTS_MIN,
            PAGE_FAULTS_MAJ,
            ALIGNMENT_FAULTS,
            EMULATION_FAULTS,
            DUMMY,
            BPF_OUTPUT,
            MAX,
        };
    };

    pub const SAMPLE = struct {
        pub const IP = 1;
        pub const TID = 2;
        pub const TIME = 4;
        pub const ADDR = 8;
        pub const READ = 16;
        pub const CALLCHAIN = 32;
        pub const ID = 64;
        pub const CPU = 128;
        pub const PERIOD = 256;
        pub const STREAM_ID = 512;
        pub const RAW = 1024;
        pub const BRANCH_STACK = 2048;
        pub const REGS_USER = 4096;
        pub const STACK_USER = 8192;
        pub const WEIGHT = 16384;
        pub const DATA_SRC = 32768;
        pub const IDENTIFIER = 65536;
        pub const TRANSACTION = 131072;
        pub const REGS_INTR = 262144;
        pub const PHYS_ADDR = 524288;
        pub const MAX = 1048576;

        pub const BRANCH = struct {
            pub const USER = 1 << 0;
            pub const KERNEL = 1 << 1;
            pub const HV = 1 << 2;
            pub const ANY = 1 << 3;
            pub const ANY_CALL = 1 << 4;
            pub const ANY_RETURN = 1 << 5;
            pub const IND_CALL = 1 << 6;
            pub const ABORT_TX = 1 << 7;
            pub const IN_TX = 1 << 8;
            pub const NO_TX = 1 << 9;
            pub const COND = 1 << 10;
            pub const CALL_STACK = 1 << 11;
            pub const IND_JUMP = 1 << 12;
            pub const CALL = 1 << 13;
            pub const NO_FLAGS = 1 << 14;
            pub const NO_CYCLES = 1 << 15;
            pub const TYPE_SAVE = 1 << 16;
            pub const MAX = 1 << 17;
        };
    };

    pub const FLAG = struct {
        pub const FD_NO_GROUP = 1 << 0;
        pub const FD_OUTPUT = 1 << 1;
        pub const PID_CGROUP = 1 << 2;
        pub const FD_CLOEXEC = 1 << 3;
    };

    pub const EVENT_IOC = struct {
        pub const ENABLE = 9216;
        pub const DISABLE = 9217;
        pub const REFRESH = 9218;
        pub const RESET = 9219;
        pub const PERIOD = 1074275332;
        pub const SET_OUTPUT = 9221;
        pub const SET_FILTER = 1074275334;
        pub const SET_BPF = 1074013192;
        pub const PAUSE_OUTPUT = 1074013193;
        pub const QUERY_BPF = 3221758986;
        pub const MODIFY_ATTRIBUTES = 1074275339;
    };

    pub const IOC_FLAG_GROUP = 1;
};

// TODO: Add the rest of the AUDIT defines?
pub const AUDIT = struct {
    pub const ARCH = enum(u32) {
        const @"64BIT" = 0x80000000;
        const LE = 0x40000000;

        pub const current: AUDIT.ARCH = switch (native_arch) {
            .x86 => .X86,
            .x86_64 => .X86_64,
            .aarch64 => .AARCH64,
            .arm, .thumb => .ARM,
            .riscv64 => .RISCV64,
            .sparc64 => .SPARC64,
            .mips => .MIPS,
            .mipsel => .MIPSEL,
            .powerpc => .PPC,
            .powerpc64 => .PPC64,
            .powerpc64le => .PPC64LE,
            else => @compileError("unsupported architecture"),
        };

        AARCH64 = toAudit(.aarch64),
        ARM = toAudit(.arm),
        ARMEB = toAudit(.armeb),
        CSKY = toAudit(.csky),
        HEXAGON = @intFromEnum(std.elf.EM.HEXAGON),
        X86 = toAudit(.x86),
        M68K = toAudit(.m68k),
        MIPS = toAudit(.mips),
        MIPSEL = toAudit(.mips) | LE,
        MIPS64 = toAudit(.mips64),
        MIPSEL64 = toAudit(.mips64) | LE,
        PPC = toAudit(.powerpc),
        PPC64 = toAudit(.powerpc64),
        PPC64LE = toAudit(.powerpc64le),
        RISCV32 = toAudit(.riscv32),
        RISCV64 = toAudit(.riscv64),
        S390X = toAudit(.s390x),
        SPARC = toAudit(.sparc),
        SPARC64 = toAudit(.sparc64),
        X86_64 = toAudit(.x86_64),

        fn toAudit(arch: std.Target.Cpu.Arch) u32 {
            var res: u32 = @intFromEnum(arch.toElfMachine());
            if (arch.endian() == .little) res |= LE;
            switch (arch) {
                .aarch64,
                .mips64,
                .mips64el,
                .powerpc64,
                .powerpc64le,
                .riscv64,
                .sparc64,
                .x86_64,
                => res |= @"64BIT",
                else => {},
            }
            return res;
        }
    };
};

pub const PTRACE = struct {
    pub const TRACEME = 0;
    pub const PEEKTEXT = 1;
    pub const PEEKDATA = 2;
    pub const PEEKUSER = 3;
    pub const POKETEXT = 4;
    pub const POKEDATA = 5;
    pub const POKEUSER = 6;
    pub const CONT = 7;
    pub const KILL = 8;
    pub const SINGLESTEP = 9;
    pub const GETREGS = 12;
    pub const SETREGS = 13;
    pub const GETFPREGS = 14;
    pub const SETFPREGS = 15;
    pub const ATTACH = 16;
    pub const DETACH = 17;
    pub const GETFPXREGS = 18;
    pub const SETFPXREGS = 19;
    pub const SYSCALL = 24;
    pub const SETOPTIONS = 0x4200;
    pub const GETEVENTMSG = 0x4201;
    pub const GETSIGINFO = 0x4202;
    pub const SETSIGINFO = 0x4203;
    pub const GETREGSET = 0x4204;
    pub const SETREGSET = 0x4205;
    pub const SEIZE = 0x4206;
    pub const INTERRUPT = 0x4207;
    pub const LISTEN = 0x4208;
    pub const PEEKSIGINFO = 0x4209;
    pub const GETSIGMASK = 0x420a;
    pub const SETSIGMASK = 0x420b;
    pub const SECCOMP_GET_FILTER = 0x420c;
    pub const SECCOMP_GET_METADATA = 0x420d;
    pub const GET_SYSCALL_INFO = 0x420e;
};

/// A waiter for vectorized wait.
pub const futex_waitv = extern struct {
    // Expected value at uaddr
    val: u64,
    /// User address to wait on.
    uaddr: u64,
    /// Flags for this waiter.
    flags: u32,
    /// Reserved memeber to preserve alignment.
    /// Should be 0.
    __reserved: u32,
};

pub const cache_stat_range = extern struct {
    off: u64,
    len: u64,
};

pub const cache_stat = extern struct {
    /// Number of cached pages.
    cache: u64,
    /// Number of dirty pages.
    dirty: u64,
    /// Number of pages marked for writeback.
    writeback: u64,
    /// Number of pages evicted from the cache.
    evicted: u64,
    /// Number of recently evicted pages.
    /// A page is recently evicted if its last eviction was recent enough that its
    /// reentry to the cache would indicate that it is actively being used by the
    /// system, and that there is memory pressure on the system.
    recently_evicted: u64,
};

pub const SHADOW_STACK = struct {
    /// Set up a restore token in the shadow stack.
    pub const SET_TOKEN: u64 = 1 << 0;
};