package linux /* Represents an error returned by most of syscalls */ Errno :: enum i32 { NONE = 0, // Errno-base EPERM = 1, ENOENT = 2, ESRCH = 3, EINTR = 4, EIO = 5, ENXIO = 6, E2BIG = 7, ENOEXEC = 8, EBADF = 9, ECHILD = 10, EAGAIN = 11, ENOMEM = 12, EACCES = 13, EFAULT = 14, ENOTBLK = 15, EBUSY = 16, EEXIST = 17, EXDEV = 18, ENODEV = 19, ENOTDIR = 20, EISDIR = 21, EINVAL = 22, ENFILE = 23, EMFILE = 24, ENOTTY = 25, ETXTBSY = 26, EFBIG = 27, ENOSPC = 28, ESPIPE = 29, EROFS = 30, EMLINK = 31, EPIPE = 32, EDOM = 33, ERANGE = 34, // Linux EDEADLK = 35, ENAMETOOLONG = 36, ENOLCK = 37, ENOSYS = 38, ENOTEMPTY = 39, ELOOP = 40, EUNKNOWN_41 = 41, ENOMSG = 42, EIDRM = 43, ECHRNG = 44, EL2NSYNC = 45, EL3HLT = 46, EL3RST = 47, ELNRNG = 48, EUNATCH = 49, ENOCSI = 50, EL2HLT = 51, EBADE = 52, EBADR = 53, EXFULL = 54, ENOANO = 55, EBADRQC = 56, EBADSLT = 57, EUNKNOWN_58 = 58, EBFONT = 59, ENOSTR = 60, ENODATA = 61, ETIME = 62, ENOSR = 63, ENONET = 64, ENOPKG = 65, EREMOTE = 66, ENOLINK = 67, EADV = 68, ESRMNT = 69, ECOMM = 70, EPROTO = 71, EMULTIHOP = 72, EDOTDOT = 73, EBADMSG = 74, EOVERFLOW = 75, ENOTUNIQ = 76, EBADFD = 77, EREMCHG = 78, ELIBACC = 79, ELIBBAD = 80, ELIBSCN = 81, ELIBMAX = 82, ELIBEXEC = 83, EILSEQ = 84, ERESTART = 85, ESTRPIPE = 86, EUSERS = 87, ENOTSOCK = 88, EDESTADDRREQ = 89, EMSGSIZE = 90, EPROTOTYPE = 91, ENOPROTOOPT = 92, EPROTONOSUPPORT = 93, ESOCKTNOSUPPORT = 94, EOPNOTSUPP = 95, EPFNOSUPPORT = 96, EAFNOSUPPORT = 97, EADDRINUSE = 98, EADDRNOTAVAIL = 99, ENETDOWN = 100, ENETUNREACH = 101, ENETRESET = 102, ECONNABORTED = 103, ECONNRESET = 104, ENOBUFS = 105, EISCONN = 106, ENOTCONN = 107, ESHUTDOWN = 108, ETOOMANYREFS = 109, ETIMEDOUT = 110, ECONNREFUSED = 111, EHOSTDOWN = 112, EHOSTUNREACH = 113, EALREADY = 114, EINPROGRESS = 115, ESTALE = 116, EUCLEAN = 117, ENOTNAM = 118, ENAVAIL = 119, EISNAM = 120, EREMOTEIO = 121, EDQUOT = 122, ENOMEDIUM = 123, EMEDIUMTYPE = 124, ECANCELED = 125, ENOKEY = 126, EKEYEXPIRED = 127, EKEYREVOKED = 128, EKEYREJECTED = 129, EOWNERDEAD = 130, ENOTRECOVERABLE = 131, ERFKILL = 132, EHWPOISON = 133, // Errno aliases EWOULDBLOCK = EAGAIN, EDEADLOCK = EDEADLK, } /* Bits for Open_Flags. RDONLY flag is not present, because it has the value of 0, i.e. it is the default, unless WRONLY or RDWR is specified. */ when ODIN_ARCH != .arm64 && ODIN_ARCH != .arm32 { Open_Flags_Bits :: enum { WRONLY = 0, RDWR = 1, CREAT = 6, EXCL = 7, NOCTTY = 8, TRUNC = 9, APPEND = 10, NONBLOCK = 11, DSYNC = 12, ASYNC = 13, DIRECT = 14, LARGEFILE = 15, DIRECTORY = 16, NOFOLLOW = 17, NOATIME = 18, CLOEXEC = 19, PATH = 21, } // https://github.com/torvalds/linux/blob/7367539ad4b0f8f9b396baf02110962333719a48/include/uapi/asm-generic/fcntl.h#L19 #assert(1 << uint(Open_Flags_Bits.WRONLY) == 0o0000000_1) #assert(1 << uint(Open_Flags_Bits.RDWR) == 0o0000000_2) #assert(1 << uint(Open_Flags_Bits.CREAT) == 0o00000_100) #assert(1 << uint(Open_Flags_Bits.EXCL) == 0o00000_200) #assert(1 << uint(Open_Flags_Bits.NOCTTY) == 0o00000_400) #assert(1 << uint(Open_Flags_Bits.TRUNC) == 0o0000_1000) #assert(1 << uint(Open_Flags_Bits.APPEND) == 0o0000_2000) #assert(1 << uint(Open_Flags_Bits.NONBLOCK) == 0o0000_4000) #assert(1 << uint(Open_Flags_Bits.DSYNC) == 0o000_10000) #assert(1 << uint(Open_Flags_Bits.ASYNC) == 0o000_20000) #assert(1 << uint(Open_Flags_Bits.DIRECT) == 0o000_40000) #assert(1 << uint(Open_Flags_Bits.LARGEFILE) == 0o00_100000) #assert(1 << uint(Open_Flags_Bits.DIRECTORY) == 0o00_200000) #assert(1 << uint(Open_Flags_Bits.NOFOLLOW) == 0o00_400000) #assert(1 << uint(Open_Flags_Bits.NOATIME) == 0o0_1000000) #assert(1 << uint(Open_Flags_Bits.CLOEXEC) == 0o0_2000000) #assert(1 << uint(Open_Flags_Bits.PATH) == 0o_10000000) } else { Open_Flags_Bits :: enum { WRONLY = 0, RDWR = 1, CREAT = 6, EXCL = 7, NOCTTY = 8, TRUNC = 9, APPEND = 10, NONBLOCK = 11, DSYNC = 12, ASYNC = 13, DIRECTORY = 14, NOFOLLOW = 15, DIRECT = 16, LARGEFILE = 17, NOATIME = 18, CLOEXEC = 19, PATH = 21, } } /* Bits for FD_Flags bitset */ FD_Flags_Bits :: enum { SYMLINK_NOFOLLOW = 8, REMOVEDIR = 9, EACCESS = 9, SYMLINK_FOLLOW = 10, NO_AUTOMOUNT = 11, EMPTY_PATH = 12, STATX_FORCE_SYNC = 13, STATX_DONT_SYNC = 14, RECURSIVE = 15, } /* The bits for the Mode bitset. */ Mode_Bits :: enum { IXOTH = 0, // 0o0000001 IWOTH = 1, // 0o0000002 IROTH = 2, // 0o0000004 IXGRP = 3, // 0o0000010 IWGRP = 4, // 0o0000020 IRGRP = 5, // 0o0000040 IXUSR = 6, // 0o0000100 IWUSR = 7, // 0o0000200 IRUSR = 8, // 0o0000400 ISVTX = 9, // 0o0001000 ISGID = 10, // 0o0002000 ISUID = 11, // 0o0004000 IFIFO = 12, // 0o0010000 IFCHR = 13, // 0o0020000 IFDIR = 14, // 0o0040000 IFREG = 15, // 0o0100000 } /* The bits used by the Statx_Mask bitset */ Statx_Mask_Bits :: enum { TYPE = 0, MODE = 1, NLINK = 2, UID = 3, GID = 4, ATIME = 5, MTIME = 6, CTIME = 7, INO = 8, SIZE = 9, BLOCKS = 10, BTIME = 11, MNT_ID = 12, DIOALIGN = 13, } /* Bits found in Statx_Attr bitset You should not use these directly */ Statx_Attr_Bits :: enum { COMPRESSED = 2, // 0x00000004 IMMUTABLE = 4, // 0x00000010 APPEND = 5, // 0x00000020 NODUMP = 6, // 0x00000040 ENCRYPTED = 11, // 0x00000800 AUTOMOUNT = 12, // 0x00001000 MOUNT_ROOT = 13, // 0x00002000 VERITY = 20, // 0x00100000 DAX = 21, // 0x00200000 } /* Magic bits for filesystems returned by Stat_FS */ FS_Magic :: enum u32 { ADFS_SUPER_MAGIC = 0xadf5, AFFS_SUPER_MAGIC = 0xadff, AFS_SUPER_MAGIC = 0x5346414f, ANON_INODE_FS_MAGIC = 0x09041934, AUTOFS_SUPER_MAGIC = 0x0187, BDEVFS_MAGIC = 0x62646576, BEFS_SUPER_MAGIC = 0x42465331, BFS_MAGIC = 0x1badface, BINFMTFS_MAGIC = 0x42494e4d, BPF_FS_MAGIC = 0xcafe4a11, BTRFS_SUPER_MAGIC = 0x9123683e, BTRFS_TEST_MAGIC = 0x73727279, CGROUP_SUPER_MAGIC = 0x27e0eb, CGROUP2_SUPER_MAGIC = 0x63677270, CIFS_MAGIC_NUMBER = 0xff534d42, CODA_SUPER_MAGIC = 0x73757245, COH_SUPER_MAGIC = 0x012ff7b7, CRAMFS_MAGIC = 0x28cd3d45, DEBUGFS_MAGIC = 0x64626720, DEVFS_SUPER_MAGIC = 0x1373, DEVPTS_SUPER_MAGIC = 0x1cd1, ECRYPTFS_SUPER_MAGIC = 0xf15f, EFIVARFS_MAGIC = 0xde5e81e4, EFS_SUPER_MAGIC = 0x00414a53, EXT_SUPER_MAGIC = 0x137d, EXT2_OLD_SUPER_MAGIC = 0xef51, EXT2_SUPER_MAGIC = 0xef53, EXT3_SUPER_MAGIC = 0xef53, EXT4_SUPER_MAGIC = 0xef53, F2FS_SUPER_MAGIC = 0xf2f52010, FUSE_SUPER_MAGIC = 0x65735546, FUTEXFS_SUPER_MAGIC = 0xbad1dea, HFS_SUPER_MAGIC = 0x4244, HOSTFS_SUPER_MAGIC = 0x00c0ffee, HPFS_SUPER_MAGIC = 0xf995e849, HUGETLBFS_MAGIC = 0x958458f6, ISOFS_SUPER_MAGIC = 0x9660, JFFS2_SUPER_MAGIC = 0x72b6, JFS_SUPER_MAGIC = 0x3153464a, MINIX_SUPER_MAGIC = 0x137f, MINIX_SUPER_MAGIC2 = 0x138f, MINIX2_SUPER_MAGIC = 0x2468, MINIX2_SUPER_MAGIC2 = 0x2478, MINIX3_SUPER_MAGIC = 0x4d5a, MQUEUE_MAGIC = 0x19800202, MSDOS_SUPER_MAGIC = 0x4d44, MTD_INODE_FS_MAGIC = 0x11307854, NCP_SUPER_MAGIC = 0x564c, NFS_SUPER_MAGIC = 0x6969, NILFS_SUPER_MAGIC = 0x3434, NSFS_MAGIC = 0x6e736673, NTFS_SB_MAGIC = 0x5346544e, OCFS2_SUPER_MAGIC = 0x7461636f, OPENPROM_SUPER_MAGIC = 0x9fa1, OVERLAYFS_SUPER_MAGIC = 0x794c7630, PIPEFS_MAGIC = 0x50495045, PROC_SUPER_MAGIC = 0x9fa0, PSTOREFS_MAGIC = 0x6165676c, QNX4_SUPER_MAGIC = 0x002f, QNX6_SUPER_MAGIC = 0x68191122, RAMFS_MAGIC = 0x858458f6, REISERFS_SUPER_MAGIC = 0x52654973, ROMFS_MAGIC = 0x7275, SECURITYFS_MAGIC = 0x73636673, SELINUX_MAGIC = 0xf97cff8c, SMACK_MAGIC = 0x43415d53, SMB_SUPER_MAGIC = 0x517b, SMB2_MAGIC_NUMBER = 0xfe534d42, SOCKFS_MAGIC = 0x534f434b, SQUASHFS_MAGIC = 0x73717368, SYSFS_MAGIC = 0x62656572, SYSV2_SUPER_MAGIC = 0x012ff7b6, SYSV4_SUPER_MAGIC = 0x012ff7b5, TMPFS_MAGIC = 0x01021994, TRACEFS_MAGIC = 0x74726163, UDF_SUPER_MAGIC = 0x15013346, UFS_MAGIC = 0x00011954, USBDEVICE_SUPER_MAGIC = 0x9fa2, V9FS_MAGIC = 0x01021997, VXFS_SUPER_MAGIC = 0xa501fcf5, XENFS_SUPER_MAGIC = 0xabba1974, XENIX_SUPER_MAGIC = 0x012ff7b4, XFS_SUPER_MAGIC = 0x58465342, _XIAFS_SUPER_MAGIC = 0x012fd16d, } /* Bits for FS_Flags bitset */ FS_Flags_Bits :: enum { RDONLY = 0, NOSUID = 1, NODEV = 2, NOEXEC = 3, SYNCHRONOUS = 4, VALID = 5, MANDLOCK = 6, NOATIME = 10, NODIRATIME = 11, RELATIME = 12, NOSYMFOLLOW = 13, } Seek_Whence :: enum i16 { SET = 0, CUR = 1, END = 2, DATA = 3, HOLE = 4, } /* Bits for Close_Range_Flags */ Close_Range_Flags_Bits :: enum { CLOEXEC = 2, UNSHARE = 1, } /* Bits for Rename_Flags */ Rename_Flags_Bits :: enum { EXCHANGE = 1, NOREPLACE = 0, WHITEOUT = 2, } /* Type of the file in a directory entry */ Dirent_Type :: enum u8 { UNKNOWN = 0, FIFO = 1, CHR = 2, DIR = 4, BLK = 6, REG = 8, LNK = 10, SOCK = 12, WHT = 14, } /* Type of a lock for fcntl(2) */ FLock_Type :: enum i16 { RDLCK = 0, WRLCK = 1, UNLCK = 2, } /* Bits for FD_Notifications */ FD_Notifications_Bits :: enum { ACCESS = 0, MODIFY = 1, CREATE = 2, DELETE = 3, RENAME = 4, ATTRIB = 5, MULTISHOT = 31, } /* Bits for seal */ Seal_Bits :: enum { SEAL = 0, SHRINK = 1, GROW = 2, WRITE = 3, FUTURE_WRITE = 4, } RW_Hint :: enum u64 { WRITE_LIFE_NOT_SET = 0, WRITE_LIFE_NONE = 1, WRITE_LIFE_SHORT = 2, WRITE_LIFE_MEDIUM = 3, WRITE_LIFE_LONG = 4, WRITE_LIFE_EXTREME = 5, } FD_Lease :: enum { RDLCK = 0, WRLCK = 1, UNLCK = 2, } /* Kind of owner for FD_Owner */ F_Owner_Type :: enum i32 { OWNER_TID = 0, OWNER_PID = 1, OWNER_PGRP = 2, } /* Command for fcntl(2) */ FCntl_Command :: enum { DUPFD = 0, GETFD = 1, SETFD = 2, GETFL = 3, SETFL = 4, GETLK = 5, SETLK = 6, SETLKW = 7, SETOWN = 8, GETOWN = 9, SETSIG = 10, GETSIG = 11, SETOWN_EX = 15, GETOWN_EX = 16, // OFD_GETLK = 36, // OFD_SETLK = 37, // OFD_SETLKW = 38, SETLEASE = 1024, GETLEASE = 1025, NOTIFY = 1026, DUPFD_CLOEXEC = 1030, SETPIPE_SZ = 1031, GETPIPE_SZ = 1032, ADD_SEALS = 1033, GET_SEALS = 1034, GET_RW_HINT = 1035, SET_RW_HINT = 1036, GET_FILE_RW_HINT = 1037, SET_FILE_RW_HINT = 1038, // F_OK = 0, } Fd_Poll_Events_Bits :: enum { IN = 0, PRI = 1, OUT = 2, ERR = 3, HUP = 4, NVAL = 5, RDNORM = 6, RDBAND = 7, WRNORM = 8, WRBAND = 9, MSG = 10, REMOVE = 12, RDHUP = 13, } /* Bits for Mem_Protection bitfield */ Mem_Protection_Bits :: enum{ READ = 0, WRITE = 1, EXEC = 2, SEM = 3, // platform-specific section start ARM64_BTI = 4, ARM64_MTE = 5, // platform-specific section end GROWSDOWN = 24, GROWSUP = 25, } /* Bits for Map_Flags */ Map_Flags_Bits :: enum { SHARED = 0, PRIVATE = 1, SHARED_VALIDATE = 2, FIXED = 4, ANONYMOUS = 5, // platform-dependent section start X86_32BIT = 6, X86_ABOVE4G = 7, // platform-dependent section end GROWSDOWN = 8, DENYWRITE = 11, EXECUTABLE = 12, LOCKED = 13, NORESERVE = 14, POPULATE = 15, NONBLOCK = 16, STACK = 17, HUGETLB = 18, SYNC = 19, FIXED_NOREPLACE = 20, UNINITIALIZED = 26, } /* Bits for MLock_Flags */ MLock_Flags_Bits :: enum { ONFAULT = 0, } /* Bits for MSync_Flags */ MSync_Flags_Bits :: enum { ASYNC = 0, INVALIDATE = 1, SYNC = 2, } /* Argument for madvice(2) */ MAdvice :: enum { NORMAL = 0, RANDOM = 1, SEQUENTIAL = 2, WILLNEED = 3, DONTNEED = 4, FREE = 8, REMOVE = 9, DONTFORK = 10, DOFORK = 11, MERGEABLE = 12, UNMERGEABLE = 13, HUGEPAGE = 14, NOHUGEPAGE = 15, DONTDUMP = 16, DODUMP = 17, WIPEONFORK = 18, KEEPONFORK = 19, COLD = 20, PAGEOUT = 21, POPULATE_READ = 22, POPULATE_WRITE = 23, DONTNEED_LOCKED = 24, COLLAPSE = 25, HWPOISON = 100, SOFT_OFFLINE = 101, } /* Bits for PKey_Access_Rights */ PKey_Access_Bits :: enum { DISABLE_ACCESS = 0, DISABLE_WRITE = 2, } /* Bits for MRemap_Flags */ MRemap_Flags_Bits :: enum { MAYMOVE = 0, FIXED = 1, DONTUNMAP = 2, } /* Bits for Get_Random_Flags */ Get_Random_Flags_Bits :: enum { RANDOM = 0, NONBLOCK = 1, INSECURE = 2, } /* Bits for Perf_Flags */ Perf_Flags_Bits :: enum { FD_NO_GROUP = 0, FD_OUTPUT = 1, PID_CGROUP = 2, FD_CLOEXEC = 3, } /* Union tag for Perf_Event_Attr struct */ Perf_Event_Type :: enum u32 { HARDWARE = 0, SOFTWARE = 1, TRACEPOINT = 2, HW_CACHE = 3, RAW = 4, BREAKPOINT = 5, } Perf_Event_Flags_Bits :: enum u64 { Disabled = 0, Inherit = 1, Pinned = 2, Exclusive = 3, Exclude_User = 4, Exclude_Kernel = 5, Exclude_HV = 6, Exclude_Idle = 7, Mmap = 8, Comm = 9, Freq = 10, Inherit_Stat = 11, Enable_On_Exec = 12, Task = 13, Watermark = 14, Precise_IP_0 = 15, Precise_IP_1 = 16, Mmap_Data = 17, Sample_Id_All = 18, Exclude_Host = 19, Exclude_Guest = 20, Exclude_Callchain_Kernel = 21, Exclude_Callchain_User = 22, Mmap2 = 23, Comm_Exec = 24, Use_Clockid = 25, Context_Switch = 26, Write_Backward = 27, Namespaces = 28, KSymbol = 29, BPF_Event = 30, Aux_Output = 31, CGroup = 32, Text_Poke = 33, Build_Id = 34, Inherit_Thread = 35, Remove_On_Exec = 36, Sigtrap = 37, } Perf_Cap_Flags_Bits :: enum u64 { Bit0 = 0, Bit0_Is_Deprecated = 1, User_Rdpmc = 2, User_Time = 3, User_Time_Zero = 4, User_Time_Short = 5, } /* Specifies the type of the hardware event that you want to get info about */ Perf_Hardware_Id :: enum u64 { CPU_CYCLES = 0, INSTRUCTIONS = 1, CACHE_REFERENCES = 2, CACHE_MISSES = 3, BRANCH_INSTRUCTIONS = 4, BRANCH_MISSES = 5, BUS_CYCLES = 6, STALLED_CYCLES_FRONTEND = 7, STALLED_CYCLES_BACKEND = 8, REF_CPU_CYCLES = 9, } /* Specifies the cache for the particular cache event that you want to get info about */ Perf_Hardware_Cache_Id :: enum u64 { L1D = 0, L1I = 1, LL = 2, DTLB = 3, ITLB = 4, BPU = 5, NODE = 6, } /* Specifies the cache op that you want to get info about */ Perf_Hardware_Cache_Op_Id :: enum u64 { READ = 0, WRITE = 1, PREFETCH = 2, } /* Specifies the cache operation result that you want to get info about */ Perf_Hardware_Cache_Result_Id :: enum u64 { ACCESS = 0, MISS = 1, } /* Specifies the particular software event that you want to get info about */ Perf_Software_Id :: enum u64 { CPU_CLOCK = 0, TASK_CLOCK = 1, PAGE_FAULTS = 2, CONTEXT_SWITCHES = 3, CPU_MIGRATIONS = 4, PAGE_FAULTS_MIN = 5, PAGE_FAULTS_MAJ = 6, ALIGNMENT_FAULTS = 7, EMULATION_FAULTS = 8, DUMMY = 9, BPF_OUTPUT = 10, CGROUP_SWITCHES = 11, } /* Specifies which values to include in the sample */ Perf_Event_Sample_Type_Bits :: enum { IP = 0, TID = 1, TIME = 2, ADDR = 3, READ = 4, CALLCHAIN = 5, ID = 6, CPU = 7, PERIOD = 8, STREAM_ID = 9, RAW = 10, BRANCH_STACK = 11, REGS_USER = 12, STACK_USER = 13, WEIGHT = 14, DATA_SRC = 15, IDENTIFIER = 16, TRANSACTION = 17, REGS_INTR = 18, PHYS_ADDR = 19, AUX = 20, CGROUP = 21, DATA_PAGE_SIZE = 22, CODE_PAGE_SIZE = 23, WEIGHT_STRUCT = 24, } /// Describes field sets to include in mmaped page Perf_Read_Format_Bits :: enum { TOTAL_TIME_ENABLED = 0, TOTAL_TIME_RUNNING = 1, ID = 2, GROUP = 3, LOST = 4, } /* Chooses the breakpoint type */ Hardware_Breakpoint_Type :: enum u32 { EMPTY = 0, R = 1, W = 2, X = 4, RW = R | W, INVALID = RW | X, } /* Bits for Branch_Sample_Type */ Branch_Sample_Type_Bits :: enum { USER = 0, KERNEL = 1, HV = 2, ANY = 3, ANY_CALL = 4, ANY_RETURN = 5, IND_CALL = 6, ABORT_TX = 7, IN_TX = 8, NO_TX = 9, COND = 10, CALL_STACK = 11, IND_JUMP = 12, CALL = 13, NO_FLAGS = 14, NO_CYCLES = 15, TYPE_SAVE = 16, HW_INDEX = 17, PRIV_SAVE = 18, } /* Represent the type of Id */ Id_Type :: enum uint { ALL = 0, PID = 1, PGID = 2, PIDFD = 3, } /* Options for wait syscalls */ Wait_Option :: enum { WNOHANG = 0, WUNTRACED = 1, WSTOPPED = 1, WEXITED = 2, WCONTINUED = 3, WNOWAIT = 24, // // For processes created using clone __WNOTHREAD = 29, __WALL = 30, __WCLONE = 31, } /* Bits for flags for pidfd */ Pid_FD_Flags_Bits :: enum { NONBLOCK = 11, } /* Priority for process, process group, user */ Priority_Which :: enum i32 { PROCESS = 0, PGRP = 1, USER = 2, } Signal :: enum i32 { // POSIX-defined signals SIGINT = 2, // Interactive attention signal. SIGILL = 4, // Illegal instruction. SIGABRT = 6, // Abnormal termination. SIGFPE = 8, // Erroneous arithmetic operation. SIGSEGV = 11, // Invalid access to storage. SIGTERM = 15, // Termination request. // Other POSIX signals SIGHUP = 1, // Hangup. SIGQUIT = 3, // Quit. SIGTRAP = 5, // Trace/breakpoint trap. SIGKILL = 9, // Killed. SIGPIPE = 13, // Broken pipe. SIGALRM = 14, // Alarm clock. // Adjustments needed for most linux systems SIGSTKFLT = 16, // Stack fault (obsolete). SIGPWR = 30, // Power failure imminent. // Historical signals specified by POSIX. SIGBUS = 7, // Bus error. SIGSYS = 31, // Bad system call. // New(er) POSIX signals (1003.1-2008, 1003.1-2013). SIGURG = 23, // Urgent data is available at a socket. SIGSTOP = 19, // Stop, unblockable. SIGTSTP = 20, // Keyboard stop. SIGCONT = 18, // Continue. SIGCHLD = 17, // Child terminated or stopped. SIGTTIN = 21, // Background read from control terminal. SIGTTOU = 22, // Background write to control terminal. SIGPOLL = 29, // Pollable event occurred (System V). SIGXFSZ = 25, // File size limit exceeded. SIGXCPU = 24, // CPU time limit exceeded. SIGVTALRM = 26, // Virtual timer expired. SIGPROF = 27, // Profiling timer expired. SIGUSR1 = 10, // User-defined signal 1. SIGUSR2 = 12, // User-defined signal 2. // Nonstandard signals found in all modern POSIX systems (including both BSD and Linux). SIGWINCH = 28, // Window size change (4.3 BSD, Sun). // Archaic names for compatibility. SIGIO = SIGPOLL, // I/O now possible (4.2 BSD). SIGIOT = SIGABRT, // IOT instruction, abort() on a PDP-11. SIGCLD = SIGCHLD, // Old System V name } Sig_Mask_Kind :: enum i32 { SIG_BLOCK = 0, SIG_UNBLOCK = 1, SIG_SETMASK = 2, } Sig_Stack_Flag :: enum i32 { DISABLE = 0, ONSTACK = 1, AUTODISARM = 31, } Sig_Action_Flag :: enum u32 { NOCLDSTOP = 0, NOCLDWAIT = 1, SIGINFO = 2, UNSUPPORTED = 10, EXPOSE_TAGBITS = 11, RESTORER = 26, ONSTACK = 27, RESTART = 28, NODEFER = 30, RESETHAND = 31, } /* Translation of code in Sig_Info for when signo is SIGCHLD */ Sig_Child_Code :: enum { NONE, EXITED, KILLED, DUMPED, TRAPPED, STOPPED, CONTINUED, } /* Type of socket to create - For TCP you want to use SOCK_STREAM - For UDP you want to use SOCK_DGRAM Also see `Protocol` */ Socket_Type :: enum { STREAM = 1, DGRAM = 2, RAW = 3, RDM = 4, SEQPACKET = 5, DCCP = 6, PACKET = 10, } /* Bits for Socket_FD_Flags */ Socket_FD_Flags_Bits :: enum { NONBLOCK = 11, CLOEXEC = 19, } /* Protocol family */ Protocol_Family :: enum u16 { UNSPEC = 0, LOCAL = 1, UNIX = LOCAL, FILE = LOCAL, INET = 2, AX25 = 3, IPX = 4, APPLETALK = 5, NETROM = 6, BRIDGE = 7, ATMPVC = 8, X25 = 9, INET6 = 10, ROSE = 11, DECnet = 12, NETBEUI = 13, SECURITY = 14, KEY = 15, NETLINK = 16, ROUTE = NETLINK, PACKET = 17, ASH = 18, ECONET = 19, ATMSVC = 20, RDS = 21, SNA = 22, IRDA = 23, PPPOX = 24, WANPIPE = 25, LLC = 26, IB = 27, MPLS = 28, CAN = 29, TIPC = 30, BLUETOOTH = 31, IUCV = 32, RXRPC = 33, ISDN = 34, PHONET = 35, IEEE802154 = 36, CAIF = 37, ALG = 38, NFC = 39, VSOCK = 40, KCM = 41, QIPCRTR = 42, SMC = 43, XDP = 44, MCTP = 45, } /* The protocol number according to IANA protocol number list Full list of protocol numbers: https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml Supported by the OS protocols can be queried by reading: /etc/protocols */ Protocol :: enum { HOPOPT = 0, ICMP = 1, IGMP = 2, GGP = 3, IPv4 = 4, ST = 5, TCP = 6, CBT = 7, EGP = 8, IGP = 9, BBN_RCC_MON = 10, NVP_II = 11, PUP = 12, EMCON = 14, XNET = 15, CHAOS = 16, UDP = 17, MUX = 18, DCN_MEAS = 19, HMP = 20, PRM = 21, XNS_IDP = 22, TRUNK_1 = 23, TRUNK_2 = 24, LEAF_1 = 25, LEAF_2 = 26, RDP = 27, IRTP = 28, ISO_TP4 = 29, NETBLT = 30, MFE_NSP = 31, MERIT_INP = 32, DCCP = 33, THREE_PC = 34, IDPR = 35, XTP = 36, DDP = 37, IDPR_CMTP = 38, TP_PlusPlus = 39, IL = 40, IPv6 = 41, SDRP = 42, IPv6_Route = 43, IPv6_Frag = 44, IDRP = 45, RSVP = 46, GRE = 47, DSR = 48, BNA = 49, ESP = 50, AH = 51, I_NLSP = 52, NARP = 54, MOBILE = 55, TLSP = 56, SKIP = 57, IPv6_ICMP = 58, IPv6_NoNxt = 59, IPv6_Opts = 60, CFTP = 62, SAT_EXPAK = 64, KRYPTOLAN = 65, RVD = 66, IPPC = 67, SAT_MON = 69, VISA = 70, IPCV = 71, CPNX = 72, CPHB = 73, WSN = 74, PVP = 75, BR_SAT_MON = 76, SUN_ND = 77, WB_MON = 78, WB_EXPAK = 79, ISO_IP = 80, VMTP = 81, SECURE_VMTP = 82, VINES = 83, IPTM = 84, NSFNET_IGP = 85, DGP = 86, TCF = 87, EIGRP = 88, OSPFIGP = 89, Sprite_RPC = 90, LARP = 91, MTP = 92, AX_25 = 93, IPIP = 94, SCC_SP = 96, ETHERIP = 97, ENCAP = 98, GMTP = 100, IFMP = 101, PNNI = 102, PIM = 103, ARIS = 104, SCPS = 105, QNX = 106, A_N = 107, IPComp = 108, SNP = 109, Compaq_Peer = 110, IPX_in_IP = 111, VRRP = 112, PGM = 113, L2TP = 115, DDX = 116, IATP = 117, STP = 118, SRP = 119, UTI = 120, SMP = 121, PTP = 123, FIRE = 125, CRTP = 126, CRUDP = 127, SSCOPMCE = 128, IPLT = 129, SPS = 130, PIPE = 131, SCTP = 132, FC = 133, RSVP_E2E_IGNORE = 134, UDPLite = 136, MPLS_in_IP = 137, manet = 138, HIP = 139, Shim6 = 140, WESP = 141, ROHC = 142, Ethernet = 143, AGGFRAG = 144, NSH = 145, Reserved = 255, } /* API Level for getsockopt(2)/setsockopt(2) */ Socket_API_Level :: enum { // Comes from SOCKET = 1, // Copy-pasted from protocol numbers TCP = 6, UDP = 17, // Comes from RAW = 255, DECNET = 261, X25 = 262, PACKET = 263, ATM = 264, AAL = 265, IRDA = 266, NETBEUI = 267, LLC = 268, DCCP = 269, NETLINK = 270, TIPC = 271, RXRPC = 272, PPPOL2TP = 273, BLUETOOTH = 274, PNPIPE = 275, RDS = 276, IUCV = 277, CAIF = 278, ALG = 279, NFC = 280, KCM = 281, TLS = 282, XDP = 283, MPTCP = 284, MCTP = 285, SMC = 286, } /* If Socket_API_Level == .SOCKET, these are the options you can specify in getsockopt(2)/setsockopt(2) */ Socket_Option :: enum { DEBUG = 1, REUSEADDR = 2, TYPE = 3, ERROR = 4, DONTROUTE = 5, BROADCAST = 6, SNDBUF = 7, RCVBUF = 8, SNDBUFFORCE = 32, RCVBUFFORCE = 33, KEEPALIVE = 9, OOBINLINE = 10, NO_CHECK = 11, PRIORITY = 12, LINGER = 13, BSDCOMPAT = 14, REUSEPORT = 15, PASSCRED = 16, PEERCRED = 17, RCVLOWAT = 18, SNDLOWAT = 19, RCVTIMEO_OLD = 20, SNDTIMEO_OLD = 21, SECURITY_AUTHENTICATION = 22, SECURITY_ENCRYPTION_TRANSPORT = 23, SECURITY_ENCRYPTION_NETWORK = 24, BINDTODEVICE = 25, ATTACH_FILTER = 26, DETACH_FILTER = 27, GET_FILTER = ATTACH_FILTER, PEERNAME = 28, ACCEPTCONN = 30, PEERSEC = 31, PASSSEC = 34, MARK = 36, PROTOCOL = 38, DOMAIN = 39, RXQ_OVFL = 40, WIFI_STATUS = 41, PEEK_OFF = 42, NOFCS = 43, LOCK_FILTER = 44, SELECT_ERR_QUEUE = 45, BUSY_POLL = 46, MAX_PACING_RATE = 47, BPF_EXTENSIONS = 48, INCOMING_CPU = 49, ATTACH_BPF = 50, DETACH_BPF = DETACH_FILTER, ATTACH_REUSEPORT_CBPF = 51, ATTACH_REUSEPORT_EBPF = 52, CNX_ADVICE = 53, TIMESTAMPING_OPT_STATS = 54, MEMINFO = 55, INCOMING_NAPI_ID = 56, COOKIE = 57, TIMESTAMPING_PKTINFO = 58, PEERGROUPS = 59, ZEROCOPY = 60, TXTIME = 61, BINDTOIFINDEX = 62, TIMESTAMP_OLD = 29, TIMESTAMPNS_OLD = 35, TIMESTAMPING_OLD = 37, TIMESTAMP_NEW = 63, TIMESTAMPNS_NEW = 64, TIMESTAMPING_NEW = 65, RCVTIMEO_NEW = 66, SNDTIMEO_NEW = 67, DETACH_REUSEPORT_BPF = 68, PREFER_BUSY_POLL = 69, BUSY_POLL_BUDGET = 70, NETNS_COOKIE = 71, BUF_LOCK = 72, RESERVE_MEM = 73, TXREHASH = 74, RCVMARK = 75, TIMESTAMP = TIMESTAMP_OLD when _SOCKET_OPTION_OLD else TIMESTAMP_NEW, TIMESTAMPNS = TIMESTAMPNS_OLD when _SOCKET_OPTION_OLD else TIMESTAMPNS_NEW, TIMESTAMPING = TIMESTAMPING_OLD when _SOCKET_OPTION_OLD else TIMESTAMPING_NEW, RCVTIMEO = RCVTIMEO_OLD when _SOCKET_OPTION_OLD else RCVTIMEO_NEW, SNDTIMEO = SNDTIMEO_OLD when _SOCKET_OPTION_OLD else SNDTIMEO_NEW, } @(private) _SOCKET_OPTION_OLD :: size_of(rawptr) == 8 /* || size_of(time_t) == size_of(__kernel_long_t) */ Socket_UDP_Option :: enum { CORK = 1, ENCAP = 100, NO_CHECK6_TX = 101, NO_CHECK6_RX = 102, SEGMENT = 103, GRO = 104, } UPD_Encapsulation :: enum { ENCAP_ESPINUDP_NON_IKE = 1, ENCAP_ESPINUDP = 2, ENCAP_L2TPINUDP = 3, ENCAP_GTP0 = 4, ENCAP_GTP1U = 5, } Socket_TCP_Option :: enum { NODELAY = 1, MAXSEG = 2, CORK = 3, KEEPIDLE = 4, KEEPINTVL = 5, KEEPCNT = 6, SYNCNT = 7, LINGER2 = 8, DEFER_ACCEPT = 9, WINDOW_CLAMP = 10, INFO = 11, QUICKACK = 12, CONGESTION = 13, MD5SIG = 14, COOKIE_TRANSACTIONS = 15, THIN_LINEAR_TIMEOUTS = 16, THIN_DUPACK = 17, USER_TIMEOUT = 18, REPAIR = 19, REPAIR_QUEUE = 20, QUEUE_SEQ = 21, REPAIR_OPTIONS = 22, FASTOPEN = 23, TIMESTAMP = 24, NOTSENT_LOWAT = 25, CC_INFO = 26, SAVE_SYN = 27, SAVED_SYN = 28, REPAIR_WINDOW = 29, FASTOPEN_CONNECT = 30, ULP = 31, MD5SIG_EXT = 32, FASTOPEN_KEY = 33, FASTOPEN_NO_COOKIE = 34, ZEROCOPY_RECEIVE = 35, INQ = 36, CM_INQ = INQ, TX_DELAY = 37, } /* Bits for Socket_Msg */ Socket_Msg_Bits :: enum { OOB = 0, PEEK = 1, DONTROUTE = 2, TRYHARD = DONTROUTE, CTRUNC = 3, PROXY = 4, TRUNC = 5, DONTWAIT = 6, EOR = 7, WAITALL = 8, FIN = 9, SYN = 10, CONFIRM = 11, RST = 12, ERRQUEUE = 13, NOSIGNAL = 14, MORE = 15, WAITFORONE = 16, BATCH = 18, ZEROCOPY = 22, FASTOPEN = 29, CMSG_CLOEXEC = 30, } /* Argument to shutdown(2) */ Shutdown_How :: enum i32 { RD = 0, WR = 1, RDWR = 2, } /* Second argument to futex(2) syscall */ Futex_Op :: enum u32 { WAIT = 0, WAKE = 1, FD = 2, REQUEUE = 3, CMP_REQUEUE = 4, WAKE_OP = 5, LOCK_PI = 6, UNLOCK_PI = 7, TRYLOCK_PI = 8, WAIT_BITSET = 9, WAKE_BITSET = 10, WAIT_REQUEUE_PI = 11, CMP_REQUEUE_PI = 12, LOCK_PI2 = 13, } /* Bits for Futex_Flags */ Futex_Flags_Bits :: enum { PRIVATE = 7, REALTIME = 8, } /* Kind of operation on futex, see FUTEX_WAKE_OP */ Futex_Arg_Op :: enum { SET = 0, /* uaddr2 = oparg */ ADD = 1, /* uaddr2 += oparg */ OR = 2, /* uaddr2 |= oparg */ ANDN = 3, /* uaddr2 &= ~oparg */ XOR = 4, /* uaddr2 ^= oparg */ PO2_SET = 0, /* uaddr2 = 1< cmparg) wake */ GE = 5, /* if (oldval >= cmparg) wake */ } /* The kind of resource limits */ RLimit_Kind :: enum i32 { CPU = 0, FSIZE = 1, DATA = 2, STACK = 3, CORE = 4, RSS = 5, NOFILE = 7, AS = 9, NPROC = 6, MEMLOCK = 8, LOCKS = 10, SIGPENDING = 11, MSGQUEUE = 12, NICE = 13, RTPRIO = 14, RTTIME = 15, NLIMITS = 16, } /* Represents the user of resources */ RUsage_Who :: enum i32 { CHILDREN = -1, SELF = 0, THREAD = 1, LWP = THREAD, } /* Bits for Personality_Flags */ UNAME26 :: 17 ADDR_NO_RANDOMIZE :: 18 FDPIC_FUNCPTRS :: 19 MMAP_PAGE_ZERO :: 20 ADDR_COMPAT_LAYOUT :: 21 READ_IMPLIES_EXEC :: 22 ADDR_LIMIT_32BIT :: 23 SHORT_INODE :: 24 WHOLE_SECONDS :: 25 STICKY_TIMEOUTS :: 26 ADDR_LIMIT_3GB :: 27 /* Personality type These go into the bottom 8 bits of the personality value */ PER_LINUX :: 0x0000 PER_LINUX_32BIT :: 0x0000 | ADDR_LIMIT_32BIT PER_LINUX_FDPIC :: 0x0000 | FDPIC_FUNCPTRS PER_SVR4 :: 0x0001 | STICKY_TIMEOUTS | MMAP_PAGE_ZERO PER_SVR3 :: 0x0002 | STICKY_TIMEOUTS | SHORT_INODE PER_SCOSVR3 :: 0x0003 | STICKY_TIMEOUTS | WHOLE_SECONDS | SHORT_INODE PER_OSR5 :: 0x0003 | STICKY_TIMEOUTS | WHOLE_SECONDS PER_WYSEV386 :: 0x0004 | STICKY_TIMEOUTS | SHORT_INODE PER_ISCR4 :: 0x0005 | STICKY_TIMEOUTS PER_BSD :: 0x0006 PER_SUNOS :: 0x0006 | STICKY_TIMEOUTS PER_XENIX :: 0x0007 | STICKY_TIMEOUTS | SHORT_INODE PER_LINUX32 :: 0x0008 PER_LINUX32_3GB :: 0x0008 | ADDR_LIMIT_3GB PER_IRIX32 :: 0x0009 | STICKY_TIMEOUTS PER_IRIXN32 :: 0x000a | STICKY_TIMEOUTS PER_IRIX64 :: 0x000b | STICKY_TIMEOUTS PER_RISCOS :: 0x000c PER_SOLARIS :: 0x000d | STICKY_TIMEOUTS PER_UW7 :: 0x000e | STICKY_TIMEOUTS | MMAP_PAGE_ZERO PER_OSF4 :: 0x000f PER_HPUX :: 0x0010 PER_MASK :: 0x00ff /* Bits for access modes for shared memory */ IPC_Mode_Bits :: enum { WROTH = 1, RDOTH = 2, WRGRP = 4, RDGRP = 5, WRUSR = 7, RDUSR = 8, DEST = 9, LOCKED = 10, } /* Shared memory flags bits */ IPC_Flags_Bits :: enum { IPC_CREAT = 9, IPC_EXCL = 10, IPC_NOWAIT = 11, // Semaphore SEM_UNDO = 9, // Shared memory SHM_HUGETLB = 11, SHM_NORESERVE = 12, SHM_RDONLY = 12, SHM_RND = 13, SHM_REMAP = 14, SHM_EXEC = 15, // Message queue MSG_NOERROR = 12, MSG_EXCEPT = 13, MSG_COPY = 14, } /* IPC memory commands */ IPC_Cmd :: enum i16 { // IPC common IPC_RMID = 0, IPC_SET = 1, IPC_STAT = 2, // Shared memory SHM_LOCK = 11, SHM_UNLOCK = 12, SHM_STAT = 13, SHM_INFO = 14, SHM_STAT_ANY = 15, // Semaphore GETPID = 11, GETVAL = 12, GETALL = 13, GETNCNT = 14, GETZCNT = 15, SETVAL = 16, SETALL = 17, SEM_STAT = 18, SEM_INFO = 19, SEM_STAT_ANY = 20, // Message queue MSG_STAT = 11, MSG_INFO = 12, MSG_STAT_ANY = 13, } /* File locking operation bits */ FLock_Op_Bits :: enum { SH = 1, EX = 2, NB = 4, UN = 8, } /* ptrace requests */ PTrace_Request :: enum { TRACEME = 0, PEEKTEXT = 1, PEEKDATA = 2, PEEKUSER = 3, POKETEXT = 4, POKEDATA = 5, POKEUSER = 6, CONT = 7, KILL = 8, SINGLESTEP = 9, GETREGS = 12, SETREGS = 13, GETFPREGS = 14, SETFPREGS = 15, ATTACH = 16, DETACH = 17, GETFPXREGS = 18, SETFPXREGS = 19, SYSCALL = 24, GET_THREAD_AREA = 25, SET_THREAD_AREA = 26, ARCH_PRCTL = 30, SYSEMU = 31, SYSEMU_SINGLESTEP = 32, SINGLEBLOCK = 33, SETOPTIONS = 0x4200, GETEVENTMSG = 0x4201, GETSIGINFO = 0x4202, SETSIGINFO = 0x4203, GETREGSET = 0x4204, SETREGSET = 0x4205, SEIZE = 0x4206, INTERRUPT = 0x4207, LISTEN = 0x4208, PEEKSIGINFO = 0x4209, GETSIGMASK = 0x420a, SETSIGMASK = 0x420b, SECCOMP_GET_FILTER = 0x420c, SECCOMP_GET_METADATA = 0x420d, GET_SYSCALL_INFO = 0x420e, GET_RSEQ_CONFIGURATION = 0x420f, } /* ptrace options */ PTrace_Options_Bits :: enum { TRACESYSGOOD = 0, TRACEFORK = 1, TRACEVFORK = 2, TRACECLONE = 3, TRACEEXEC = 4, TRACEVFORKDONE = 5, TRACEEXIT = 6, TRACESECCOMP = 7, EXITKILL = 20, SUSPEND_SECCOMP = 21, } /* ptrace event codes. */ PTrace_Event_Code :: enum { EVENT_FORK = 1, EVENT_VFORK = 2, EVENT_CLONE = 3, EVENT_EXEC = 4, EVENT_VFORK_DONE = 5, EVENT_EXIT = 6, EVENT_SECCOMP = 7, EVENT_STOP = 128, } /* ptrace's get syscall info operation. */ PTrace_Get_Syscall_Info_Op :: enum u8 { NONE = 0, ENTRY = 1, EXIT = 2, SECCOMP = 3, } /* ptrace's PEEKSIGINFO flags bits */ PTrace_Peek_Sig_Info_Flags_Bits :: enum { SHARED = 0, } /* Syslog actions. */ Syslog_Action :: enum i32 { CLOSE = 0, OPEN = 1, READ = 2, READ_ALL = 3, READ_CLEAR = 4, CLEAR = 5, CONSOLE_OFF = 6, CONSOLE_ON = 7, CONSOLE_LEVEL = 8, SIZE_UNREAD = 9, SIZE_BUFFER = 10, } /* Bits for splice flags. */ Splice_Flags_Bits :: enum { MOVE = 0x01, NONBLOCK = 0x02, MORE = 0x04, GIFT = 0x08, } /* Clock IDs for various system clocks. */ Clock_Id :: enum { REALTIME = 0, MONOTONIC = 1, PROCESS_CPUTIME_ID = 2, THREAD_CPUTIME_ID = 3, MONOTONIC_RAW = 4, REALTIME_COARSE = 5, MONOTONIC_COARSE = 6, BOOTTIME = 7, REALTIME_ALARM = 8, BOOTTIME_ALARM = 9, } /* Bits for POSIX interval timer flags. */ ITimer_Flags_Bits :: enum { ABSTIME = 1, } /* Bits for epoll_create(2) flags. */ EPoll_Flags_Bits :: enum { FDCLOEXEC = 19, } EPoll_Event_Kind :: enum u32 { IN = 0x001, PRI = 0x002, OUT = 0x004, RDNORM = 0x040, RDBAND = 0x080, WRNORM = 0x100, WRBAND = 0x200, MSG = 0x400, ERR = 0x008, HUP = 0x010, RDHUP = 0x2000, EXCLUSIVE = 1<<28, WAKEUP = 1<<29, ONESHOT = 1<<30, ET = 1<<31, } EPoll_Ctl_Opcode :: enum i32 { ADD = 1, DEL = 2, MOD = 3, } /* Bits for execveat(2) flags. */ Execveat_Flags_Bits :: enum { AT_SYMLINK_NOFOLLOW = 8, AT_EMPTY_PATH = 12, }