aboutsummaryrefslogtreecommitdiff
path: root/core/sys
diff options
context:
space:
mode:
authorflysand7 <yyakut.ac@gmail.com>2023-10-27 11:30:13 +1100
committerflysand7 <yyakut.ac@gmail.com>2023-10-27 11:30:13 +1100
commitbbd4c1054e18f18e934828b5160efce076027d1e (patch)
treeec668882e371e67093792638be0ff61f1c0e44ad /core/sys
parent4d65b1ab9cb86bcbbfb0e5b26e3552f6f3582004 (diff)
convert spaces to tabs
Diffstat (limited to 'core/sys')
-rw-r--r--core/sys/linux/bits.odin2198
-rw-r--r--core/sys/linux/constants.odin24
-rw-r--r--core/sys/linux/helpers.odin90
-rw-r--r--core/sys/linux/sys.odin1308
-rw-r--r--core/sys/linux/types.odin632
-rw-r--r--core/sys/linux/wrappers.odin84
6 files changed, 2168 insertions, 2168 deletions
diff --git a/core/sys/linux/bits.odin b/core/sys/linux/bits.odin
index b6b22dfdb..0cf90ed3b 100644
--- a/core/sys/linux/bits.odin
+++ b/core/sys/linux/bits.odin
@@ -3,850 +3,850 @@ 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,
- 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,
- 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,
+ 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,
+ 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,
+ 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
Open_Flags_Bits :: enum {
- RDONLY = 0,
- WRONLY = 1,
- RDWR = 2,
- CREAT = 6,
- EXCL = 7,
- NOCTTY = 8,
- TRUNC = 9,
- APPEND = 10,
- NONBLOCK = 11,
- DSYNC = 12,
- ASYNC = 13,
- DIRECT = 14,
- DIRECTORY = 16,
- NOFOLLOW = 17,
- NOATIME = 18,
- CLOEXEC = 19,
- PATH = 21,
+ RDONLY = 0,
+ WRONLY = 1,
+ RDWR = 2,
+ CREAT = 6,
+ EXCL = 7,
+ NOCTTY = 8,
+ TRUNC = 9,
+ APPEND = 10,
+ NONBLOCK = 11,
+ DSYNC = 12,
+ ASYNC = 13,
+ DIRECT = 14,
+ DIRECTORY = 16,
+ NOFOLLOW = 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,
+ 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
- IFFIFO = 12, // 0o0010000
- IFCHR = 13, // 0o0020000
- IFDIR = 14, // 0o0040000
- IFREG = 15, // 0o0100000
+ 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
+ IFFIFO = 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,
+ 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
+ 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,
+ 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,
+ 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,
+ SET = 0,
+ CUR = 1,
+ END = 2,
+ DATA = 3,
+ HOLE = 4,
}
/// Bits for Close_Range_Flags
Close_Range_Flags_Bits :: enum {
- CLOEXEC = 2,
- UNSHARE = 1,
+ CLOEXEC = 2,
+ UNSHARE = 1,
}
/// Bits for Rename_Flags
Rename_Flags_Bits :: enum {
- EXCHANGE = 1,
- NOREPLACE = 0,
- WHITEOUT = 2,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ ONFAULT = 0,
}
/// Bits for MSync_Flags
MSync_Flags_Bits :: enum {
- ASYNC = 0,
- INVALIDATE = 1,
- SYNC = 2,
+ 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,
+ 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,
+ DISABLE_ACCESS = 0,
+ DISABLE_WRITE = 2,
}
/// Bits for MRemap_Flags
MRemap_Flags_Bits :: enum {
- MAYMOVE = 0,
- FIXED = 1,
- DONTUNMAP = 2,
+ MAYMOVE = 0,
+ FIXED = 1,
+ DONTUNMAP = 2,
}
/// Bits for Get_Random_Flags
Get_Random_Flags_Bits :: enum {
- RANDOM = 0,
- NONBLOCK = 1,
- INSECURE = 2,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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 :: enum {
- TOTAL_TIME_ENABLED = 0,
- TOTAL_TIME_RUNNING = 1,
- ID = 2,
- GROUP = 3,
- LOST = 4,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ NONBLOCK = 11,
}
/// Priority for process, process group, user
Priority_Which :: enum i32 {
- PROCESS = 0,
- PGRP = 1,
- USER = 2,
+ 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
+ // 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_BLOCK = 0,
+ SIG_UNBLOCK = 1,
+ SIG_SETMASK = 2,
}
Sig_Stack_Flag :: enum i32 {
- DISABLE = 0,
- ONSTACK = 1,
- AUTODISARM = 31,
+ DISABLE = 0,
+ ONSTACK = 1,
+ AUTODISARM = 31,
}
/// Type of socket to create
@@ -854,72 +854,72 @@ Sig_Stack_Flag :: enum i32 {
/// 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,
+ 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 = 14,
- CLOEXEC = 25,
+ NONBLOCK = 14,
+ CLOEXEC = 25,
}
/// 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,
+ 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
@@ -928,435 +928,435 @@ Protocol_Family :: enum u16 {
/// 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,
+ 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 get/setsockopt.2
Socket_API_Level :: enum {
- // Comes from <bits/socket-constants.h>
- SOCKET = 1,
- // Copy-pasted from protocol numbers
- TCP = 6,
- UDP = 17,
- // Comes from <bits/socket.h>
- 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,
+ // Comes from <bits/socket-constants.h>
+ SOCKET = 1,
+ // Copy-pasted from protocol numbers
+ TCP = 6,
+ UDP = 17,
+ // Comes from <bits/socket.h>
+ 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 get/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,
- // Hardcoded 64-bit Time. It's time to move on.
- TIMESTAMP = TIMESTAMP_NEW,
- TIMESTAMPNS = TIMESTAMPNS_NEW,
- TIMESTAMPING = TIMESTAMPING_NEW,
- RCVTIMEO = RCVTIMEO_NEW,
- SNDTIMEO = SNDTIMEO_NEW,
+ 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,
+ // Hardcoded 64-bit Time. It's time to move on.
+ TIMESTAMP = TIMESTAMP_NEW,
+ TIMESTAMPNS = TIMESTAMPNS_NEW,
+ TIMESTAMPING = TIMESTAMPING_NEW,
+ RCVTIMEO = RCVTIMEO_NEW,
+ SNDTIMEO = SNDTIMEO_NEW,
}
Socket_UDP_Option :: enum {
- CORK = 1,
- ENCAP = 100,
- NO_CHECK6_TX = 101,
- NO_CHECK6_RX = 102,
- SEGMENT = 103,
- GRO = 104,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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<<oparg; */
- PO2_ADD = 1, /* uaddr2 += 1<<oparg; */
- PO2_OR = 2, /* uaddr2 |= 1<<oparg; */
- PO2_ANDN = 3, /* uaddr2 &= ~(1<<oparg); */
- PO2_XOR = 4, /* uaddr2 ^= 1<<oparg; */
+ 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<<oparg; */
+ PO2_ADD = 1, /* uaddr2 += 1<<oparg; */
+ PO2_OR = 2, /* uaddr2 |= 1<<oparg; */
+ PO2_ANDN = 3, /* uaddr2 &= ~(1<<oparg); */
+ PO2_XOR = 4, /* uaddr2 ^= 1<<oparg; */
}
/// Kind of comparison operation on futex, see FUTEX_WAKE_OP
Futex_Cmp_Op :: enum {
- EQ = 0, /* if (oldval == cmparg) wake */
- NE = 1, /* if (oldval != cmparg) wake */
- LT = 2, /* if (oldval < cmparg) wake */
- LE = 3, /* if (oldval <= cmparg) wake */
- GT = 4, /* if (oldval > cmparg) wake */
- GE = 5, /* if (oldval >= cmparg) wake */
+ EQ = 0, /* if (oldval == cmparg) wake */
+ NE = 1, /* if (oldval != cmparg) wake */
+ LT = 2, /* if (oldval < cmparg) wake */
+ LE = 3, /* if (oldval <= cmparg) wake */
+ GT = 4, /* if (oldval > 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,
+ 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,
+ CHILDREN = -1,
+ SELF = 0,
+ THREAD = 1,
+ LWP = THREAD,
}
/// Bits for Personality_Flags
diff --git a/core/sys/linux/constants.odin b/core/sys/linux/constants.odin
index f826a556d..e725ed2fd 100644
--- a/core/sys/linux/constants.odin
+++ b/core/sys/linux/constants.odin
@@ -40,7 +40,7 @@ S_ISFIFO :: #force_inline proc "contextless" (m: Mode) -> bool {return (S_IFFIFO
/// Check the Mode bits to see if the file is a character device
S_ISCHR :: #force_inline proc "contextless" (m: Mode) -> bool {return (S_IFCHR == (m & S_IFMT))}
-
+
/// Check the Mode bits to see if the file is a directory
S_ISDIR :: #force_inline proc "contextless" (m: Mode) -> bool {return (S_IFDIR == (m & S_IFMT))}
@@ -70,17 +70,17 @@ R_OK :: Mode{.IROTH}
/// The stats you get by calling `stat`
STATX_BASIC_STATS :: Statx_Mask {
- .TYPE,
- .MODE,
- .NLINK,
- .UID,
- .GID,
- .ATIME,
- .MTIME,
- .CTIME,
- .INO,
- .SIZE,
- .BLOCKS,
+ .TYPE,
+ .MODE,
+ .NLINK,
+ .UID,
+ .GID,
+ .ATIME,
+ .MTIME,
+ .CTIME,
+ .INO,
+ .SIZE,
+ .BLOCKS,
}
diff --git a/core/sys/linux/helpers.odin b/core/sys/linux/helpers.odin
index 8fe4de6d2..cf4143924 100644
--- a/core/sys/linux/helpers.odin
+++ b/core/sys/linux/helpers.odin
@@ -29,7 +29,7 @@ where
size_of(p2) <= size_of(uintptr)
{
return cast(int) intrinsics.syscall(nr,
- cast(uintptr) p1, cast(uintptr) p2)
+ cast(uintptr) p1, cast(uintptr) p2)
}
@(private)
@@ -40,9 +40,9 @@ where
size_of(p3) <= size_of(uintptr)
{
return cast(int) intrinsics.syscall(nr,
- cast(uintptr) p1,
- cast(uintptr) p2,
- cast(uintptr) p3)
+ cast(uintptr) p1,
+ cast(uintptr) p2,
+ cast(uintptr) p3)
}
@(private)
@@ -54,10 +54,10 @@ where
size_of(p4) <= size_of(uintptr)
{
return cast(int) intrinsics.syscall(nr,
- cast(uintptr) p1,
- cast(uintptr) p2,
- cast(uintptr) p3,
- cast(uintptr) p4)
+ cast(uintptr) p1,
+ cast(uintptr) p2,
+ cast(uintptr) p3,
+ cast(uintptr) p4)
}
@(private)
@@ -70,11 +70,11 @@ where
size_of(p5) <= size_of(uintptr)
{
return cast(int) intrinsics.syscall(nr,
- cast(uintptr) p1,
- cast(uintptr) p2,
- cast(uintptr) p3,
- cast(uintptr) p4,
- cast(uintptr) p5)
+ cast(uintptr) p1,
+ cast(uintptr) p2,
+ cast(uintptr) p3,
+ cast(uintptr) p4,
+ cast(uintptr) p5)
}
@(private)
@@ -88,12 +88,12 @@ where
size_of(p6) <= size_of(uintptr)
{
return cast(int) intrinsics.syscall(nr,
- cast(uintptr) p1,
- cast(uintptr) p2,
- cast(uintptr) p3,
- cast(uintptr) p4,
- cast(uintptr) p5,
- cast(uintptr) p6)
+ cast(uintptr) p1,
+ cast(uintptr) p2,
+ cast(uintptr) p3,
+ cast(uintptr) p4,
+ cast(uintptr) p5,
+ cast(uintptr) p6)
}
syscall :: proc {syscall0, syscall1, syscall2, syscall3, syscall4, syscall5, syscall6}
@@ -106,24 +106,24 @@ syscall :: proc {syscall0, syscall1, syscall2, syscall3, syscall4, syscall5, sys
@(private)
errno_unwrap3 :: #force_inline proc "contextless" (ret: $P, $T: typeid, $U: typeid) -> (T, Errno)
where
- intrinsics.type_is_ordered_numeric(P)
+ intrinsics.type_is_ordered_numeric(P)
{
- if ret < 0 {
- default_value: T
- return default_value, Errno(-ret)
- } else {
- return cast(T) transmute(U) ret, Errno(.NONE)
- }
+ if ret < 0 {
+ default_value: T
+ return default_value, Errno(-ret)
+ } else {
+ return cast(T) transmute(U) ret, Errno(.NONE)
+ }
}
@(private)
errno_unwrap2 :: #force_inline proc "contextless" (ret: $P, $T: typeid) -> (T, Errno) {
- if ret < 0 {
- default_value: T
- return default_value, Errno(-ret)
- } else {
- return cast(T) ret, Errno(.NONE)
- }
+ if ret < 0 {
+ default_value: T
+ return default_value, Errno(-ret)
+ } else {
+ return cast(T) ret, Errno(.NONE)
+ }
}
@(private)
@@ -132,19 +132,19 @@ errno_unwrap :: proc {errno_unwrap2, errno_unwrap3}
// Note(flysand): 32-bit architectures sometimes take in a 64-bit argument in a
// register pair. This function should help me avoid typing the same code a few times..
when size_of(int) == 4 {
- // xxx64 system calls take some parameters as pairs of ulongs rather than a single pointer
- @(private)
- compat64_arg_pair :: #force_inline proc "contextless" (a: i64) -> (hi: uint, lo: uint) {
- no_sign := uint(a)
- hi = uint(no_sign >> 32)
- lo = uint(no_sign & 0xffff_ffff)
- return
- }
+ // xxx64 system calls take some parameters as pairs of ulongs rather than a single pointer
+ @(private)
+ compat64_arg_pair :: #force_inline proc "contextless" (a: i64) -> (hi: uint, lo: uint) {
+ no_sign := uint(a)
+ hi = uint(no_sign >> 32)
+ lo = uint(no_sign & 0xffff_ffff)
+ return
+ }
} else {
- // ... and on 64-bit architectures it's just a long
- @(private)
- compat64_arg_pair :: #force_inline proc "contextless" (a: i64) -> (uint) {
- return uint(a)
- }
+ // ... and on 64-bit architectures it's just a long
+ @(private)
+ compat64_arg_pair :: #force_inline proc "contextless" (a: i64) -> (uint) {
+ return uint(a)
+ }
}
diff --git a/core/sys/linux/sys.odin b/core/sys/linux/sys.odin
index fa7b7186a..77361826e 100644
--- a/core/sys/linux/sys.odin
+++ b/core/sys/linux/sys.odin
@@ -11,8 +11,8 @@ import "core:intrinsics"
/// Available since Linux 1.0
/// Before Linux 3.14, this operation is not atomic (i.e. not thread safe).
read :: proc "contextless" (fd: Fd, buf: []$T) -> (int, Errno) {
- ret := syscall(SYS_read, fd, raw_data(buf), len(buf) * size_of(T))
- return errno_unwrap(ret, int)
+ ret := syscall(SYS_read, fd, raw_data(buf), len(buf) * size_of(T))
+ return errno_unwrap(ret, int)
}
/// Write the data from a buffer into the file
@@ -26,28 +26,28 @@ read :: proc "contextless" (fd: Fd, buf: []$T) -> (int, Errno) {
/// Available since Linux 1.0
/// Before Linux 3.14 this operation is not atomic (i.e. not thread safe)
write :: proc "contextless" (fd: Fd, buf: []$T) -> (int, Errno) {
- ret := syscall(SYS_write, fd, raw_data(buf), len(buf)*size_of(T))
- return errno_unwrap(ret, int)
+ ret := syscall(SYS_write, fd, raw_data(buf), len(buf)*size_of(T))
+ return errno_unwrap(ret, int)
}
/// Open file, get the file descriptor
/// Available since Linux 1.0
/// On ARM64 available since Linux 2.6.16
open :: proc "contextless" (name: cstring, flags: Open_Flags, mode: Mode = {}) -> (Fd, Errno) {
- when ODIN_ARCH == .arm64 {
- ret := syscall(SYS_openat, AT_FDCWD, transmute(uintptr) name, transmute(u32) mode)
- return errno_unwrap(ret, Fd)
- } else {
- ret := syscall(SYS_open, transmute(uintptr) name, transmute(u32) mode)
- return errno_unwrap(ret, Fd)
- }
+ when ODIN_ARCH == .arm64 {
+ ret := syscall(SYS_openat, AT_FDCWD, transmute(uintptr) name, transmute(u32) mode)
+ return errno_unwrap(ret, Fd)
+ } else {
+ ret := syscall(SYS_open, transmute(uintptr) name, transmute(u32) mode)
+ return errno_unwrap(ret, Fd)
+ }
}
/// Close the file
/// Available since Linux 1.0
close :: proc "contextless" (fd: Fd) -> (Errno) {
- ret := syscall(SYS_close, fd)
- return Errno(-ret)
+ ret := syscall(SYS_close, fd)
+ return Errno(-ret)
}
/// Get file status
@@ -58,18 +58,18 @@ close :: proc "contextless" (fd: Fd) -> (Errno) {
/// For 32-bit systems a different syscall is used that became available since 2.4
/// Not available on arm64
stat :: proc "contextless" (filename: cstring, stat: ^Stat) -> (Errno) {
- when size_of(int) == 8 {
- when ODIN_ARCH == .arm64 {
- ret := syscall(SYS_fstatat, AT_FDCWD, cast(rawptr) filename, stat)
- return Errno(-ret)
- } else {
- ret := syscall(SYS_stat, cast(rawptr) filename, stat)
- return Errno(-ret)
- }
- } else {
- ret := syscall(SYS_stat64, cast(rawptr) filename, stat)
- return Errno(-ret)
- }
+ when size_of(int) == 8 {
+ when ODIN_ARCH == .arm64 {
+ ret := syscall(SYS_fstatat, AT_FDCWD, cast(rawptr) filename, stat)
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_stat, cast(rawptr) filename, stat)
+ return Errno(-ret)
+ }
+ } else {
+ ret := syscall(SYS_stat64, cast(rawptr) filename, stat)
+ return Errno(-ret)
+ }
}
/// Get file status from file descriptor
@@ -79,13 +79,13 @@ stat :: proc "contextless" (filename: cstring, stat: ^Stat) -> (Errno) {
/// Available since Linux 1.0
/// For 32-bit systems a different syscall is used that became available since 2.4
fstat :: proc "contextless" (fd: Fd, stat: ^Stat) -> (Errno) {
- when size_of(int) == 8 {
- ret := syscall(SYS_fstat, stat)
- return Errno(-ret)
- } else {
- ret := syscall(SYS_fstat64, stat)
- return Errno(-ret)
- }
+ when size_of(int) == 8 {
+ ret := syscall(SYS_fstat, stat)
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_fstat64, stat)
+ return Errno(-ret)
+ }
}
/// Get information about the file that's potentially a symbolic link
@@ -97,32 +97,32 @@ fstat :: proc "contextless" (fd: Fd, stat: ^Stat) -> (Errno) {
/// For 32-bit systems a different syscall is used that became available since 2.4
/// Not available on arm64
lstat :: proc "contextless" (filename: cstring, stat: ^Stat) -> (Errno) {
- when size_of(int) == 8 {
- when ODIN_ARCH == .arm64 {
- return fstatat(AT_FDCWD, filename, stat, {.SYMLINK_NOFOLLOW})
- } else {
- ret := syscall(SYS_lstat, cast(rawptr) filename, stat)
- return Errno(-ret)
- }
- } else {
- ret := syscall(SYS_lstat64, cast(rawptr) filename, stat)
- return Errno(-ret)
- }
+ when size_of(int) == 8 {
+ when ODIN_ARCH == .arm64 {
+ return fstatat(AT_FDCWD, filename, stat, {.SYMLINK_NOFOLLOW})
+ } else {
+ ret := syscall(SYS_lstat, cast(rawptr) filename, stat)
+ return Errno(-ret)
+ }
+ } else {
+ ret := syscall(SYS_lstat64, cast(rawptr) filename, stat)
+ return Errno(-ret)
+ }
}
/// Wait on event on a file descriptor
/// Available since Linux 2.2
poll :: proc "contextless" (fds: []Poll_Fd, timeout: i32) -> (i32, Errno) {
- when ODIN_ARCH == .arm64 {
- seconds := cast(uint) timeout / 1000
- nanoseconds := cast(uint) (timeout % 1000) * 1_000_000
- timeout_spec := Time_Spec{seconds, nanoseconds}
- ret := syscall(SYS_ppoll, raw_data(fds), len(fds), &timeout_spec, 0, 0)
- return errno_unwrap(ret, i32)
- } else {
- ret := syscall(SYS_poll, raw_data(fds), len(fds), timeout)
- return errno_unwrap(ret, i32)
- }
+ when ODIN_ARCH == .arm64 {
+ seconds := cast(uint) timeout / 1000
+ nanoseconds := cast(uint) (timeout % 1000) * 1_000_000
+ timeout_spec := Time_Spec{seconds, nanoseconds}
+ ret := syscall(SYS_ppoll, raw_data(fds), len(fds), &timeout_spec, 0, 0)
+ return errno_unwrap(ret, i32)
+ } else {
+ ret := syscall(SYS_poll, raw_data(fds), len(fds), timeout)
+ return errno_unwrap(ret, i32)
+ }
}
@@ -130,54 +130,54 @@ poll :: proc "contextless" (fds: []Poll_Fd, timeout: i32) -> (i32, Errno) {
/// Available since Linux 1.0
/// On 32-bit platforms available since Linux 1.2
lseek :: proc "contextless" (fd: Fd, off: i64, whence: Seek_Whence) -> (Errno) {
- when size_of(int) == 8 {
- ret := syscall(SYS_lseek, fd, off, whence)
- return Errno(-ret)
- } else {
- ret := syscall(SYS__llseek, fd, compat64_arg_pair(off), whence)
- return Errno(-ret)
- }
+ when size_of(int) == 8 {
+ ret := syscall(SYS_lseek, fd, off, whence)
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS__llseek, fd, compat64_arg_pair(off), whence)
+ return Errno(-ret)
+ }
}
/// Map files into memory
/// Available since Linux 1.0
/// On 32-bit platforms since Linux 1.0
mmap :: proc "contextless" (addr: uintptr, size: uint, prot: Mem_Protection, flags: Map_Flags, fd: Fd = Fd(-1), offset: i64 = 0) -> (rawptr, Errno) {
- when size_of(int) == 8 {
- ret := syscall(SYS_mmap, addr, size, transmute(i32) prot, transmute(i32) flags, fd, offset)
- return errno_unwrap(ret, rawptr, uintptr)
- } else {
- ret := syscall(SYS_mmap2, addr, size, transmute(i32) prot, transmute(i32) flags, fd, cast(uintptr)(offset/4096))
- return errno_unwrap(ret, rawptr, uintptr)
- }
+ when size_of(int) == 8 {
+ ret := syscall(SYS_mmap, addr, size, transmute(i32) prot, transmute(i32) flags, fd, offset)
+ return errno_unwrap(ret, rawptr, uintptr)
+ } else {
+ ret := syscall(SYS_mmap2, addr, size, transmute(i32) prot, transmute(i32) flags, fd, cast(uintptr)(offset/4096))
+ return errno_unwrap(ret, rawptr, uintptr)
+ }
}
/// Protect memory region
mprotect :: proc "contextless" (addr: rawptr, size: uint, prot: Mem_Protection) -> (Errno) {
- ret := syscall(SYS_mprotect, addr, size, transmute(i32) prot)
- return Errno(-ret)
+ ret := syscall(SYS_mprotect, addr, size, transmute(i32) prot)
+ return Errno(-ret)
}
/// Unmap memory
/// Available since Linux 1.0
munmap :: proc "contextless" (addr: rawptr, size: uint) -> (Errno) {
- ret := syscall(SYS_mmap, addr, size)
- return Errno(-ret)
+ ret := syscall(SYS_mmap, addr, size)
+ return Errno(-ret)
}
// TODO(flysand): brk
/// Alter an action taken by a process
rt_sigaction :: proc "contextless" (sig: Signal, sigaction: ^Sig_Action, old_sigaction: ^Sig_Action) -> Errno {
- ret := syscall(SYS_rt_sigaction, sig, sigaction, old_sigaction, size_of(Sig_Set))
- return Errno(-ret)
+ ret := syscall(SYS_rt_sigaction, sig, sigaction, old_sigaction, size_of(Sig_Set))
+ return Errno(-ret)
}
/// Examime and alter blocked signals
/// Available since Linux 2.2
rt_sigprocmask :: proc "contextless" (mask_kind: Sig_Mask_Kind, new_set: ^Sig_Set, old_set: ^Sig_Set) -> Errno {
- ret := syscall(SYS_rt_sigprocmask, mask_kind, new_set, old_set, size_of(Sig_Set))
- return Errno(-ret)
+ ret := syscall(SYS_rt_sigprocmask, mask_kind, new_set, old_set, size_of(Sig_Set))
+ return Errno(-ret)
}
// TODO(flysand): rt_sigreturn
@@ -188,16 +188,16 @@ rt_sigprocmask :: proc "contextless" (mask_kind: Sig_Mask_Kind, new_set: ^Sig_Se
/// Note, it is not an error to return less bytes than requested
/// Available since Linux 2.2
pread :: proc "contextless" (fd: Fd, buf: []$T, offset: i64) -> (int, Errno) {
- ret := syscall(SYS_pread64, fd, raw_data(buf), compat64_arg_pair(len(buf)*size_of(T)))
- return errno_unwrap(ret, int)
+ ret := syscall(SYS_pread64, fd, raw_data(buf), compat64_arg_pair(len(buf)*size_of(T)))
+ return errno_unwrap(ret, int)
}
/// Read the file at a specified offset
/// Note, it is not an error to return less bytes than requested
/// Available since Linux 2.2
pwrite :: proc "contextless" (fd: Fd, buf: []$T, offset: i64) -> (int, Errno) {
- ret := syscall(SYS_pwrite64, fd, raw_data(buf), compat64_arg_pair(len(buf)*size_of(T)))
- return errno_unwrap(ret, int)
+ ret := syscall(SYS_pwrite64, fd, raw_data(buf), compat64_arg_pair(len(buf)*size_of(T)))
+ return errno_unwrap(ret, int)
}
// TODO(flysand): readv
@@ -210,20 +210,20 @@ pwrite :: proc "contextless" (fd: Fd, buf: []$T, offset: i64) -> (int, Errno) {
/// Available since Linux 1.0
/// For ARM64 available since Linux 2.6.16
access :: proc "contextless" (name: cstring, mode: Mode = F_OK) -> (bool, Errno) {
- when ODIN_ARCH == .arm64 {
- ret := syscall(SYS_faccessat, AT_FDCWD, cast(rawptr) name, transmute(u32) mode)
- return errno_unwrap(ret, bool)
- } else {
- ret := syscall(SYS_access, cast(rawptr) name, transmute(u32) mode)
- return errno_unwrap(ret, bool)
- }
+ when ODIN_ARCH == .arm64 {
+ ret := syscall(SYS_faccessat, AT_FDCWD, cast(rawptr) name, transmute(u32) mode)
+ return errno_unwrap(ret, bool)
+ } else {
+ ret := syscall(SYS_access, cast(rawptr) name, transmute(u32) mode)
+ return errno_unwrap(ret, bool)
+ }
}
/// Create a pipe
/// Available since Linux 2.6.27
pipe2 :: proc "contextless" (pipes: ^[2]Fd, flags: Open_Flags) -> (Errno) {
- ret := syscall(SYS_pipe2, pipes, transmute(u32) flags)
- return Errno(-ret)
+ ret := syscall(SYS_pipe2, pipes, transmute(u32) flags)
+ return Errno(-ret)
}
// TODO(flysand): select
@@ -232,20 +232,20 @@ pipe2 :: proc "contextless" (pipes: ^[2]Fd, flags: Open_Flags) -> (Errno) {
// TODO(flysand): add docs here
mremap :: proc "contextless" (old_addr: rawptr, old_size: uint, new_size: uint, flags: MRemap_Flags, new_addr: uintptr = 0) -> (rawptr, Errno) {
- if .FIXED in flags {
- ret := syscall(SYS_mremap, old_addr, old_size, new_size, transmute(i32) flags, new_addr)
- return errno_unwrap(ret, rawptr, rawptr)
- } else {
- ret := syscall(SYS_mremap, old_addr, old_size, new_size, transmute(i32) flags)
- return errno_unwrap(ret, rawptr, rawptr)
- }
+ if .FIXED in flags {
+ ret := syscall(SYS_mremap, old_addr, old_size, new_size, transmute(i32) flags, new_addr)
+ return errno_unwrap(ret, rawptr, rawptr)
+ } else {
+ ret := syscall(SYS_mremap, old_addr, old_size, new_size, transmute(i32) flags)
+ return errno_unwrap(ret, rawptr, rawptr)
+ }
}
/// Sync file with memory map
/// Available since Linux 2.0
msync :: proc "contextless" (addr: rawptr, size: uint, flags: MSync_Flags) -> (Errno) {
- ret := syscall(SYS_msync, addr, size, transmute(i32) flags)
- return Errno(-ret)
+ ret := syscall(SYS_msync, addr, size, transmute(i32) flags)
+ return Errno(-ret)
}
// TODO(flysand): mincore
@@ -253,8 +253,8 @@ msync :: proc "contextless" (addr: rawptr, size: uint, flags: MSync_Flags) -> (E
/// Give advice about use of memory
/// Available since Linux 2.4
madvise :: proc "contextless" (addr: rawptr, size: uint, advice: MAdvice) -> (Errno) {
- ret := syscall(SYS_madvise, addr, size, advice)
- return Errno(-ret)
+ ret := syscall(SYS_madvise, addr, size, advice)
+ return Errno(-ret)
}
// TODO(flysand): shmget
@@ -266,21 +266,21 @@ madvise :: proc "contextless" (addr: rawptr, size: uint, advice: MAdvice) -> (Er
/// Allocate a new file descriptor that refers to the same file as the one provided
/// Available since Linux 1.0
dup :: proc "contextless" (fd: Fd) -> (Fd, Errno) {
- ret := syscall(SYS_dup, fd)
- return errno_unwrap(ret, Fd)
+ ret := syscall(SYS_dup, fd)
+ return errno_unwrap(ret, Fd)
}
/// Adjust an existing file descriptor to point to the same file as `old`
/// Available since Linux 1.0
/// On ARM64 available since Linux 2.6.27
dup2 :: proc "contextless" (old: Fd, new: Fd) -> (Fd, Errno) {
- when ODIN_ARCH == .arm64 {
- ret := syscall(SYS_dup3, old, new, 0)
- return errno_unwrap(ret, Fd)
- } else {
- ret := syscall(SYS_dup2, old, new)
- return errno_unwrap(ret, Fd)
- }
+ when ODIN_ARCH == .arm64 {
+ ret := syscall(SYS_dup3, old, new, 0)
+ return errno_unwrap(ret, Fd)
+ } else {
+ ret := syscall(SYS_dup2, old, new)
+ return errno_unwrap(ret, Fd)
+ }
}
// TODO(flysand): pause
@@ -297,7 +297,7 @@ dup2 :: proc "contextless" (old: Fd, new: Fd) -> (Fd, Errno) {
/// Note that it doesn't return the pid, despite it's name.
/// Available since Linux 1.0
getpid :: proc "contextless" () -> Pid {
- return cast(Pid) syscall(SYS_getpid)
+ return cast(Pid) syscall(SYS_getpid)
}
// TODO(flysand): sendfile
@@ -305,21 +305,21 @@ getpid :: proc "contextless" () -> Pid {
/// Create a socket file descriptor
/// Available since Linux 2.0
socket :: proc "contextless" (domain: Address_Family, socktype: Socket_Type, sockflags: Socket_FD_Flags, protocol: Protocol) -> (Fd, Errno) {
- sock_type_flags: int = cast(int) socktype | transmute(int) sockflags
- ret := syscall(SYS_socket, domain, sock_type_flags, protocol)
- return errno_unwrap(ret, Fd)
+ sock_type_flags: int = cast(int) socktype | transmute(int) sockflags
+ ret := syscall(SYS_socket, domain, sock_type_flags, protocol)
+ return errno_unwrap(ret, Fd)
}
/// Connect the socket to the address
/// Available since Linux 2.0
connect :: proc "contextless" (sock: Fd, addr: ^$T) -> (Errno)
where
- T == Sock_Addr_In ||
- T == Sock_Addr_In6 ||
- T == Sock_Addr_Any
+ T == Sock_Addr_In ||
+ T == Sock_Addr_In6 ||
+ T == Sock_Addr_Any
{
- ret := syscall(SYS_connect, sock, addr, size_of(T))
- return Errno(-ret)
+ ret := syscall(SYS_connect, sock, addr, size_of(T))
+ return Errno(-ret)
}
/// Accept a pending connection or block until new connection appears
@@ -327,45 +327,45 @@ where
/// Available since Linux 2.0
accept :: proc "contextless" (sock: Fd, addr: ^$T, sockflags: Socket_FD_Flags = {}) -> (Fd, Errno)
where
- T == Sock_Addr_In ||
- T == Sock_Addr_In6 ||
- T == Sock_Addr_Any
+ T == Sock_Addr_In ||
+ T == Sock_Addr_In6 ||
+ T == Sock_Addr_Any
{
- ret := syscall(SYS_accept4, sock, addr, size_of(T), transmute(int) sockflags)
- return errno_unwrap(ret, Fd)
+ ret := syscall(SYS_accept4, sock, addr, size_of(T), transmute(int) sockflags)
+ return errno_unwrap(ret, Fd)
}
// TODO(flysand): Rewrite recvfrom and sendto to use default parameters
recvfrom :: proc "contextless" (sock: Fd, buf: []u8, flags: Socket_Msg, addr: ^$T) -> (int, Errno)
where
- T == Sock_Addr_In ||
- T == Sock_Addr_In6 ||
- T == Sock_Addr_Any
+ T == Sock_Addr_In ||
+ T == Sock_Addr_In6 ||
+ T == Sock_Addr_Any
{
- ret := syscall(SYS_recvfrom, sock, raw_data(buf), len(buf), transmute(i32) flags, addr, size_of(T))
- return errno_unwrap(ret, int)
+ ret := syscall(SYS_recvfrom, sock, raw_data(buf), len(buf), transmute(i32) flags, addr, size_of(T))
+ return errno_unwrap(ret, int)
}
@private
recv_noaddr :: proc "contextless" (sock: Fd, buf: []u8, flags: Socket_Msg) -> (int, Errno) {
- ret := syscall(SYS_recvfrom, sock, raw_data(buf), len(buf), transmute(i32) flags, cast(rawptr) nil, cast(uintptr) 0)
- return errno_unwrap(ret, int)
+ ret := syscall(SYS_recvfrom, sock, raw_data(buf), len(buf), transmute(i32) flags, cast(rawptr) nil, cast(uintptr) 0)
+ return errno_unwrap(ret, int)
}
sendto :: proc "contextless" (sock: Fd, buf: []u8, flags: Socket_Msg, addr: ^$T) -> (int, Errno)
where
- T == Sock_Addr_In ||
- T == Sock_Addr_In6 ||
- T == Sock_Addr_Any
+ T == Sock_Addr_In ||
+ T == Sock_Addr_In6 ||
+ T == Sock_Addr_Any
{
- ret := syscall(SYS_sendto, sock, raw_data(buf), len(buf), transmute(i32) flags, addr, size_of(T))
- return errno_unwrap(ret, int)
+ ret := syscall(SYS_sendto, sock, raw_data(buf), len(buf), transmute(i32) flags, addr, size_of(T))
+ return errno_unwrap(ret, int)
}
@private
send_noaddr :: proc "contextless" (sock: Fd, buf: []u8, flags: Socket_Msg) -> (int, Errno) {
- ret := syscall(SYS_sendto, sock, raw_data(buf), len(buf), transmute(i32) flags, cast(rawptr) nil, cast(uintptr) 0)
- return errno_unwrap(ret, int)
+ ret := syscall(SYS_sendto, sock, raw_data(buf), len(buf), transmute(i32) flags, cast(rawptr) nil, cast(uintptr) 0)
+ return errno_unwrap(ret, int)
}
/// Receive a message from a socket
@@ -381,27 +381,27 @@ send :: proc {sendto, send_noaddr}
// TODO(flysand): recvmsg
shutdown :: proc "contextless" (sock: Fd, how: Shutdown_How) -> (Errno) {
- ret := syscall(SYS_shutdown, sock, how)
- return Errno(-ret)
+ ret := syscall(SYS_shutdown, sock, how)
+ return Errno(-ret)
}
/// Bind a socket to the given local address
/// Available since Linux 2.0
bind :: proc "contextless" (sock: Fd, addr: ^$T) -> (Errno)
where
- T == Sock_Addr_In ||
- T == Sock_Addr_In6 ||
- T == Sock_Addr_Any
+ T == Sock_Addr_In ||
+ T == Sock_Addr_In6 ||
+ T == Sock_Addr_Any
{
- ret := syscall(SYS_bind, sock, addr, size_of(T))
- return Errno(-ret)
+ ret := syscall(SYS_bind, sock, addr, size_of(T))
+ return Errno(-ret)
}
/// Marks the socket as a socket that listen to connections using accept.2
/// Available since Linux 2.0
listen :: proc "contextless" (sock: Fd, queue_len: i32) -> (Errno) {
- ret := syscall(SYS_listen, sock, queue_len)
- return Errno(-ret)
+ ret := syscall(SYS_listen, sock, queue_len)
+ return Errno(-ret)
}
// TODO(flysand): getsockname
@@ -415,90 +415,90 @@ listen :: proc "contextless" (sock: Fd, queue_len: i32) -> (Errno) {
// TODO(flysand): add ability to specify slices
setsockopt_base :: proc "contextless" (sock: Fd, level: int, opt: int, val: $T) -> (Errno)
where
- intrinsics.type_is_pointer(T) ||
- intrinsics.type_is_multi_pointer(T)
+ intrinsics.type_is_pointer(T) ||
+ intrinsics.type_is_multi_pointer(T)
{
- val_data := val
- val_size := size_of(intrinsics.type_elem_type(T))
- ret := syscall(SYS_setsockopt, sock, level, opt, val_data, val_size)
- return Errno(-ret)
+ val_data := val
+ val_size := size_of(intrinsics.type_elem_type(T))
+ ret := syscall(SYS_setsockopt, sock, level, opt, val_data, val_size)
+ return Errno(-ret)
}
setsockopt_sock :: proc "contextless" (sock: Fd, level: Socket_API_Level_Sock, opt: Socket_Option, val: $T) -> (Errno)
where
- intrinsics.type_is_pointer(T) ||
- intrinsics.type_is_multi_pointer(T)
+ intrinsics.type_is_pointer(T) ||
+ intrinsics.type_is_multi_pointer(T)
{
- return setsockopt_base(sock, cast(int) level, cast(int) opt, val)
+ return setsockopt_base(sock, cast(int) level, cast(int) opt, val)
}
setsockopt_tcp :: proc "contextless" (sock: Fd, level: Socket_API_Level_TCP, opt: Socket_TCP_Option, val: $T) -> (Errno)
where
- intrinsics.type_is_pointer(T) ||
- intrinsics.type_is_multi_pointer(T)
+ intrinsics.type_is_pointer(T) ||
+ intrinsics.type_is_multi_pointer(T)
{
- return setsockopt_base(sock, cast(int) level, cast(int) opt, val)
+ return setsockopt_base(sock, cast(int) level, cast(int) opt, val)
}
setsockopt_udp :: proc "contextless" (sock: Fd, level: Socket_API_Level_UDP, opt: Socket_UDP_Option, val: $T) -> (Errno)
where
- intrinsics.type_is_pointer(T) ||
- intrinsics.type_is_multi_pointer(T)
+ intrinsics.type_is_pointer(T) ||
+ intrinsics.type_is_multi_pointer(T)
{
- return setsockopt_base(sock, cast(int) level, cast(int) opt, val)
+ return setsockopt_base(sock, cast(int) level, cast(int) opt, val)
}
/// Set socket option for a given socket API level
/// Available since Linux 2.0
setsockopt :: proc {
- setsockopt_sock,
- setsockopt_tcp,
- setsockopt_udp,
- setsockopt_base,
+ setsockopt_sock,
+ setsockopt_tcp,
+ setsockopt_udp,
+ setsockopt_base,
}
getsockopt_base :: proc "contextless" (sock: Fd, level: int, opt: Socket_Option, val: $T) -> (int, Errno)
where
- intrinsics.type_is_pointer(T) ||
- intrinsics.type_is_multi_pointer(T)
+ intrinsics.type_is_pointer(T) ||
+ intrinsics.type_is_multi_pointer(T)
{
- val_data := val
- val_size := size_of(T)
- ret := syscall(SYS_getsockopt, sock, level, opt, val_data, cast(rawptr) &val_size)
- return val_size, Errno(-ret)
+ val_data := val
+ val_size := size_of(T)
+ ret := syscall(SYS_getsockopt, sock, level, opt, val_data, cast(rawptr) &val_size)
+ return val_size, Errno(-ret)
}
getsockopt_sock :: proc "contextless" (sock: Fd, level: Socket_API_Level_Sock, opt: Socket_Option, val: ^$T) -> (int, Errno)
where
- intrinsics.type_is_pointer(T) ||
- intrinsics.type_is_multi_pointer(T)
+ intrinsics.type_is_pointer(T) ||
+ intrinsics.type_is_multi_pointer(T)
{
- return getsockopt_base(sock, cast(int) level, cast(int) opt, val)
+ return getsockopt_base(sock, cast(int) level, cast(int) opt, val)
}
getsockopt_tcp :: proc "contextless" (sock: Fd, level: Socket_API_Level_TCP, opt: Socket_TCP_Option, val: ^$T) -> (int, Errno)
where
- intrinsics.type_is_pointer(T) ||
- intrinsics.type_is_multi_pointer(T)
+ intrinsics.type_is_pointer(T) ||
+ intrinsics.type_is_multi_pointer(T)
{
- return getsockopt_base(sock, cast(int) level, cast(int) opt, val)
+ return getsockopt_base(sock, cast(int) level, cast(int) opt, val)
}
getsockopt_udp :: proc "contextless" (sock: Fd, level: Socket_API_Level_UDP, opt: Socket_UDP_Option, val: ^$T) -> (int, Errno)
where
- intrinsics.type_is_pointer(T) ||
- intrinsics.type_is_multi_pointer(T)
+ intrinsics.type_is_pointer(T) ||
+ intrinsics.type_is_multi_pointer(T)
{
- return getsockopt_base(sock, cast(int) level, cast(int) opt, val)
+ return getsockopt_base(sock, cast(int) level, cast(int) opt, val)
}
/// Get socket option for a given socket API level
/// Available since Linux 2.0
getsockopt :: proc {
- getsockopt_sock,
- getsockopt_tcp,
- getsockopt_udp,
- getsockopt_base,
+ getsockopt_sock,
+ getsockopt_tcp,
+ getsockopt_udp,
+ getsockopt_base,
}
// TODO(flysand): clone (probably not in this PR, maybe not ever)
@@ -506,15 +506,15 @@ getsockopt :: proc {
/// Creates a copy of the running process
/// Available since Linux 1.0
fork :: proc "contextless" () -> (Pid, Errno) {
- when ODIN_ARCH == .arm64 {
- // Note(flysand): this syscall is not documented, but the bottom 8 bits of flags
- // are for exit signal
- ret := syscall(SYS_clone, Signal.SIGCHLD)
- return errno_unwrap(ret, Pid)
- } else {
- ret := syscall(SYS_fork)
- return errno_unwrap(ret, Pid)
- }
+ when ODIN_ARCH == .arm64 {
+ // Note(flysand): this syscall is not documented, but the bottom 8 bits of flags
+ // are for exit signal
+ ret := syscall(SYS_clone, Signal.SIGCHLD)
+ return errno_unwrap(ret, Pid)
+ } else {
+ ret := syscall(SYS_fork)
+ return errno_unwrap(ret, Pid)
+ }
}
// TODO(flysand): vfork
@@ -524,15 +524,15 @@ fork :: proc "contextless" () -> (Pid, Errno) {
/// Exit the thread with a given exit code
/// Available since Linux 1.0
exit :: proc "contextless" (code: i32) -> ! {
- syscall(SYS_exit, code)
- unreachable()
+ syscall(SYS_exit, code)
+ unreachable()
}
/// Wait for the process to change state
/// Available since Linux 1.0
wait4 :: proc "contextless" (pid: Pid, status: ^u32, options: Wait_Options) -> (Pid, Errno) {
- ret := syscall(SYS_wait4, pid, status, transmute(u32) options)
- return errno_unwrap(ret, Pid)
+ ret := syscall(SYS_wait4, pid, status, transmute(u32) options)
+ return errno_unwrap(ret, Pid)
}
/// See wait4
@@ -543,8 +543,8 @@ waitpid :: wait4
/// Get system information
/// Available since Linux 1.0
uname :: proc "contextless" (uts_name: ^UTS_Name) -> (Errno) {
- ret := syscall(SYS_uname, uts_name)
- return Errno(-ret)
+ ret := syscall(SYS_uname, uts_name)
+ return Errno(-ret)
}
// TODO(flysand): semget
@@ -564,173 +564,173 @@ uname :: proc "contextless" (uts_name: ^UTS_Name) -> (Errno) {
// TODO(flysand): msgctl
fcntl_dupfd :: proc "contextless" (fd: Fd, cmd: FCntl_Command_DUPFD, newfd: Fd) -> (Fd, Errno) {
- ret := syscall(SYS_fcntl, fd, cmd, newfd)
- return errno_unwrap(ret, Fd)
+ ret := syscall(SYS_fcntl, fd, cmd, newfd)
+ return errno_unwrap(ret, Fd)
}
fcntl_dupfd_cloexec :: proc "contextless" (fd: Fd, cmd: FCntl_Command_DUPFD_CLOEXEC, newfd: Fd) -> (Fd, Errno) {
- ret := syscall(SYS_fcntl, fd, cmd, newfd)
- return errno_unwrap(ret, Fd)
+ ret := syscall(SYS_fcntl, fd, cmd, newfd)
+ return errno_unwrap(ret, Fd)
}
fcntl_getfd :: proc "contextless" (fd: Fd, cmd: FCntl_Command_GETFD) -> (Fd, Errno) {
- ret := syscall(SYS_fcntl, fd, cmd)
- return errno_unwrap(ret, Fd)
+ ret := syscall(SYS_fcntl, fd, cmd)
+ return errno_unwrap(ret, Fd)
}
fcntl_setfd :: proc "contextless" (fd: Fd, cmd: FCntl_Command_SETFD, newfd: Fd) -> (Errno) {
- ret := syscall(SYS_fcntl, fd, cmd, newfd)
- return Errno(-ret)
+ ret := syscall(SYS_fcntl, fd, cmd, newfd)
+ return Errno(-ret)
}
fcntl_getfl :: proc "contextless" (fd: Fd, cmd: FCntl_Command_GETFL) -> (Open_Flags, Errno) {
- ret := syscall(SYS_fcntl, fd, cmd)
- return errno_unwrap(u32(ret), Open_Flags, Open_Flags)
+ ret := syscall(SYS_fcntl, fd, cmd)
+ return errno_unwrap(u32(ret), Open_Flags, Open_Flags)
}
fcntl_setfl :: proc "contextless" (fd: Fd, cmd: FCntl_Command_SETFL, flags: Open_Flags) -> (Errno) {
- ret := syscall(SYS_fcntl, fd, cmd, transmute(u32) flags)
- return Errno(-ret)
+ ret := syscall(SYS_fcntl, fd, cmd, transmute(u32) flags)
+ return Errno(-ret)
}
fcntl_setlk :: proc "contextless" (fd: Fd, cmd: FCntl_Command_SETLK, lock: ^FLock) -> (Errno) {
- when size_of(int) == 4 {
- ret := syscall(SYS_fcntl64, fd, cmd, lock)
- return Errno(-ret)
- } else {
- ret := syscall(SYS_fcntl, fd, cmd, lock)
- return Errno(-ret)
- }
+ when size_of(int) == 4 {
+ ret := syscall(SYS_fcntl64, fd, cmd, lock)
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_fcntl, fd, cmd, lock)
+ return Errno(-ret)
+ }
}
fcntl_setlkw :: proc "contextless" (fd: Fd, cmd: FCntl_Command_SETLKW, lock: ^FLock) -> (Errno) {
- when size_of(int) == 4 {
- ret := syscall(SYS_fcntl64, fd, cmd, lock)
- return Errno(-ret)
- } else {
- ret := syscall(SYS_fcntl, fd, cmd, lock)
- return Errno(-ret)
- }
+ when size_of(int) == 4 {
+ ret := syscall(SYS_fcntl64, fd, cmd, lock)
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_fcntl, fd, cmd, lock)
+ return Errno(-ret)
+ }
}
fcntl_getlk :: proc "contextless" (fd: Fd, cmd: FCntl_Command_GETLK, lock: ^FLock) -> (Errno) {
- when size_of(int) == 4 {
- ret := syscall(SYS_fcntl64, fd, cmd, lock)
- return Errno(-ret)
- } else {
- ret := syscall(SYS_fcntl, fd, cmd, lock)
- return Errno(-ret)
- }
+ when size_of(int) == 4 {
+ ret := syscall(SYS_fcntl64, fd, cmd, lock)
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_fcntl, fd, cmd, lock)
+ return Errno(-ret)
+ }
}
fcntl_getown_ex :: proc "contextless" (fd: Fd, cmd: FCntl_Command_GETOWN_EX, owner: ^F_Owner) -> (Errno) {
- ret := syscall(SYS_fcntl, fd, cmd, owner)
- return Errno(-ret)
+ ret := syscall(SYS_fcntl, fd, cmd, owner)
+ return Errno(-ret)
}
fcntl_setown_ex :: proc "contextless" (fd: Fd, cmd: FCntl_Command_SETOWN_EX, owner: ^F_Owner) -> (Errno) {
- ret := syscall(SYS_fcntl, fd, cmd, owner)
- return Errno(-ret)
+ ret := syscall(SYS_fcntl, fd, cmd, owner)
+ return Errno(-ret)
}
fcntl_getsig :: proc "contextless" (fd: Fd, cmd: FCntl_Command_GETSIG) -> (Signal, Errno) {
- ret := syscall(SYS_fcntl, fd, cmd)
- return errno_unwrap(ret, Signal)
+ ret := syscall(SYS_fcntl, fd, cmd)
+ return errno_unwrap(ret, Signal)
}
fcntl_setsig :: proc "contextless" (fd: Fd, cmd: FCntl_Command_SETSIG, sig: Signal) -> (Errno) {
- ret := syscall(SYS_fcntl, fd, cmd, sig)
- return Errno(-ret)
+ ret := syscall(SYS_fcntl, fd, cmd, sig)
+ return Errno(-ret)
}
fcntl_setlease :: proc "contextless" (fd: Fd, cmd: FCntl_Command_SETLEASE, lease: FD_Lease) -> (Errno) {
- ret := syscall(SYS_fcntl, fd, cmd, lease)
- return Errno(-ret)
+ ret := syscall(SYS_fcntl, fd, cmd, lease)
+ return Errno(-ret)
}
fcntl_getlease :: proc "contextless" (fd: Fd, cmd: FCntl_Command_GETLEASE) -> (FD_Lease, Errno) {
- ret := syscall(SYS_fcntl, fd, cmd)
- return errno_unwrap(ret, FD_Lease)
+ ret := syscall(SYS_fcntl, fd, cmd)
+ return errno_unwrap(ret, FD_Lease)
}
fcntl_notify :: proc "contextless" (fd: Fd, cmd: FCntl_Command_NOTIFY, notifications: FD_Notifications) -> (Errno) {
- ret := syscall(SYS_fcntl, fd, cmd)
- return Errno(-ret)
+ ret := syscall(SYS_fcntl, fd, cmd)
+ return Errno(-ret)
}
fcntl_setpipe_sz :: proc "contextless" (fd: Fd, cmd: FCntl_Command_SETPIPE_SZ, sz: i32) -> (i32, Errno) {
- ret := syscall(SYS_fcntl, fd, cmd, sz)
- return errno_unwrap(ret, i32)
+ ret := syscall(SYS_fcntl, fd, cmd, sz)
+ return errno_unwrap(ret, i32)
}
fcntl_getpipe_sz :: proc "contextless" (fd: Fd, cmd: FCntl_Command_GETPIPE_SZ) -> (i32, Errno) {
- ret := syscall(SYS_fcntl, fd, cmd)
- return errno_unwrap(ret, i32)
+ ret := syscall(SYS_fcntl, fd, cmd)
+ return errno_unwrap(ret, i32)
}
fcntl_add_seals :: proc "contextless" (fd: Fd, cmd: FCntl_Command_ADD_SEALS, seal: Seal) -> (Errno) {
- ret := syscall(SYS_fcntl, fd, cmd, transmute(i32) seal)
- return Errno(-ret)
+ ret := syscall(SYS_fcntl, fd, cmd, transmute(i32) seal)
+ return Errno(-ret)
}
fcntl_get_seals :: proc "contextless" (fd: Fd, cmd: FCntl_Command_GET_SEALS) -> (Seal, Errno) {
- ret := syscall(SYS_fcntl, fd, cmd)
- return errno_unwrap(i32(ret), Seal, Seal)
+ ret := syscall(SYS_fcntl, fd, cmd)
+ return errno_unwrap(i32(ret), Seal, Seal)
}
fcntl_get_rw_hint :: proc "contextless" (fd: Fd, cmd: FCntl_Command_GET_RW_HINT, hint: ^RW_Hint) -> (Errno) {
- ret := syscall(SYS_fcntl, fd, cmd, hint)
- return Errno(-ret)
+ ret := syscall(SYS_fcntl, fd, cmd, hint)
+ return Errno(-ret)
}
fcntl_set_rw_hint :: proc "contextless" (fd: Fd, cmd: FCntl_Command_SET_RW_HINT, hint: ^RW_Hint) -> (Errno) {
- ret := syscall(SYS_fcntl, fd, cmd, hint)
- return Errno(-ret)
+ ret := syscall(SYS_fcntl, fd, cmd, hint)
+ return Errno(-ret)
}
fcntl_get_file_rw_hint :: proc "contextless" (fd: Fd, cmd: FCntl_Command_GET_FILE_RW_HINT, hint: ^RW_Hint) -> (Errno) {
- ret := syscall(SYS_fcntl, fd, cmd, hint)
- return Errno(-ret)
+ ret := syscall(SYS_fcntl, fd, cmd, hint)
+ return Errno(-ret)
}
fcntl_set_file_rw_hint :: proc "contextless" (fd: Fd, cmd: FCntl_Command_SET_FILE_RW_HINT, hint: ^RW_Hint) -> (Errno) {
- ret := syscall(SYS_fcntl, fd, cmd, hint)
- return Errno(-ret)
+ ret := syscall(SYS_fcntl, fd, cmd, hint)
+ return Errno(-ret)
}
fcntl :: proc {
- fcntl_dupfd,
- fcntl_dupfd_cloexec,
- fcntl_getfd,
- fcntl_setfd,
- fcntl_getfl,
- fcntl_setfl,
- fcntl_setlk,
- fcntl_setlkw,
- fcntl_getlk,
- fcntl_getown_ex,
- fcntl_setown_ex,
- fcntl_getsig,
- fcntl_setsig,
- fcntl_setlease,
- fcntl_getlease,
- fcntl_notify,
- fcntl_setpipe_sz,
- fcntl_getpipe_sz,
- fcntl_add_seals,
- fcntl_get_seals,
- fcntl_get_rw_hint,
- fcntl_set_rw_hint,
- fcntl_get_file_rw_hint,
- fcntl_set_file_rw_hint,
+ fcntl_dupfd,
+ fcntl_dupfd_cloexec,
+ fcntl_getfd,
+ fcntl_setfd,
+ fcntl_getfl,
+ fcntl_setfl,
+ fcntl_setlk,
+ fcntl_setlkw,
+ fcntl_getlk,
+ fcntl_getown_ex,
+ fcntl_setown_ex,
+ fcntl_getsig,
+ fcntl_setsig,
+ fcntl_setlease,
+ fcntl_getlease,
+ fcntl_notify,
+ fcntl_setpipe_sz,
+ fcntl_getpipe_sz,
+ fcntl_add_seals,
+ fcntl_get_seals,
+ fcntl_get_rw_hint,
+ fcntl_set_rw_hint,
+ fcntl_get_file_rw_hint,
+ fcntl_set_file_rw_hint,
}
// TODO(flysand): flock
/// Sync state of the file with the storage device
fsync :: proc "contextless" (fd: Fd) -> (Errno) {
- ret := syscall(SYS_fsync, fd)
- return Errno(-ret)
+ ret := syscall(SYS_fsync, fd)
+ return Errno(-ret)
}
// TODO(flysand): fdatasync
@@ -738,93 +738,93 @@ fsync :: proc "contextless" (fd: Fd) -> (Errno) {
/// Truncate a file to specified length
/// On 32-bit architectures available since Linux 2.4
truncate :: proc "contextless" (name: cstring, length: i64) -> (Errno) {
- when size_of(int) == 4 {
- ret := syscall(SYS_truncate64, cast(rawptr) name, compat64_arg_pair(length))
- return Errno(-ret)
- } else {
- ret := syscall(SYS_truncate, cast(rawptr) name, compat64_arg_pair(length))
- return Errno(-ret)
- }
+ when size_of(int) == 4 {
+ ret := syscall(SYS_truncate64, cast(rawptr) name, compat64_arg_pair(length))
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_truncate, cast(rawptr) name, compat64_arg_pair(length))
+ return Errno(-ret)
+ }
}
/// Truncate a file specified by file descriptor to specified length
/// On 32-bit architectures available since 2.4
ftruncate :: proc "contextless" (fd: Fd, length: i64) -> (Errno) {
- when size_of(int) == 4 {
- ret := syscall(SYS_ftruncate64, fd, compat64_arg_pair(length))
- return Errno(-ret)
- } else {
- ret := syscall(SYS_truncate, fd, compat64_arg_pair(length))
- return Errno(-ret)
- }
+ when size_of(int) == 4 {
+ ret := syscall(SYS_ftruncate64, fd, compat64_arg_pair(length))
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_truncate, fd, compat64_arg_pair(length))
+ return Errno(-ret)
+ }
}
/// Retrieve the contents of the directory specified by dirfd
/// Returns the number of bytes written
/// Available since Linux 2.4
getdents :: proc "contextless" (dirfd: Fd, buf: []u8) -> (int, Errno) {
- ret := syscall(SYS_getdents64, dirfd, raw_data(buf), len(buf))
- return errno_unwrap(ret, int)
+ ret := syscall(SYS_getdents64, dirfd, raw_data(buf), len(buf))
+ return errno_unwrap(ret, int)
}
/// Get current working directory
/// Available since Linux 1.0
getcwd :: proc "contextless" (buf: []u8) -> (int, Errno) {
- ret := syscall(SYS_getcwd, raw_data(buf), len(buf))
- return errno_unwrap(ret, int)
+ ret := syscall(SYS_getcwd, raw_data(buf), len(buf))
+ return errno_unwrap(ret, int)
}
/// Change working directory to the directory specified by path
/// Available since Linux 1.0
chdir :: proc "contextless" (path: cstring) -> (Errno) {
- ret := syscall(SYS_chdir, cast(rawptr) path)
- return Errno(-ret)
+ ret := syscall(SYS_chdir, cast(rawptr) path)
+ return Errno(-ret)
}
/// Change working directory to the directory specified by dirfd
/// Available since Linux 1.0
fchdir :: proc "contextless" (fd: Fd) -> (Errno) {
- ret := syscall(SYS_fchdir, fd)
- return Errno(-ret)
+ ret := syscall(SYS_fchdir, fd)
+ return Errno(-ret)
}
/// Rename (move) the file
/// Available since Linux 1.0
/// On ARM64 available since Linux 2.6.16
rename :: proc "contextless" (old: cstring, new: cstring) -> (Errno) {
- when ODIN_ARCH == .arm64 {
- ret := syscall(SYS_renameat, AT_FDCWD, cast(rawptr) old, AT_FDCWD, cast(rawptr) new)
- return Errno(-ret)
- } else {
- ret := syscall(SYS_rename, cast(rawptr) old, cast(rawptr) new)
- return Errno(-ret)
- }
+ when ODIN_ARCH == .arm64 {
+ ret := syscall(SYS_renameat, AT_FDCWD, cast(rawptr) old, AT_FDCWD, cast(rawptr) new)
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_rename, cast(rawptr) old, cast(rawptr) new)
+ return Errno(-ret)
+ }
}
/// Creates a directory
/// Available since Linux 1.0
/// On ARM64 available since Linux 2.6.16
mkdir :: proc "contextless" (name: cstring, mode: Mode) -> (Errno) {
- when ODIN_ARCH == .arm64 {
- ret := syscall(SYS_mkdirat, AT_FDCWD, cast(rawptr) name, transmute(u32) mode)
- return Errno(-ret)
- } else {
- ret := syscall(SYS_mkdir, cast(rawptr) name, transmute(u32) mode)
- return Errno(-ret)
- }
+ when ODIN_ARCH == .arm64 {
+ ret := syscall(SYS_mkdirat, AT_FDCWD, cast(rawptr) name, transmute(u32) mode)
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_mkdir, cast(rawptr) name, transmute(u32) mode)
+ return Errno(-ret)
+ }
}
/// Remove a directory specified by name
/// Available since Linux 1.0
/// On ARM64 available since Linux 2.6.16
rmdir :: proc "contextless" (name: cstring) -> (Errno) {
- when ODIN_ARCH == .arm64 {
- ret := syscall(SYS_unlinkat, AT_FDCWD, cast(rawptr) name, transmute(i32) FD_Flags{.REMOVEDIR})
- return Errno(-ret)
- } else {
- ret := syscall(SYS_rmdir, cast(rawptr) name)
- return Errno(-ret)
- }
+ when ODIN_ARCH == .arm64 {
+ ret := syscall(SYS_unlinkat, AT_FDCWD, cast(rawptr) name, transmute(i32) FD_Flags{.REMOVEDIR})
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_rmdir, cast(rawptr) name)
+ return Errno(-ret)
+ }
}
// TODO(flysand): creat
@@ -833,72 +833,72 @@ rmdir :: proc "contextless" (name: cstring) -> (Errno) {
/// Available since Linux 1.0
/// On ARM64 available since Linux 2.6.16
link :: proc "contextless" (target: cstring, linkpath: cstring) -> (Errno) {
- when ODIN_ARCH == .arm64 {
- ret := syscall(SYS_linkat, AT_FDCWD, cast(rawptr) target, AT_FDCWD, cast(rawptr) linkpath)
- return Errno(-ret)
- } else {
- ret := syscall(SYS_link, cast(rawptr) target, cast(rawptr) linkpath)
- return Errno(-ret)
- }
+ when ODIN_ARCH == .arm64 {
+ ret := syscall(SYS_linkat, AT_FDCWD, cast(rawptr) target, AT_FDCWD, cast(rawptr) linkpath)
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_link, cast(rawptr) target, cast(rawptr) linkpath)
+ return Errno(-ret)
+ }
}
/// Delete a name, and possible a file it refers to
/// Available since Linux 1.0
/// On ARM64 available since Linux 2.6.16
unlink :: proc "contextless" (name: cstring) -> (Errno) {
- when ODIN_ARCH == .arm64 {
- ret := syscall(SYS_unlinkat, AT_FDCWD, cast(rawptr) name, 0)
- return Errno(-ret)
- } else {
- ret := syscall(SYS_unlink, cast(rawptr) name)
- return Errno(-ret)
- }
+ when ODIN_ARCH == .arm64 {
+ ret := syscall(SYS_unlinkat, AT_FDCWD, cast(rawptr) name, 0)
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_unlink, cast(rawptr) name)
+ return Errno(-ret)
+ }
}
/// Create a symbolic link
/// Available since Linux 1.0
/// On arm64 available since Linux 2.6.16
symlink :: proc "contextless" (target: cstring, linkpath: cstring) -> (Errno) {
- when ODIN_ARCH == .arm64 {
- ret := syscall(SYS_symlinkat, AT_FDCWD, cast(rawptr) target, cast(rawptr) linkpath)
- return Errno(-ret)
- } else {
- ret := syscall(SYS_symlink, cast(rawptr) target, cast(rawptr) linkpath)
- return Errno(-ret)
- }
+ when ODIN_ARCH == .arm64 {
+ ret := syscall(SYS_symlinkat, AT_FDCWD, cast(rawptr) target, cast(rawptr) linkpath)
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_symlink, cast(rawptr) target, cast(rawptr) linkpath)
+ return Errno(-ret)
+ }
}
/// Read the value of a symbolic link
/// Available since Linux 1.0
/// On arm64 available since Linux 2.6.16
readlink :: proc "contextless" (name: cstring, buf: []u8) -> (int, Errno) {
- when ODIN_ARCH == .arm64 {
- ret := syscall(SYS_readlinkat, AT_FDCWD, cast(rawptr) name, raw_data(buf), len(buf))
- return errno_unwrap(ret, int)
- } else {
- ret := syscall(SYS_readlink, cast(rawptr) name, raw_data(buf), len(buf))
- return errno_unwrap(ret, int)
- }
+ when ODIN_ARCH == .arm64 {
+ ret := syscall(SYS_readlinkat, AT_FDCWD, cast(rawptr) name, raw_data(buf), len(buf))
+ return errno_unwrap(ret, int)
+ } else {
+ ret := syscall(SYS_readlink, cast(rawptr) name, raw_data(buf), len(buf))
+ return errno_unwrap(ret, int)
+ }
}
/// Change file permissions
/// Available since Linux 1.0
/// On ARM64 available since Linux 2.6.16
chmod :: proc "contextless" (name: cstring, mode: Mode) -> (Errno) {
- when ODIN_ARCH == .arm64 {
- ret := syscall(SYS_fchmodat, cast(rawptr) name, transmute(u32) mode, 0)
- return Errno(-ret)
- } else {
- ret := syscall(SYS_chmod, cast(rawptr) name, transmute(u32) mode)
- return Errno(-ret)
- }
+ when ODIN_ARCH == .arm64 {
+ ret := syscall(SYS_fchmodat, cast(rawptr) name, transmute(u32) mode, 0)
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_chmod, cast(rawptr) name, transmute(u32) mode)
+ return Errno(-ret)
+ }
}
/// Change file permissions through a file descriptor
/// Available since Linux 1.0
fchmod :: proc "contextless" (fd: Fd, mode: Mode) -> (Errno) {
- ret := syscall(SYS_fchmod, fd, transmute(u32) mode)
- return Errno(-ret)
+ ret := syscall(SYS_fchmod, fd, transmute(u32) mode)
+ return Errno(-ret)
}
/// Change ownership of a file
@@ -906,29 +906,29 @@ fchmod :: proc "contextless" (fd: Fd, mode: Mode) -> (Errno) {
/// On 32-bit architectures available since Linux 2.4
/// On ARM64 available since Linux 2.6.16
chown :: proc "contextless" (name: cstring, uid: Uid, gid: Gid) -> (Errno) {
- when size_of(int) == 4 {
- ret := syscall(SYS_chown32, cast(rawptr) name, uid, gid)
- return Errno(-ret)
- } else when ODIN_ARCH == .arm64 {
- ret := syscall(SYS_fchownat, AT_FDCWD, cast(rawptr) name, uid, gid, 0)
- return Errno(-ret)
- } else {
- ret := syscall(SYS_chown, cast(rawptr) name, uid, gid)
- return Errno(-ret)
- }
+ when size_of(int) == 4 {
+ ret := syscall(SYS_chown32, cast(rawptr) name, uid, gid)
+ return Errno(-ret)
+ } else when ODIN_ARCH == .arm64 {
+ ret := syscall(SYS_fchownat, AT_FDCWD, cast(rawptr) name, uid, gid, 0)
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_chown, cast(rawptr) name, uid, gid)
+ return Errno(-ret)
+ }
}
/// Change ownership of a file by file descriptor
/// Available since Linux 1.0
/// On 32-bit architecvtures available since Linux 2.4
fchown :: proc "contextless" (fd: Fd, uid: Uid, gid: Gid) -> (Errno) {
- when size_of(int) == 4 {
- ret := syscall(SYS_fchown32, fd, uid, gid)
- return Errno(-ret)
- } else {
- ret := syscall(SYS_fchown, fd, uid, gid)
- return Errno(-ret)
- }
+ when size_of(int) == 4 {
+ ret := syscall(SYS_fchown32, fd, uid, gid)
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_fchown, fd, uid, gid)
+ return Errno(-ret)
+ }
}
/// Change ownership of a file. Unlike chown, if a file is a symlink dooesn't dereference it
@@ -936,16 +936,16 @@ fchown :: proc "contextless" (fd: Fd, uid: Uid, gid: Gid) -> (Errno) {
/// On 32-bit architectures available since Linux 2.4
/// On ARM64 available since Linux 2.6.16
lchown :: proc "contextless" (name: cstring, uid: Uid, gid: Gid) -> (Errno) {
- when size_of(int) == 4 {
- ret := syscall(SYS_lchown32, cast(rawptr) name, uid, gid)
- return Errno(-ret)
- } else when ODIN_ARCH == .arm64 {
- ret := syscall(SYS_fchownat, AT_FDCWD, cast(rawptr) name, uid, gid, transmute(i32) FD_Flags{.SYMLINK_NOFOLLOW})
- return Errno(-ret)
- } else {
- ret := syscall(SYS_lchown, cast(rawptr) name, uid, gid)
- return Errno(-ret)
- }
+ when size_of(int) == 4 {
+ ret := syscall(SYS_lchown32, cast(rawptr) name, uid, gid)
+ return Errno(-ret)
+ } else when ODIN_ARCH == .arm64 {
+ ret := syscall(SYS_fchownat, AT_FDCWD, cast(rawptr) name, uid, gid, transmute(i32) FD_Flags{.SYMLINK_NOFOLLOW})
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_lchown, cast(rawptr) name, uid, gid)
+ return Errno(-ret)
+ }
}
// TODO(flysand): umask
@@ -955,28 +955,28 @@ lchown :: proc "contextless" (name: cstring, uid: Uid, gid: Gid) -> (Errno) {
/// Get limits on resources
/// Available since Linux 1.0
getrlimit :: proc "contextless" (kind: RLimit_Kind, resource: ^RLimit) -> (Errno) {
- ret := syscall(SYS_getrlimit, kind, resource)
- return Errno(-ret)
+ ret := syscall(SYS_getrlimit, kind, resource)
+ return Errno(-ret)
}
/// Get resource usage
/// Available since Linux 1.0
getrusage :: proc "contextless" (who: RUsage_Who, rusage: ^RUsage) -> (Errno) {
- ret := syscall(SYS_getrusage, who, rusage)
- return Errno(-ret)
+ ret := syscall(SYS_getrusage, who, rusage)
+ return Errno(-ret)
}
/// Get information about the system
sysinfo :: proc "contextless" (sysinfo: ^Sys_Info) -> (Errno) {
- ret := syscall(SYS_sysinfo, sysinfo)
- return Errno(-ret)
+ ret := syscall(SYS_sysinfo, sysinfo)
+ return Errno(-ret)
}
/// Get current process times
/// Available since Linux 1.0
times :: proc "contextless" (tms: ^Tms) -> (Errno) {
- ret := syscall(SYS_times, cast(rawptr) tms)
- return Errno(-ret)
+ ret := syscall(SYS_times, cast(rawptr) tms)
+ return Errno(-ret)
}
// TODO(flysand): ptrace
@@ -985,11 +985,11 @@ times :: proc "contextless" (tms: ^Tms) -> (Errno) {
/// Available since Linux 1.0
/// On 32-bit platforms available since Linux 2.4
getuid :: proc "contextless" () -> Uid {
- when size_of(int) == 8 {
- return cast(Uid) syscall(SYS_getuid)
- } else {
- return cast(Uid) syscall(SYS_getuid32)
- }
+ when size_of(int) == 8 {
+ return cast(Uid) syscall(SYS_getuid)
+ } else {
+ return cast(Uid) syscall(SYS_getuid32)
+ }
}
// TODO(flysand): syslog
@@ -998,11 +998,11 @@ getuid :: proc "contextless" () -> Uid {
/// Available since Linux 1.0
/// On 32-bit platforms available since Linux 2.4
getgid :: proc "contextless" () -> Gid {
- when size_of(int) == 8 {
- return cast(Gid) syscall(SYS_getgid)
- } else {
- return cast(Gid) syscall(SYS_getgid32)
- }
+ when size_of(int) == 8 {
+ return cast(Gid) syscall(SYS_getgid)
+ } else {
+ return cast(Gid) syscall(SYS_getgid32)
+ }
}
/// Set effective user id
@@ -1010,13 +1010,13 @@ getgid :: proc "contextless" () -> Gid {
/// On 32-bit platforms available since Linux 2.4
@(require_results)
setuid :: proc "contextless" (uid: Uid) -> (Errno) {
- when size_of(int) == 8 {
- ret := syscall(SYS_setuid, uid)
- return Errno(-ret)
- } else {
- ret := syscall(SYS_setuid32, uid)
- return Errno(-ret)
- }
+ when size_of(int) == 8 {
+ ret := syscall(SYS_setuid, uid)
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_setuid32, uid)
+ return Errno(-ret)
+ }
}
/// Set effective group id
@@ -1025,67 +1025,67 @@ setuid :: proc "contextless" (uid: Uid) -> (Errno) {
/// On 32-bit platforms available since Linux 2.4
@(require_results)
setgid :: proc "contextless" (gid: Gid) -> (Errno) {
- when size_of(int) == 8 {
- ret := syscall(SYS_setgid, gid)
- return Errno(-ret)
- } else {
- ret := syscall(SYS_setgid32, gid)
- return Errno(-ret)
- }
+ when size_of(int) == 8 {
+ ret := syscall(SYS_setgid, gid)
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_setgid32, gid)
+ return Errno(-ret)
+ }
}
/// Get effective user ID
/// Available since Linux 1.0
/// On 32-bit platforms available since Linux 2.4
geteuid :: proc "contextless" () -> Uid {
- when size_of(int) == 8 {
- return cast(Uid) syscall(SYS_geteuid)
- } else {
- return cast(Uid) syscall(SYS_geteuid32)
- }
+ when size_of(int) == 8 {
+ return cast(Uid) syscall(SYS_geteuid)
+ } else {
+ return cast(Uid) syscall(SYS_geteuid32)
+ }
}
/// Get effective group ID
/// Available since Linux 1.0
/// On 32-bit platforms available since Linux 2.4
getegid :: proc "contextless" () -> Gid {
- when size_of(int) == 8 {
- return cast(Gid) syscall(SYS_getegid)
- } else {
- return cast(Gid) syscall(SYS_getegid32)
- }
+ when size_of(int) == 8 {
+ return cast(Gid) syscall(SYS_getegid)
+ } else {
+ return cast(Gid) syscall(SYS_getegid32)
+ }
}
/// Set process group
/// Available since Linux 1.0
setpgid :: proc "contextless" (pid: Pid, pgid: Pid) -> (Errno) {
- ret := syscall(SYS_setpgid, pid, pgid)
- return Errno(-ret)
+ ret := syscall(SYS_setpgid, pid, pgid)
+ return Errno(-ret)
}
/// Get the parent process ID
/// Available since Linux 1.0
getppid :: proc "contextless" () -> Pid {
- return cast(Pid) syscall(SYS_getppid)
+ return cast(Pid) syscall(SYS_getppid)
}
/// Get process group
/// Available since Linux 1.0
getpgrp :: proc "contextless" () -> (Pid, Errno) {
- when ODIN_ARCH == .arm64 {
- ret := syscall(SYS_getpgid, 0)
- return errno_unwrap(ret, Pid)
- } else {
- ret := syscall(SYS_getpgrp)
- return errno_unwrap(ret, Pid)
- }
+ when ODIN_ARCH == .arm64 {
+ ret := syscall(SYS_getpgid, 0)
+ return errno_unwrap(ret, Pid)
+ } else {
+ ret := syscall(SYS_getpgrp)
+ return errno_unwrap(ret, Pid)
+ }
}
/// Create a session and set the process group ID
/// Available since Linux 2.0
setsid :: proc "contextless" () -> (Errno) {
- ret := syscall(SYS_setsid)
- return Errno(-ret)
+ ret := syscall(SYS_setsid)
+ return Errno(-ret)
}
/// Set real and/or effective user id
@@ -1094,13 +1094,13 @@ setsid :: proc "contextless" () -> (Errno) {
/// On 32-bit platforms available since Linux 2.4
@(require_results)
setreuid :: proc "contextless" (real: Uid, effective: Uid) -> (Errno) {
- when size_of(int) == 8 {
- ret := syscall(SYS_setreuid, real, effective)
- return Errno(-ret)
- } else {
- ret := syscall(SYS_setreuid32, real, effective)
- return Errno(-ret)
- }
+ when size_of(int) == 8 {
+ ret := syscall(SYS_setreuid, real, effective)
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_setreuid32, real, effective)
+ return Errno(-ret)
+ }
}
/// Set real and/or effective group id
@@ -1109,13 +1109,13 @@ setreuid :: proc "contextless" (real: Uid, effective: Uid) -> (Errno) {
/// On 32-bit platforms available since Linux 2.4
@(require_results)
setregid :: proc "contextless" (real: Gid, effective: Gid) -> (Errno) {
- when size_of(int) == 8 {
- ret := syscall(SYS_setregid, real, effective)
- return Errno(-ret)
- } else {
- ret := syscall(SYS_setregid32, real, effective)
- return Errno(-ret)
- }
+ when size_of(int) == 8 {
+ ret := syscall(SYS_setregid, real, effective)
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_setregid32, real, effective)
+ return Errno(-ret)
+ }
}
// TODO(flysand): getgroups
@@ -1128,26 +1128,26 @@ setregid :: proc "contextless" (real: Gid, effective: Gid) -> (Errno) {
/// On 32-bit platforms available since Linux 2.4
@(require_results)
setresuid :: proc "contextless" (real: Uid, effective: Uid, saved: Uid) -> (Errno) {
- when size_of(int) == 8 {
- ret := syscall(SYS_setresuid, real, effective, saved)
- return Errno(-ret)
- } else {
- ret := syscall(SYS_setresuid32, real, effective, saved)
- return Errno(-ret)
- }
+ when size_of(int) == 8 {
+ ret := syscall(SYS_setresuid, real, effective, saved)
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_setresuid32, real, effective, saved)
+ return Errno(-ret)
+ }
}
/// Get real, effective and saved user id
/// Available since Linux 2.2
/// On 32-bit platforms available since Linux 2.4
getresuid :: proc "contextless" (real: ^Uid, effective: ^Uid, saved: ^Uid) -> (Errno) {
- when size_of(int) == 8 {
- ret := syscall(SYS_getresuid, cast(rawptr) real, cast(rawptr) effective, cast(rawptr) saved)
- return Errno(-ret)
- } else {
- ret := syscall(SYS_getresuid32, cast(rawptr) real, cast(rawptr) effective, cast(rawptr) saved)
- return Errno(-ret)
- }
+ when size_of(int) == 8 {
+ ret := syscall(SYS_getresuid, cast(rawptr) real, cast(rawptr) effective, cast(rawptr) saved)
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_getresuid32, cast(rawptr) real, cast(rawptr) effective, cast(rawptr) saved)
+ return Errno(-ret)
+ }
}
/// Set real, effective and/or saved group id
@@ -1156,33 +1156,33 @@ getresuid :: proc "contextless" (real: ^Uid, effective: ^Uid, saved: ^Uid) -> (E
/// On 32-bit platforms available since Linux 2.4
@(require_results)
setresgid :: proc "contextless" (real: Gid, effective: Gid, saved: Uid) -> (Errno) {
- when size_of(int) == 8 {
- ret := syscall(SYS_setresgid, real, effective, saved)
- return Errno(-ret)
- } else {
- ret := syscall(SYS_setresgid32, real, effective, saved)
- return Errno(-ret)
- }
+ when size_of(int) == 8 {
+ ret := syscall(SYS_setresgid, real, effective, saved)
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_setresgid32, real, effective, saved)
+ return Errno(-ret)
+ }
}
/// Get real, effective and saved group id
/// Available since Linux 2.2
/// On 32-bit platforms available since Linux 2.4
getresgid :: proc "contextless" (real: ^Gid, effective: ^Gid, saved: ^Gid) -> (Errno) {
- when size_of(int) == 8 {
- ret := syscall(SYS_getresgid, cast(rawptr) real, cast(rawptr) effective, cast(rawptr) saved)
- return Errno(-ret)
- } else {
- ret := syscall(SYS_getresgid32, cast(rawptr) real, cast(rawptr) effective, cast(rawptr) saved)
- return Errno(-ret)
- }
+ when size_of(int) == 8 {
+ ret := syscall(SYS_getresgid, cast(rawptr) real, cast(rawptr) effective, cast(rawptr) saved)
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_getresgid32, cast(rawptr) real, cast(rawptr) effective, cast(rawptr) saved)
+ return Errno(-ret)
+ }
}
/// Get process group
/// Available since Linux 1.0
getpgid :: proc "contextless" (pid: Pid) -> (Pid, Errno) {
- ret := syscall(SYS_getpgid, pid)
- return errno_unwrap(ret, Pid)
+ ret := syscall(SYS_getpgid, pid)
+ return errno_unwrap(ret, Pid)
}
// NOTE(flysand): setfsuid and setfsgid are deprecated
@@ -1190,8 +1190,8 @@ getpgid :: proc "contextless" (pid: Pid) -> (Pid, Errno) {
/// Get session ID of the calling process
/// Available since Linux 2.0
getsid :: proc "contextless" (pid: Pid) -> (Pid, Errno) {
- ret := syscall(SYS_getsid, pid)
- return errno_unwrap(ret, Pid)
+ ret := syscall(SYS_getsid, pid)
+ return errno_unwrap(ret, Pid)
}
// TODO(flysand): capget
@@ -1201,36 +1201,36 @@ getsid :: proc "contextless" (pid: Pid) -> (Pid, Errno) {
/// Examine pending signals
/// Available since Linux 2.2
rt_sigpending :: proc "contextless" (sigs: ^Sig_Set) -> Errno {
- ret := syscall(SYS_rt_sigpending, sigs, size_of(Sig_Set))
- return Errno(-ret)
+ ret := syscall(SYS_rt_sigpending, sigs, size_of(Sig_Set))
+ return Errno(-ret)
}
/// Synchronously wait for queued signals
/// Available since Linux 2.2
rt_sigtimedwait :: proc "contextless" (sigs: ^Sig_Set, info: ^Sig_Info, time_sus: ^Time_Spec) -> (Signal, Errno) {
- ret := syscall(SYS_rt_sigtimedwait, sigs, info, time_sus, size_of(Sig_Set))
- return errno_unwrap(ret, Signal)
+ ret := syscall(SYS_rt_sigtimedwait, sigs, info, time_sus, size_of(Sig_Set))
+ return errno_unwrap(ret, Signal)
}
/// Send signal information to a process
/// Available since Linux 2.2
rt_sigqueueinfo :: proc "contextless" (pid: Pid, sig: Signal, si: ^Sig_Info) -> (Errno) {
- ret := syscall(SYS_rt_sigqueueinfo, pid, sig, si)
- return Errno(-ret)
+ ret := syscall(SYS_rt_sigqueueinfo, pid, sig, si)
+ return Errno(-ret)
}
/// Replace the signal mask for a value with the new mask until a signal is received
/// Available since Linux 2.2
rt_sigsuspend :: proc "contextless" (sigset: ^Sig_Set) -> Errno {
- ret := syscall(SYS_rt_sigsuspend, sigset, size_of(Sig_Set))
- return Errno(-ret)
+ ret := syscall(SYS_rt_sigsuspend, sigset, size_of(Sig_Set))
+ return Errno(-ret)
}
/// Set or get signal stack context
/// Available since Linux 2.2
sigaltstack :: proc "contextless" (stack: ^Sig_Stack, old_stack: ^Sig_Stack) -> (Errno) {
- ret := syscall(SYS_sigaltstack, stack, old_stack)
- return Errno(-ret)
+ ret := syscall(SYS_sigaltstack, stack, old_stack)
+ return Errno(-ret)
}
// TODO(flysand): utime
@@ -1241,13 +1241,13 @@ sigaltstack :: proc "contextless" (stack: ^Sig_Stack, old_stack: ^Sig_Stack) ->
/// Available since Linux 1.0
/// On ARM64 available since Linux 2.6.16
mknod :: proc "contextless" (name: cstring, mode: Mode, dev: Dev) -> (Errno) {
- when ODIN_ARCH == .arm64 {
- ret := syscall(SYS_mknodat, AT_FDCWD, cast(rawptr) name, transmute(u32) mode, dev)
- return Errno(-ret)
- } else {
- ret := syscall(SYS_mknod, cast(rawptr) name, transmute(u32) mode, dev)
- return Errno(-ret)
- }
+ when ODIN_ARCH == .arm64 {
+ ret := syscall(SYS_mknodat, AT_FDCWD, cast(rawptr) name, transmute(u32) mode, dev)
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_mknod, cast(rawptr) name, transmute(u32) mode, dev)
+ return Errno(-ret)
+ }
}
// TODO(flysand): uselib
@@ -1255,8 +1255,8 @@ mknod :: proc "contextless" (name: cstring, mode: Mode, dev: Dev) -> (Errno) {
/// Set the process execution domain
/// Available since Linux 1.2
personality :: proc "contextless" (personality: uint) -> (uint, Errno) {
- ret := syscall(SYS_personality, personality)
- return errno_unwrap(ret, uint)
+ ret := syscall(SYS_personality, personality)
+ return errno_unwrap(ret, uint)
}
// TODO(flysand): ustat
@@ -1266,13 +1266,13 @@ personality :: proc "contextless" (personality: uint) -> (uint, Errno) {
/// Available since Linux 1.0
/// For 32-bit systems a different syscall is used that became available since 2.6
statfs :: proc "contextless" (path: cstring, statfs: ^Stat_FS) -> (Errno) {
- when size_of(int) == 8 {
- ret := syscall(SYS_statfs, transmute(uintptr) path, statfs)
- return Errno(-ret)
- } else {
- ret := syscall(SYS_statfs64, cast(rawptr) path, size_of(Stat_FS), statfs)
- return Errno(-ret)
- }
+ when size_of(int) == 8 {
+ ret := syscall(SYS_statfs, transmute(uintptr) path, statfs)
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_statfs64, cast(rawptr) path, size_of(Stat_FS), statfs)
+ return Errno(-ret)
+ }
}
/// Query information about filesystem by file descriptor
@@ -1280,13 +1280,13 @@ statfs :: proc "contextless" (path: cstring, statfs: ^Stat_FS) -> (Errno) {
/// Available since Linux 1.0
/// For 32-bit systems a different syscall is used that became available since 2.6
fstatfs :: proc "contextless" (fd: Fd, statfs: ^Stat_FS) -> (Errno) {
- when size_of(int) == 8 {
- ret := syscall(SYS_statfs, fd, statfs)
- return Errno(-ret)
- } else {
- ret := syscall(SYS_statfs64, fd, size_of(Stat_FS), statfs)
- return Errno(-ret)
- }
+ when size_of(int) == 8 {
+ ret := syscall(SYS_statfs, fd, statfs)
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_statfs64, fd, size_of(Stat_FS), statfs)
+ return Errno(-ret)
+ }
}
// TODO(flysand): sysfs
@@ -1294,19 +1294,19 @@ fstatfs :: proc "contextless" (fd: Fd, statfs: ^Stat_FS) -> (Errno) {
/// Get priority on user, process group or process
/// Available since Linux 1.0
getpriority :: proc "contextless" (which: Priority_Which, who: i32) -> (i32, Errno) {
- ret := syscall(SYS_getpriority, which, who)
- prio, err := errno_unwrap(ret, i32)
- // NOTE(flysand): getpriority will return `20 - priority` to avoid returning
- // negative priorities as errors
- prio = 20 - prio
- return prio, err
+ ret := syscall(SYS_getpriority, which, who)
+ prio, err := errno_unwrap(ret, i32)
+ // NOTE(flysand): getpriority will return `20 - priority` to avoid returning
+ // negative priorities as errors
+ prio = 20 - prio
+ return prio, err
}
/// Set priority on user, process group or process
/// Available since Linux 1.0
setpriority :: proc "contextless" (which: Priority_Which, who: i32, prio: i32) -> (Errno) {
- ret := syscall(SYS_setpriority, which, who, prio)
- return Errno(-ret)
+ ret := syscall(SYS_setpriority, which, who, prio)
+ return Errno(-ret)
}
// TODO(flysand): sched_setparam
@@ -1327,33 +1327,33 @@ setpriority :: proc "contextless" (which: Priority_Which, who: i32, prio: i32) -
/// Available since Linux 2.0
/// If flags specified, available since Linux 4.4
mlock :: proc "contextless" (addr: rawptr, size: uint, flags: MLock_Flags = {}) -> (Errno) {
- // Pretty darn recent syscall, better call simpler version if we can
- if flags > {} {
- ret := syscall(SYS_mlock2, addr, size, transmute(i32) flags)
- return Errno(-ret)
- } else {
- ret := syscall(SYS_mlock, addr, size)
- return Errno(-ret)
- }
+ // Pretty darn recent syscall, better call simpler version if we can
+ if flags > {} {
+ ret := syscall(SYS_mlock2, addr, size, transmute(i32) flags)
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_mlock, addr, size)
+ return Errno(-ret)
+ }
}
/// Unlock memory
/// Available since Linux 2.0
munlock :: proc "contextless" (addr: rawptr, size: uint) -> (Errno) {
- ret := syscall(SYS_munlock, addr, size)
- return Errno(-ret)
+ ret := syscall(SYS_munlock, addr, size)
+ return Errno(-ret)
}
/// Lock all memory
mlockall :: proc "contextless" (flags: MLock_Flags = {}) -> (Errno) {
- ret := syscall(SYS_mlockall, transmute(i32) flags)
- return Errno(-ret)
+ ret := syscall(SYS_mlockall, transmute(i32) flags)
+ return Errno(-ret)
}
/// Unlock all memory
munlockall :: proc "contextless" () -> (Errno) {
- ret := syscall(SYS_munlockall)
- return Errno(-ret)
+ ret := syscall(SYS_munlockall)
+ return Errno(-ret)
}
// TODO(flysand): vhangup
@@ -1373,8 +1373,8 @@ munlockall :: proc "contextless" () -> (Errno) {
/// Set limits on resources
/// Available since Linux 1.0
setrlimit :: proc "contextless" (kind: RLimit_Kind, resource: ^RLimit) -> (Errno) {
- ret := syscall(SYS_setrlimit, kind, resource)
- return Errno(-ret)
+ ret := syscall(SYS_setrlimit, kind, resource)
+ return Errno(-ret)
}
// TODO(flysand): sync
@@ -1397,16 +1397,16 @@ setrlimit :: proc "contextless" (kind: RLimit_Kind, resource: ^RLimit) -> (Errno
/// Note: to get the host name, use `uname` syscall
/// Available since Linux 1.0
sethostname :: proc "contextless" (hostname: string) -> (Errno) {
- ret := syscall(SYS_sethostname, raw_data(hostname), len(hostname))
- return Errno(-ret)
+ ret := syscall(SYS_sethostname, raw_data(hostname), len(hostname))
+ return Errno(-ret)
}
/// Set domain name
/// Note: to get the domain name, use `uname` syscall
/// Available since Linux 2.2
setdomainname :: proc "contextless" (name: string) -> (Errno) {
- ret := syscall(SYS_setdomainname, raw_data(name), len(name))
- return Errno(-ret)
+ ret := syscall(SYS_setdomainname, raw_data(name), len(name))
+ return Errno(-ret)
}
// TODO(flysand): iopl
@@ -1444,7 +1444,7 @@ setdomainname :: proc "contextless" (name: string) -> (Errno) {
/// to a thread group (process group?)
/// Anyway, this syscall is available since Linux 1.0
gettid :: proc "contextless" () -> Pid {
- return cast(Pid) syscall(SYS_gettid)
+ return cast(Pid) syscall(SYS_gettid)
}
// TODO(flysand): readahead
@@ -1479,17 +1479,17 @@ gettid :: proc "contextless" () -> Pid {
/// Wait on a futex until it's signaled
futex_wait :: proc "contextless" (futex: ^Futex, op: Futex_Wait_Type, flags: Futex_Flags, val: u32, timeout: ^Time_Spec = nil) -> (Errno) {
- futex_flags := cast(u32) op + transmute(u32) flags
- ret := syscall(SYS_futex, futex, futex_flags, val, timeout)
- return Errno(-ret)
+ futex_flags := cast(u32) op + transmute(u32) flags
+ ret := syscall(SYS_futex, futex, futex_flags, val, timeout)
+ return Errno(-ret)
}
/// Wake up other threads on a futex
/// n_wakeup specifies the number of processes to wakeup. Specify max(i32) to wake up all processes waiting
futex_wake :: proc "contextless" (futex: ^Futex, op: Futex_Wake_Type, flags: Futex_Flags, n_wakeup: i32) -> (int, Errno) {
- futex_flags := cast(u32) op + transmute(u32) flags
- ret := syscall(SYS_futex, futex, futex_flags, n_wakeup)
- return errno_unwrap(ret, int)
+ futex_flags := cast(u32) op + transmute(u32) flags
+ ret := syscall(SYS_futex, futex, futex_flags, n_wakeup)
+ return errno_unwrap(ret, int)
}
// NOTE(flysand): futex_fd is racy, so not implemented
@@ -1501,60 +1501,60 @@ futex_wake :: proc "contextless" (futex: ^Futex, op: Futex_Wake_Type, flags: Fut
/// If the value of the mutex is not equal to `val`, fails with EAGAIN before any further checks
/// Returns the total number of waiters that have been woken up plus the number of waiters requeued
futex_cmp_requeue :: proc "contextless" (futex: ^Futex, op: Futex_Cmp_Requeue_Type, flags: Futex_Flags, requeue_threshold: u32,
- requeue_max: i32, requeue_futex: ^Futex, val: i32) -> (int, Errno)
+ requeue_max: i32, requeue_futex: ^Futex, val: i32) -> (int, Errno)
{
- futex_flags := cast(u32) op + transmute(u32) flags
- ret := syscall(SYS_futex, futex, futex_flags, requeue_threshold, requeue_max, requeue_futex, val)
- return errno_unwrap(ret, int)
+ futex_flags := cast(u32) op + transmute(u32) flags
+ ret := syscall(SYS_futex, futex, futex_flags, requeue_threshold, requeue_max, requeue_futex, val)
+ return errno_unwrap(ret, int)
}
/// See `futex_cmp_requeue`, this function does the same thing but doesn't check the value of the futex
/// Returns the total number of waiters that have been woken up
futex_requeue :: proc "contextless" (futex: ^Futex, op: Futex_Requeue_Type, flags: Futex_Flags, requeue_threshold: u32,
- requeue_max: i32, requeue_futex: ^Futex) -> (int, Errno)
+ requeue_max: i32, requeue_futex: ^Futex) -> (int, Errno)
{
- futex_flags := cast(u32) op + transmute(u32) flags
- ret := syscall(SYS_futex, futex, futex_flags, requeue_threshold, requeue_max, requeue_futex)
- return errno_unwrap(ret, int)
+ futex_flags := cast(u32) op + transmute(u32) flags
+ ret := syscall(SYS_futex, futex, futex_flags, requeue_threshold, requeue_max, requeue_futex)
+ return errno_unwrap(ret, int)
}
/// Okay, for this one, see the man pages, the description for it is pretty long and very specific. It's sole
/// purpose is to allow implementing conditional values sync primitive, it seems like
futex_wake_op :: proc "contextless" (futex: ^Futex, op: Futex_Wake_Op_Type, flags: Futex_Flags, wakeup: i32,
- dst_wakeup, dst: ^Futex, futex_op: u32) -> (int, Errno)
+ dst_wakeup, dst: ^Futex, futex_op: u32) -> (int, Errno)
{
- futex_flags := cast(u32) op + transmute(u32) flags
- ret := syscall(SYS_futex, futex, futex_flags, wakeup, dst_wakeup, dst, futex_op)
- return errno_unwrap(ret, int)
+ futex_flags := cast(u32) op + transmute(u32) flags
+ ret := syscall(SYS_futex, futex, futex_flags, wakeup, dst_wakeup, dst, futex_op)
+ return errno_unwrap(ret, int)
}
/// Same as wait, but mask specifies bits that must be equal for the mutex to wake up
futex_wait_bitset :: proc "contextless" (futex: ^Futex, op: Futex_Wait_Bitset_Type, flags: Futex_Flags, val: u32,
- timeout: ^Time_Spec, mask: u32) -> (int, Errno)
+ timeout: ^Time_Spec, mask: u32) -> (int, Errno)
{
- futex_flags := cast(u32) op + transmute(u32) flags
- ret := syscall(SYS_futex, futex, futex_flags, val, timeout, 0, mask)
- return errno_unwrap(ret, int)
+ futex_flags := cast(u32) op + transmute(u32) flags
+ ret := syscall(SYS_futex, futex, futex_flags, val, timeout, 0, mask)
+ return errno_unwrap(ret, int)
}
/// Wake up on bitset
futex_wake_bitset :: proc "contextless" (futex: ^Futex, op: Futex_Wake_Bitset_Type, flags: Futex_Flags, n_wakeup: u32, mask: u32) -> (int, Errno)
{
- futex_flags := cast(u32) op + transmute(u32) flags
- ret := syscall(SYS_futex, futex, futex_flags, n_wakeup, 0, 0, mask)
- return errno_unwrap(ret, int)
+ futex_flags := cast(u32) op + transmute(u32) flags
+ ret := syscall(SYS_futex, futex, futex_flags, n_wakeup, 0, 0, mask)
+ return errno_unwrap(ret, int)
}
// TODO(flysand): Priority inheritance (PI) futicees
futex :: proc {
- futex_wait,
- futex_wake,
- futex_cmp_requeue,
- futex_requeue,
- futex_wake_op,
- futex_wait_bitset,
- futex_wake_bitset,
+ futex_wait,
+ futex_wake,
+ futex_cmp_requeue,
+ futex_requeue,
+ futex_wake_op,
+ futex_wait_bitset,
+ futex_wake_bitset,
}
// TODO(flysand): sched_setaffinity
@@ -1589,7 +1589,7 @@ futex :: proc {
/// current thread terminates
/// Available since Linux 2.6
set_tid_address :: proc "contextless" (tidptr: ^u32) {
- syscall(SYS_set_tid_address, tidptr)
+ syscall(SYS_set_tid_address, tidptr)
}
// TODO(flysand): restart_syscall
@@ -1619,8 +1619,8 @@ set_tid_address :: proc "contextless" (tidptr: ^u32) {
/// Exit the thread group
/// Available since Linux 2.6
exit_group :: proc "contextless" (code: i32) -> ! {
- syscall(SYS_exit_group, code)
- unreachable()
+ syscall(SYS_exit_group, code)
+ unreachable()
}
// TODO(flysand): epoll_wait
@@ -1657,8 +1657,8 @@ exit_group :: proc "contextless" (code: i32) -> ! {
/// Wait on process, process group or pid file descriptor
/// Available since Linux 2.6.10
waitid :: proc "contextless" (id_type: Id_Type, id: Id, sig_info: ^Sig_Info, options: Wait_Options) -> (Errno) {
- ret := syscall(SYS_waitid, id_type, id, sig_info, transmute(i32) options)
- return Errno(-ret)
+ ret := syscall(SYS_waitid, id_type, id, sig_info, transmute(i32) options)
+ return Errno(-ret)
}
// TODO(flysand): add_key
@@ -1682,29 +1682,29 @@ waitid :: proc "contextless" (id_type: Id_Type, id: Id, sig_info: ^Sig_Info, opt
/// Open file at the specified file descriptor
/// Available since Linux 2.6.16
openat :: proc "contextless" (fd: Fd, name: cstring, flags: Open_Flags, mode: Mode = {}) -> (Fd, Errno) {
- ret := syscall(SYS_openat, fd, AT_FDCWD, transmute(uintptr) name, transmute(u32) mode)
- return errno_unwrap(ret, Fd)
+ ret := syscall(SYS_openat, fd, AT_FDCWD, transmute(uintptr) name, transmute(u32) mode)
+ return errno_unwrap(ret, Fd)
}
/// Create a directory relative to specified dirfd
/// Available since Linux 2.6.16
mkdirat :: proc "contextless" (dirfd: Fd, name: cstring, mode: Mode) -> (Errno) {
- ret := syscall(SYS_mkdirat, dirfd, cast(rawptr) name, transmute(u32) mode)
- return Errno(-ret)
+ ret := syscall(SYS_mkdirat, dirfd, cast(rawptr) name, transmute(u32) mode)
+ return Errno(-ret)
}
/// Create a special or ordinary file wrt given directory specified by dirfd
/// Available since Linux 2.6.16
mknodat :: proc "contextless" (dirfd: Fd, name: cstring, mode: Mode, dev: Dev) -> (Errno) {
- ret := syscall(SYS_mknodat, dirfd, cast(rawptr) name, transmute(u32) mode, dev)
- return Errno(-ret)
+ ret := syscall(SYS_mknodat, dirfd, cast(rawptr) name, transmute(u32) mode, dev)
+ return Errno(-ret)
}
/// Change the ownership of the file specified relative to directory
/// Available since Linux 2.6.16
fchownat :: proc "contextless" (dirfd: Fd, name: cstring, uid: Uid, gid: Gid) -> (Errno) {
- ret := syscall(SYS_fchownat, dirfd, cast(rawptr) name, uid, gid)
- return Errno(-ret)
+ ret := syscall(SYS_fchownat, dirfd, cast(rawptr) name, uid, gid)
+ return Errno(-ret)
}
// TODO(flysand): futimesat
@@ -1712,65 +1712,65 @@ fchownat :: proc "contextless" (dirfd: Fd, name: cstring, uid: Uid, gid: Gid) ->
/// Get information about a file at a specific directory
/// Available since Linux 2.6.16
fstatat :: proc "contextless" (dirfd: Fd, name: cstring, stat: ^Stat, flags: FD_Flags) -> (Errno) {
- when size_of(int) == 4 {
- ret := syscall(SYS_fstatat64, dirfd, cast(rawptr) name, stat, transmute(i32) flags)
- return Errno(-ret)
- } else when ODIN_ARCH == .amd64 {
- ret := syscall(SYS_newfstatat, dirfd, cast(rawptr) name, stat, transmute(i32) flags)
- return Errno(-ret)
- } else {
- ret := syscall(SYS_fstatat, dirfd, cast(rawptr) name, stat, transmute(i32) flags)
- return Errno(-ret)
- }
+ when size_of(int) == 4 {
+ ret := syscall(SYS_fstatat64, dirfd, cast(rawptr) name, stat, transmute(i32) flags)
+ return Errno(-ret)
+ } else when ODIN_ARCH == .amd64 {
+ ret := syscall(SYS_newfstatat, dirfd, cast(rawptr) name, stat, transmute(i32) flags)
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_fstatat, dirfd, cast(rawptr) name, stat, transmute(i32) flags)
+ return Errno(-ret)
+ }
}
/// Remove a directory entry relative to a directory file descriptor
/// Available since Linux 2.6.16
unlinkat :: proc "contextless" (dirfd: Fd, name: cstring, flags: FD_Flags) -> (Errno) {
- ret := syscall(SYS_unlinkat, dirfd, cast(rawptr) name, transmute(i32) flags)
- return Errno(-ret)
+ ret := syscall(SYS_unlinkat, dirfd, cast(rawptr) name, transmute(i32) flags)
+ return Errno(-ret)
}
/// Rename the file with names relative to the specified dirfd's
/// Available since Linux 2.6.16
renameat :: proc "contextless" (oldfd: Fd, old: cstring, newfd: Fd, new: cstring) -> (Errno) {
- ret := syscall(SYS_renameat, oldfd, cast(rawptr) old, newfd, cast(rawptr) new)
- return Errno(-ret)
+ ret := syscall(SYS_renameat, oldfd, cast(rawptr) old, newfd, cast(rawptr) new)
+ return Errno(-ret)
}
/// Creates a hard link on a file relative to specified dirfd
/// Available since Linux 2.6.16
linkat :: proc "contextless" (target_dirfd: Fd, oldpath: cstring, link_dirfd: Fd, link: cstring, flags: FD_Flags) -> (Errno) {
- ret := syscall(SYS_linkat, target_dirfd, cast(rawptr) oldpath, link_dirfd, cast(rawptr) link, transmute(i32) flags)
- return Errno(-ret)
+ ret := syscall(SYS_linkat, target_dirfd, cast(rawptr) oldpath, link_dirfd, cast(rawptr) link, transmute(i32) flags)
+ return Errno(-ret)
}
/// Create a symbolic link at specified dirfd
/// Available since Linux 2.6.16
symlinkat :: proc "contextless" (dirfd: Fd, target: cstring, linkpath: cstring) -> (Errno) {
- ret := syscall(SYS_symlinkat, dirfd, cast(rawptr) target, cast(rawptr) linkpath)
- return Errno(-ret)
+ ret := syscall(SYS_symlinkat, dirfd, cast(rawptr) target, cast(rawptr) linkpath)
+ return Errno(-ret)
}
/// Read the value of a symbolic link at given dirfd
/// Available since Linux 2.6.16
readlinkat :: proc "contextless" (dirfd: Fd, name: cstring, buf: []u8) -> (int, Errno) {
- ret := syscall(SYS_readlinkat, dirfd, cast(rawptr) name, raw_data(buf), len(buf))
- return errno_unwrap(ret, int)
+ ret := syscall(SYS_readlinkat, dirfd, cast(rawptr) name, raw_data(buf), len(buf))
+ return errno_unwrap(ret, int)
}
/// Change the file mode at a specified file descriptor
/// Available since Linux 2.6.16
fchmodat :: proc "contextless" (dirfd: Fd, name: cstring, mode: Mode, flags: FD_Flags) -> (Errno) {
- ret := syscall(SYS_fchmodat, cast(rawptr) name, transmute(u32) mode, transmute(i32) flags)
- return Errno(-ret)
+ ret := syscall(SYS_fchmodat, cast(rawptr) name, transmute(u32) mode, transmute(i32) flags)
+ return Errno(-ret)
}
/// Checks the user permissions for a file at specified dirfd
/// Available since Linux 2.6.16
faccessat :: proc "contextless" (dirfd: Fd, name: cstring, mode: Mode = F_OK) -> (bool, Errno) {
- ret := syscall(SYS_faccessat, dirfd, cast(rawptr) name, transmute(u32) mode)
- return errno_unwrap(ret, bool)
+ ret := syscall(SYS_faccessat, dirfd, cast(rawptr) name, transmute(u32) mode)
+ return errno_unwrap(ret, bool)
}
// TODO(flysand): pselect6
@@ -1778,13 +1778,13 @@ faccessat :: proc "contextless" (dirfd: Fd, name: cstring, mode: Mode = F_OK) ->
/// Wait for events on a file descriptor
/// Available since Linux 2.6.16
ppoll :: proc "contextless" (fds: []Poll_Fd, timeout: ^Time_Spec, sigmask: ^Sig_Set) -> (Errno) {
- when size_of(int) == 8 {
- ret := syscall(SYS_ppoll, raw_data(fds), len(fds), timeout, sigmask, size_of(Sig_Set))
- return Errno(-ret)
- } else {
- ret := syscall(SYS_ppoll_time64, raw_data(fds), len(fds), timeout, sigmask, size_of(Sig_Set))
- return Errno(-ret)
- }
+ when size_of(int) == 8 {
+ ret := syscall(SYS_ppoll, raw_data(fds), len(fds), timeout, sigmask, size_of(Sig_Set))
+ return Errno(-ret)
+ } else {
+ ret := syscall(SYS_ppoll_time64, raw_data(fds), len(fds), timeout, sigmask, size_of(Sig_Set))
+ return Errno(-ret)
+ }
}
// TODO(flysand): unshare
@@ -1806,8 +1806,8 @@ ppoll :: proc "contextless" (fds: []Poll_Fd, timeout: ^Time_Spec, sigmask: ^Sig_
/// Change file timestamps with nanosecond precision
/// Available since Linux 2.6.22
utimensat :: proc "contextless" (dirfd: Fd, name: cstring, timespec: ^Time_Spec, flags: FD_Flags) -> (Errno) {
- ret := syscall(SYS_utimensat, dirfd, cast(rawptr) name, timespec, transmute(i32) flags)
- return Errno(-ret)
+ ret := syscall(SYS_utimensat, dirfd, cast(rawptr) name, timespec, transmute(i32) flags)
+ return Errno(-ret)
}
// TODO(flysand): epoll_pwait
@@ -1836,8 +1836,8 @@ utimensat :: proc "contextless" (dirfd: Fd, name: cstring, timespec: ^Time_Spec,
/// In addition to dup2 allows to pass O_CLOEXEC flag
/// Available since Linux 2.6.27
dup3 :: proc "contextless" (old: Fd, new: Fd, flags: Open_Flags) -> (Fd, Errno) {
- ret := syscall(SYS_dup3, old, new, transmute(i32) flags)
- return errno_unwrap(ret, Fd)
+ ret := syscall(SYS_dup3, old, new, transmute(i32) flags)
+ return errno_unwrap(ret, Fd)
}
// TODO(flysand): inotify_init1
@@ -1850,15 +1850,15 @@ dup3 :: proc "contextless" (old: Fd, new: Fd, flags: Open_Flags) -> (Fd, Errno)
/// Send signal information to a thread
/// Available since Linux 2.2
rt_tgsigqueueinfo :: proc "contextless" (tgid: Pid, pid: Pid, sig: Signal, si: ^Sig_Info) -> (Errno) {
- ret := syscall(SYS_rt_tgsigqueueinfo, tgid, pid, sig, si)
- return Errno(-ret)
+ ret := syscall(SYS_rt_tgsigqueueinfo, tgid, pid, sig, si)
+ return Errno(-ret)
}
/// Set up performance monitoring
/// Available since Linux 2.6.31
perf_event_open :: proc "contextless" (attr: ^Perf_Event_Attr, pid: Pid, cpu: int, group_fd: Fd, flags: Perf_Flags = {}) -> (Fd, Errno) {
- ret := syscall(SYS_perf_event_open, attr, pid, cpu, group_fd, transmute(uint) flags)
- return errno_unwrap(ret, Fd)
+ ret := syscall(SYS_perf_event_open, attr, pid, cpu, group_fd, transmute(uint) flags)
+ return errno_unwrap(ret, Fd)
}
// TODO(flysand): recvmmsg
@@ -1898,15 +1898,15 @@ perf_event_open :: proc "contextless" (attr: ^Perf_Event_Attr, pid: Pid, cpu: in
/// Rename the file with names relative to the specified dirfd's with other options
/// Available since Linux 3.15
renameat2 :: proc "contextless" (oldfd: Fd, old: cstring, newfd: Fd, new: cstring, flags: Rename_Flags) -> (Errno) {
- ret := syscall(SYS_renameat2, oldfd, cast(rawptr) old, newfd, cast(rawptr) new, transmute(u32) flags)
- return Errno(-ret)
+ ret := syscall(SYS_renameat2, oldfd, cast(rawptr) old, newfd, cast(rawptr) new, transmute(u32) flags)
+ return Errno(-ret)
}
// TODO(flysand): seccomp
getrandom :: proc "contextless" (buf: []u8, flags: Get_Random_Flags) -> (int, Errno) {
- ret := syscall(SYS_getrandom, raw_data(buf), len(buf), transmute(i32) flags)
- return errno_unwrap(ret, int)
+ ret := syscall(SYS_getrandom, raw_data(buf), len(buf), transmute(i32) flags)
+ return errno_unwrap(ret, int)
}
// TODO(flysand): memfd_create
@@ -1944,8 +1944,8 @@ getrandom :: proc "contextless" (buf: []u8, flags: Get_Random_Flags) -> (int, Er
///
/// Available since Linux 4.11
statx :: proc "contextless" (dir: Fd, pathname: cstring, flags: FD_Flags, mask: Statx_Mask, statx: ^Statx) -> (Errno) {
- ret := syscall(SYS_statx, dir, transmute(uintptr) pathname, transmute(i32) flags, transmute(u32) mask, statx)
- return Errno(-ret)
+ ret := syscall(SYS_statx, dir, transmute(uintptr) pathname, transmute(i32) flags, transmute(u32) mask, statx)
+ return Errno(-ret)
}
// TODO(flysand): io_pgetevents
@@ -1977,8 +1977,8 @@ statx :: proc "contextless" (dir: Fd, pathname: cstring, flags: FD_Flags, mask:
/// The returned `pidfd` has `CLOEXEC` semantics
/// Available since Linux 5.3
pidfd_open :: proc "contextless" (pid: Pid, flags: Pid_FD_Flags) -> (Pid_FD, Errno) {
- ret := syscall(SYS_pidfd_open, pid, transmute(i32) flags)
- return errno_unwrap(ret, Pid_FD)
+ ret := syscall(SYS_pidfd_open, pid, transmute(i32) flags)
+ return errno_unwrap(ret, Pid_FD)
}
// TODO(flysand): clone3 (probably not this PR)
@@ -1987,8 +1987,8 @@ pidfd_open :: proc "contextless" (pid: Pid, flags: Pid_FD_Flags) -> (Pid_FD, Err
/// The range of file descriptors is inclusive, and may contain invalid file descriptors
/// Available since Linux 5.9
close_range :: proc "contextless" (lo: Fd, hi: Fd, flags: Close_Range_Flags) -> (Errno) {
- ret := syscall(SYS_close_range, lo, hi, transmute(u32) flags)
- return Errno(-ret)
+ ret := syscall(SYS_close_range, lo, hi, transmute(u32) flags)
+ return Errno(-ret)
}
// TODO(flysand): openat2
@@ -1998,15 +1998,15 @@ close_range :: proc "contextless" (lo: Fd, hi: Fd, flags: Close_Range_Flags) ->
/// `flags` must be zero
/// Available since Linux 5.3
pidfd_getfd :: proc "contextless" (pidfd: Pid_FD, fd: Fd, flags: i32 = 0) -> (Fd, Errno) {
- ret := syscall(SYS_pidfd_getfd, pidfd, fd, flags)
- return errno_unwrap(ret, Fd)
+ ret := syscall(SYS_pidfd_getfd, pidfd, fd, flags)
+ return errno_unwrap(ret, Fd)
}
/// Checks the user permissions for a file at specified dirfd (with flags)
/// Available since Linux 5.8
faccessat2 :: proc "contextless" (dirfd: Fd, name: cstring, mode: Mode = F_OK, flags: FD_Flags = FD_Flags{}) -> (bool, Errno) {
- ret := syscall(SYS_faccessat2, dirfd, cast(rawptr) name, transmute(u32) mode, transmute(i32) flags)
- return errno_unwrap(ret, bool)
+ ret := syscall(SYS_faccessat2, dirfd, cast(rawptr) name, transmute(u32) mode, transmute(i32) flags)
+ return errno_unwrap(ret, bool)
}
// TODO(flysand): process_madvise
diff --git a/core/sys/linux/types.odin b/core/sys/linux/types.odin
index 214aff9cf..8789ca2d1 100644
--- a/core/sys/linux/types.odin
+++ b/core/sys/linux/types.odin
@@ -28,14 +28,14 @@ Inode :: distinct u64
/// Represents time with nanosecond precision
Time_Spec :: struct {
- time_sec: uint,
- time_nsec: uint,
+ time_sec: uint,
+ time_nsec: uint,
}
/// Represents time with millisecond precision
Time_Val :: struct {
- seconds: int,
- microseconds: int,
+ seconds: int,
+ microseconds: int,
}
/// open.2 flags
@@ -54,75 +54,75 @@ FD_Flags :: bit_set[FD_Flags_Bits; i32]
Mode :: bit_set[Mode_Bits; u32]
when ODIN_ARCH == .amd64 {
- // x86-64 has mode and nlink swapped for some reason
- _Arch_Stat :: struct {
- dev: Dev,
- ino: Inode,
- nlink: uint,
- mode: Mode,
- uid: Uid,
- gid: Gid,
- _: u32,
- rdev: Dev,
- size: uint,
- blksize: uint,
- blocks: uint,
- atime: Time_Spec,
- mtime: Time_Spec,
- ctime: Time_Spec,
- _: [3]uint,
- }
+ // x86-64 has mode and nlink swapped for some reason
+ _Arch_Stat :: struct {
+ dev: Dev,
+ ino: Inode,
+ nlink: uint,
+ mode: Mode,
+ uid: Uid,
+ gid: Gid,
+ _: u32,
+ rdev: Dev,
+ size: uint,
+ blksize: uint,
+ blocks: uint,
+ atime: Time_Spec,
+ mtime: Time_Spec,
+ ctime: Time_Spec,
+ _: [3]uint,
+ }
} else when ODIN_ARCH == .arm64 {
- _Arch_Stat :: struct {
- dev: Dev,
- ino: Inode,
- mode: Mode,
- nlink: u32,
- uid: Uid,
- gid: Gid,
- rdev: Dev,
- _: u64,
- size: int,
- blksize: i32,
- _: i32,
- blocks: int,
- atime: Time_Spec,
- mtime: Time_Spec,
- ctime: Time_Spec,
- _: [3]uint,
- }
+ _Arch_Stat :: struct {
+ dev: Dev,
+ ino: Inode,
+ mode: Mode,
+ nlink: u32,
+ uid: Uid,
+ gid: Gid,
+ rdev: Dev,
+ _: u64,
+ size: int,
+ blksize: i32,
+ _: i32,
+ blocks: int,
+ atime: Time_Spec,
+ mtime: Time_Spec,
+ ctime: Time_Spec,
+ _: [3]uint,
+ }
} else {
- _Arch_Stat :: struct {
- dev: Dev,
- _: [4]u8,
- _ino: uint, // Old 32-bit inode number, don't use
- mode: Mode,
- nlink: u32,
- uid: Uid,
- gid: Gid,
- rdev: Dev,
- size: i64,
- blksize: uint,
- blocks: u64,
- atim: Time_Spec,
- mtim: Time_Spec,
- ctim: Time_Spec,
- ino: Inode,
- }
+ _Arch_Stat :: struct {
+ dev: Dev,
+ _: [4]u8,
+ _ino: uint, // Old 32-bit inode number, don't use
+ mode: Mode,
+ nlink: u32,
+ uid: Uid,
+ gid: Gid,
+ rdev: Dev,
+ size: i64,
+ blksize: uint,
+ blocks: u64,
+ atim: Time_Spec,
+ mtim: Time_Spec,
+ ctim: Time_Spec,
+ ino: Inode,
+ }
}
/// Represents the file state.
/// Mirrors struct stat in glibc/linux kernel.
/// If you're on 32-bit platform, consider using Stat64 instead
Stat :: struct {
- using _impl_stat: _Arch_Stat,
+ using _impl_stat: _Arch_Stat,
}
/// Timestamp type used for Statx struct
Statx_Timestamp :: struct {
- sec: i64,
- nsec: u32,
- _: i32,
+ sec: i64,
+ nsec: u32,
+ _: i32,
}
/// Query params/results for `statx()`
@@ -135,78 +135,78 @@ Statx_Attr :: bit_set[Statx_Attr_Bits; u64]
/// The extended Stat struct
Statx :: struct {
- mask: Statx_Mask,
- blksize: u32,
- attributes: Statx_Attr,
- nlink: u32,
- uid: Uid,
- gid: Gid,
- // Note(flysand): mode is 16-bit on linux + there's
- // 16-bit padding following it. Since our mode is 32-bits,
- // we're using the padding. This should be fine because
- // the placement of that padding suggests it was going to
- // be used for the Mode bits anyway.
- mode: Mode,
- ino: Inode,
- size: u64,
- blocks: u64,
- attributes_mask: Statx_Attr,
- atime: Statx_Timestamp,
- btime: Statx_Timestamp,
- ctime: Statx_Timestamp,
- mtime: Statx_Timestamp,
- rdev_major: u32,
- rdev_minor: u32,
- dev_major: u32,
- dev_minor: u32,
- mnt_id: u64,
- dio_mem_align: u32,
- dio_offset_align: u32,
- _: [12]u64,
+ mask: Statx_Mask,
+ blksize: u32,
+ attributes: Statx_Attr,
+ nlink: u32,
+ uid: Uid,
+ gid: Gid,
+ // Note(flysand): mode is 16-bit on linux + there's
+ // 16-bit padding following it. Since our mode is 32-bits,
+ // we're using the padding. This should be fine because
+ // the placement of that padding suggests it was going to
+ // be used for the Mode bits anyway.
+ mode: Mode,
+ ino: Inode,
+ size: u64,
+ blocks: u64,
+ attributes_mask: Statx_Attr,
+ atime: Statx_Timestamp,
+ btime: Statx_Timestamp,
+ ctime: Statx_Timestamp,
+ mtime: Statx_Timestamp,
+ rdev_major: u32,
+ rdev_minor: u32,
+ dev_major: u32,
+ dev_minor: u32,
+ mnt_id: u64,
+ dio_mem_align: u32,
+ dio_offset_align: u32,
+ _: [12]u64,
}
/// Mount flags for filesystem
FS_Flags :: bit_set[FS_Flags_Bits; u32]
when size_of(int) == 8 {
- _Arch_Stat_FS :: struct {
- // Note(flysand): The FS_Magic bits are never above
- // 32-bits, so it should be fine for now...
- type: FS_Magic,
- _: u32,
- bsize: i64,
- blocks: i64,
- bfree: i64,
- bavail: i64,
- files: i64,
- ffree: i64,
- fsid : [2]i32,
- namelen: i64,
- frsize: i64,
- // Note(flysand): Same story as type
- flags: FS_Flags,
- _: u32,
- spare: [4]i64,
- }
+ _Arch_Stat_FS :: struct {
+ // Note(flysand): The FS_Magic bits are never above
+ // 32-bits, so it should be fine for now...
+ type: FS_Magic,
+ _: u32,
+ bsize: i64,
+ blocks: i64,
+ bfree: i64,
+ bavail: i64,
+ files: i64,
+ ffree: i64,
+ fsid : [2]i32,
+ namelen: i64,
+ frsize: i64,
+ // Note(flysand): Same story as type
+ flags: FS_Flags,
+ _: u32,
+ spare: [4]i64,
+ }
} else {
- _Arch_Stat_FS :: struct {
- type: FS_Magic,
- bsize: u32,
- blocks: u64,
- bfree: u64,
- bavail: u64,
- files: u64,
- ffree: u64,
- fsid: [2]i32,
- namelen: u32,
- frsize: u32,
- flags: FS_Flags,
- spare: [4]u32,
- }
+ _Arch_Stat_FS :: struct {
+ type: FS_Magic,
+ bsize: u32,
+ blocks: u64,
+ bfree: u64,
+ bavail: u64,
+ files: u64,
+ ffree: u64,
+ fsid: [2]i32,
+ namelen: u32,
+ frsize: u32,
+ flags: FS_Flags,
+ spare: [4]u32,
+ }
}
Stat_FS :: struct {
- using _impl_stat_fs: _Arch_Stat_FS,
+ using _impl_stat_fs: _Arch_Stat_FS,
}
/// Flags for close_range.2
@@ -219,20 +219,20 @@ Rename_Flags :: bit_set[Rename_Flags_Bits; u32]
/// Recommended to use this with dirent_iterator()
/// and dirent_name()
Dirent :: struct {
- ino: Inode,
- off: i64,
- reclen: u16,
- type: Dirent_Type,
- name: [0]u8, // See dirent_name
+ ino: Inode,
+ off: i64,
+ reclen: u16,
+ type: Dirent_Type,
+ name: [0]u8, // See dirent_name
}
/// Lock record for fcntl.2
FLock :: struct {
- type: FLock_Type,
- whence: Seek_Whence,
- start: i64,
- len: i64,
- pid: Pid,
+ type: FLock_Type,
+ whence: Seek_Whence,
+ start: i64,
+ len: i64,
+ pid: Pid,
}
/// Flags for fcntl_notify
@@ -243,8 +243,8 @@ Seal :: bit_set[Seal_Bits; i32]
/// Represents owner that receives events on file updates
F_Owner :: struct {
- type: F_Owner_Type,
- pid: Pid,
+ type: F_Owner_Type,
+ pid: Pid,
}
/// Events for ppoll
@@ -252,9 +252,9 @@ Fd_Poll_Events :: bit_set[Fd_Poll_Events_Bits; u16]
/// Struct for ppoll
Poll_Fd :: struct {
- fd: Fd,
- events: Fd_Poll_Events,
- revents: Fd_Poll_Events,
+ fd: Fd,
+ events: Fd_Poll_Events,
+ revents: Fd_Poll_Events,
}
/// Specifies protection for memory pages
@@ -292,79 +292,79 @@ Branch_Sample_Type :: bit_set[Branch_Sample_Type_Bits; u64]
/// The struct for perf_event_open
Perf_Event_Attr :: struct #packed {
- type: Perf_Event_Type,
- size: u32,
- config: struct #raw_union {
- hw: Perf_Hardware_Id,
- sw: Perf_Software_Id,
- cache: u64,
- other: u64,
- },
- sample: struct #raw_union {
- period: u64,
- frequency: u64,
- },
- sample_type: Perf_Event_Sample_Type,
- read_format: Perf_Read_Format,
- flags: Perf_Event_Flags,
- wakeup: struct #raw_union {
- events: u32,
- watermark: u32,
- },
- breakpoint_type: Hardware_Breakpoint_Type,
- using _: struct #raw_union {
- breakpoint_addr: u64,
- kprobe_func: u64,
- uprobe_path: u64,
- config1: u64,
- },
- using _: struct #raw_union {
- breakpoint_len: u64,
- kprobe_addr: u64,
- uprobe_offset: u64,
- config2: u64,
- },
- branch_sample_type: Branch_Sample_Type,
- sample_regs_user: u64,
- sample_stack_user: u32,
- clock_id: i32, // TODO(flysand): clock_id
- sample_regs_intr: u64,
- aux_watermark: u32,
- sample_max_stack: u16,
- _: u16,
+ type: Perf_Event_Type,
+ size: u32,
+ config: struct #raw_union {
+ hw: Perf_Hardware_Id,
+ sw: Perf_Software_Id,
+ cache: u64,
+ other: u64,
+ },
+ sample: struct #raw_union {
+ period: u64,
+ frequency: u64,
+ },
+ sample_type: Perf_Event_Sample_Type,
+ read_format: Perf_Read_Format,
+ flags: Perf_Event_Flags,
+ wakeup: struct #raw_union {
+ events: u32,
+ watermark: u32,
+ },
+ breakpoint_type: Hardware_Breakpoint_Type,
+ using _: struct #raw_union {
+ breakpoint_addr: u64,
+ kprobe_func: u64,
+ uprobe_path: u64,
+ config1: u64,
+ },
+ using _: struct #raw_union {
+ breakpoint_len: u64,
+ kprobe_addr: u64,
+ uprobe_offset: u64,
+ config2: u64,
+ },
+ branch_sample_type: Branch_Sample_Type,
+ sample_regs_user: u64,
+ sample_stack_user: u32,
+ clock_id: i32, // TODO(flysand): clock_id
+ sample_regs_intr: u64,
+ aux_watermark: u32,
+ sample_max_stack: u16,
+ _: u16,
}
/// The ring buffer structure when mmaping Perf_Event_Attr
Perf_Event_Mmap_Page :: struct #packed {
- version: u32,
- compat_version: u32,
- lock: u32,
- index: u32,
- offset: i64,
- time_enabled: u64,
- time_running: u64,
- cap: struct #raw_union {
- capabilities: u64,
- flags: Perf_Cap_Flags,
- },
- pmc_width: u16,
- time_shift: u16,
- time_mult: u32,
- time_offset: u64,
- time_zero: u64,
- size: u32,
- reserved1: u32,
- time_cycles: u64,
- time_mask: u64,
- reserved2: [116*8]u8,
- data_head: u64,
- data_tail: u64,
- data_offset: u64,
- data_size: u64,
- aux_head: u64,
- aux_tail: u64,
- aux_offset: u64,
- aux_size: u64,
+ version: u32,
+ compat_version: u32,
+ lock: u32,
+ index: u32,
+ offset: i64,
+ time_enabled: u64,
+ time_running: u64,
+ cap: struct #raw_union {
+ capabilities: u64,
+ flags: Perf_Cap_Flags,
+ },
+ pmc_width: u16,
+ time_shift: u16,
+ time_mult: u32,
+ time_offset: u64,
+ time_zero: u64,
+ size: u32,
+ reserved1: u32,
+ time_cycles: u64,
+ time_mask: u64,
+ reserved2: [116*8]u8,
+ data_head: u64,
+ data_tail: u64,
+ data_offset: u64,
+ data_size: u64,
+ aux_head: u64,
+ aux_tail: u64,
+ aux_offset: u64,
+ aux_size: u64,
}
// TODO(flysand): Its taking too much effort to bind the other data structures related to perf_event_open
@@ -393,68 +393,68 @@ Sig_Handler_Fn :: #type proc "c" (sig: Signal)
Sig_Restore_Fn :: #type proc "c" ()
Sig_Info :: struct #packed {
- signo: Signal,
- errno: Errno,
- code: i32,
- _pad0: i32,
- using _union: struct #raw_union {
- _pad1: [SI_PAD_SIZE]u8,
- using _kill: struct {
- pid: Pid, /* sender's pid */
- uid: Uid, /* sender's uid */
- },
- using _timer: struct {
- timerid: i32, /* timer id */
- overrun: i32, /* overrun count */
- },
- /* POSIX.1b signals */
- using _rt: struct {
- _pid0: Pid, /* sender's pid */
- _uid0: Uid, /* sender's uid */
- },
- /* SIGCHLD */
- using _sigchld: struct {
- _pid1: Pid, /* which child */
- _uid1: Uid, /* sender's uid */
- status: i32, /* exit code */
- utime: uint,
- stime: uint, //clock_t
- },
- /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
- using _sigfault: struct {
- addr: rawptr, /* faulting insn/memory ref. */
- addr_lsb: i16, /* LSB of the reported address */
- },
- /* SIGPOLL */
- using _sigpoll: struct {
- band: int, /* POLL_IN, POLL_OUT, POLL_MSG */
- fd: Fd,
- },
- /* SIGSYS */
- using _sigsys: struct {
- call_addr: rawptr, /* calling user insn */
- syscall: i32, /* triggering system call number */
- arch: u32, /* AUDIT_ARCH_* of syscall */
- },
- },
+ signo: Signal,
+ errno: Errno,
+ code: i32,
+ _pad0: i32,
+ using _union: struct #raw_union {
+ _pad1: [SI_PAD_SIZE]u8,
+ using _kill: struct {
+ pid: Pid, /* sender's pid */
+ uid: Uid, /* sender's uid */
+ },
+ using _timer: struct {
+ timerid: i32, /* timer id */
+ overrun: i32, /* overrun count */
+ },
+ /* POSIX.1b signals */
+ using _rt: struct {
+ _pid0: Pid, /* sender's pid */
+ _uid0: Uid, /* sender's uid */
+ },
+ /* SIGCHLD */
+ using _sigchld: struct {
+ _pid1: Pid, /* which child */
+ _uid1: Uid, /* sender's uid */
+ status: i32, /* exit code */
+ utime: uint,
+ stime: uint, //clock_t
+ },
+ /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
+ using _sigfault: struct {
+ addr: rawptr, /* faulting insn/memory ref. */
+ addr_lsb: i16, /* LSB of the reported address */
+ },
+ /* SIGPOLL */
+ using _sigpoll: struct {
+ band: int, /* POLL_IN, POLL_OUT, POLL_MSG */
+ fd: Fd,
+ },
+ /* SIGSYS */
+ using _sigsys: struct {
+ call_addr: rawptr, /* calling user insn */
+ syscall: i32, /* triggering system call number */
+ arch: u32, /* AUDIT_ARCH_* of syscall */
+ },
+ },
}
Sig_Stack_Flags :: bit_set[Sig_Stack_Flag; i32]
Sig_Stack :: struct {
- sp: rawptr,
- flags: Sig_Stack_Flags,
- size: uintptr,
+ sp: rawptr,
+ flags: Sig_Stack_Flags,
+ size: uintptr,
}
Sig_Action :: struct($T: typeid) {
- using _u: struct #raw_union {
- handler: Sig_Handler_Fn,
- sigaction: #type proc "c" (sig: Signal, si: ^Sig_Info, ctx: ^T),
- },
- flags: uint,
- restorer: Sig_Restore_Fn,
- mask: Sig_Set,
+ using _u: struct #raw_union {
+ handler: Sig_Handler_Fn,
+ sigaction: #type proc "c" (sig: Signal, si: ^Sig_Info, ctx: ^T),
+ },
+ flags: uint,
+ restorer: Sig_Restore_Fn,
+ mask: Sig_Set,
}
@@ -472,28 +472,28 @@ Socket_Msg :: bit_set[Socket_Msg_Bits; i32]
/// Struct representing IPv4 socket address
Sock_Addr_In :: struct #packed {
- sin_family: Address_Family,
- sin_port: u16be,
- sin_addr: [4]u8,
+ sin_family: Address_Family,
+ sin_port: u16be,
+ sin_addr: [4]u8,
}
/// Struct representing IPv6 socket address
Sock_Addr_In6 :: struct #packed {
- sin6_family: Address_Family,
- sin6_port: u16be,
- sin6_flowinfo: u32,
- sin6_addr: [16]u8,
- sin6_scope_id: u32,
+ sin6_family: Address_Family,
+ sin6_port: u16be,
+ sin6_flowinfo: u32,
+ sin6_addr: [16]u8,
+ sin6_scope_id: u32,
}
/// Struct representing an arbitrary socket address
Sock_Addr_Any :: struct #raw_union {
- using _: struct {
- family: Address_Family,
- port: u16be,
- },
- using ipv4: Sock_Addr_In,
- using ipv6: Sock_Addr_In6,
+ using _: struct {
+ family: Address_Family,
+ port: u16be,
+ },
+ using ipv4: Sock_Addr_In,
+ using ipv6: Sock_Addr_In6,
}
/// Just an alias to make futex-values more visible
@@ -504,63 +504,63 @@ Futex_Flags :: bit_set[Futex_Flags_Bits; u32]
/// Times
Tms :: struct {
- tms_utime: int,
- tms_stime: int,
- tms_cutime: int,
- tms_cstime: int,
+ tms_utime: int,
+ tms_stime: int,
+ tms_cutime: int,
+ tms_cstime: int,
}
/// "Unix time-sharing system name", allegedly
/// Basically system info
UTS_Name :: struct {
- sysname: [65]u8 `fmt:"s,0"`,
- nodename: [65]u8 `fmt:"s,0"`,
- release: [65]u8 `fmt:"s,0"`,
- version: [65]u8 `fmt:"s,0"`,
- machine: [65]u8 `fmt:"s,0"`,
- domainname: [65]u8 `fmt:"s,0"`,
+ sysname: [65]u8 `fmt:"s,0"`,
+ nodename: [65]u8 `fmt:"s,0"`,
+ release: [65]u8 `fmt:"s,0"`,
+ version: [65]u8 `fmt:"s,0"`,
+ machine: [65]u8 `fmt:"s,0"`,
+ domainname: [65]u8 `fmt:"s,0"`,
}
/// Return buffer for the sysinfo syscall
Sys_Info :: struct {
- uptime: int,
- loads: [3]int,
- totalram: uint,
- freeram: uint,
- sharedram: uint,
- bufferram: uint,
- totalswap: uint,
- freeswap: uint,
- procs: u16,
- totalhigh: uint,
- freehigh: uint,
- mem_unit: i32,
- _padding: [20 - (2 * size_of(int)) - size_of(i32)]u8,
+ uptime: int,
+ loads: [3]int,
+ totalram: uint,
+ freeram: uint,
+ sharedram: uint,
+ bufferram: uint,
+ totalswap: uint,
+ freeswap: uint,
+ procs: u16,
+ totalhigh: uint,
+ freehigh: uint,
+ mem_unit: i32,
+ _padding: [20 - (2 * size_of(int)) - size_of(i32)]u8,
}
/// Resource limit
RLimit :: struct {
- cur: uint,
- max: uint,
+ cur: uint,
+ max: uint,
}
/// Structure representing how much of each resource
/// got used.
RUsage :: struct {
- utime: Time_Val,
- stime: Time_Val,
- maxrss_word: int,
- ixrss_word: int,
- idrss_word: int,
- isrss_word: int,
- minflt_word: int,
- majflt_word: int,
- nswap_word: int,
- inblock_word: int,
- oublock_word: int,
- msgsnd_word: int,
- msgrcv_word: int,
- nsignals_word: int,
- nvcsw_word: int,
- nivcsw_word: int,
+ utime: Time_Val,
+ stime: Time_Val,
+ maxrss_word: int,
+ ixrss_word: int,
+ idrss_word: int,
+ isrss_word: int,
+ minflt_word: int,
+ majflt_word: int,
+ nswap_word: int,
+ inblock_word: int,
+ oublock_word: int,
+ msgsnd_word: int,
+ msgrcv_word: int,
+ nsignals_word: int,
+ nvcsw_word: int,
+ nivcsw_word: int,
}
diff --git a/core/sys/linux/wrappers.odin b/core/sys/linux/wrappers.odin
index a4c4aac32..13073315d 100644
--- a/core/sys/linux/wrappers.odin
+++ b/core/sys/linux/wrappers.odin
@@ -4,48 +4,48 @@ package linux
/// Low 8 bits of the exit code
/// Only retrieve the exit code if WIFEXITED(s) = true
WEXITSTATUS :: #force_inline proc "contextless" (s: u32) -> u32 {
- return (s & 0xff00) >> 8
+ return (s & 0xff00) >> 8
}
/// Termination signal
/// Only retrieve the code if WIFSIGNALED(s) = true
WTERMSIG :: #force_inline proc "contextless" (s: u32) -> u32 {
- return s & 0x7f
+ return s & 0x7f
}
/// The signal that stopped the child
/// Only retrieve if WIFSTOPPED(s) = true
WSTOPSIG :: #force_inline proc "contextless" (s: u32) -> u32 {
- return WEXITSTATUS(s)
+ return WEXITSTATUS(s)
}
/// Check if the process terminated normally (via exit.2)
WIFEXITED :: #force_inline proc "contextless" (s: u32) -> bool {
- return WTERMSIG(s) == 0
+ return WTERMSIG(s) == 0
}
/// Check if the process signaled
WIFSIGNALED :: #force_inline proc "contextless" (s: u32) -> bool {
- return cast(i8)(((s) & 0x7f) + 1) >> 1 > 0
+ return cast(i8)(((s) & 0x7f) + 1) >> 1 > 0
}
/// Check if the process has stopped
WIFSTOPPED :: #force_inline proc "contextless" (s: u32) -> bool {
- return (s & 0xff) == 0x7f
+ return (s & 0xff) == 0x7f
}
/// Check if the process is continued by the tracee
WIFCONTINUED :: #force_inline proc "contextless" (s: u32) -> bool {
- return s == 0xffff
+ return s == 0xffff
}
/// Check if the process dumped core
WCOREDUMP :: #force_inline proc "contextless" (s: u32) -> bool {
- return s & 0x80 == 0x80
+ return s & 0x80 == 0x80
}
@private _sigmask :: proc "contextless" (sig: Signal) -> (uint) {
- return 1 << ((cast(uint)(sig) - 1) % (8*size_of(uint)))
+ return 1 << ((cast(uint)(sig) - 1) % (8*size_of(uint)))
}
@private _sigword :: proc "contextless" (sig: Signal) -> (uint) {
return (cast(uint)sig - 1) / (8*size_of(uint))
@@ -71,51 +71,51 @@ WCOREDUMP :: #force_inline proc "contextless" (s: u32) -> bool {
/// This function doesn't automatically make a request
/// for the buffer to be refilled
dirent_iterate_buf :: proc "contextless" (buf: []u8, offs: ^int) -> (d: ^Dirent, cont: bool) {
- // Stopped iterating when there's no space left
- if offs^ >= len(buf) {
- return nil, false
- }
- // Retrieve dirent form the current offset
- dirent := cast(^Dirent) &buf[offs^]
- // Add the stride of dirent struct to the current offset
- offs^ += cast(int) dirent.reclen
- return dirent, true
+ // Stopped iterating when there's no space left
+ if offs^ >= len(buf) {
+ return nil, false
+ }
+ // Retrieve dirent form the current offset
+ dirent := cast(^Dirent) &buf[offs^]
+ // Add the stride of dirent struct to the current offset
+ offs^ += cast(int) dirent.reclen
+ return dirent, true
}
/// Obtain the name of dirent as a string
/// The lifetime of the string is bound to the lifetime of the provided dirent structure
dirent_name :: proc "contextless" (dirent: ^Dirent) -> string #no_bounds_check {
- str := transmute([^]u8) &dirent.name
- // Note(flysand): The string size calculated above applies only to the ideal case
- // we subtract 1 byte from the string size, because a null terminator is guaranteed
- // to be present. But! That said, the dirents are aligned to 8 bytes and the padding
- // between the null terminator and the start of the next struct may be not initialized
- // which means we also have to scan these garbage bytes.
- str_size := (cast(int) dirent.reclen) - 1 - cast(int) offset_of(Dirent, name)
- // This skips *only* over the garbage, since if we're not garbage we're at nul terminator,
- // which skips this loop
- for str[str_size] != 0 {
- str_size -= 1
- }
- for str[str_size-1] == 0 {
- str_size -= 1
- }
- // Oh yeah btw i could also just `repne scasb` this thing, but honestly I started doing
- // it the painful way, might as well finish doing it that way
- return string(str[:str_size])
+ str := transmute([^]u8) &dirent.name
+ // Note(flysand): The string size calculated above applies only to the ideal case
+ // we subtract 1 byte from the string size, because a null terminator is guaranteed
+ // to be present. But! That said, the dirents are aligned to 8 bytes and the padding
+ // between the null terminator and the start of the next struct may be not initialized
+ // which means we also have to scan these garbage bytes.
+ str_size := (cast(int) dirent.reclen) - 1 - cast(int) offset_of(Dirent, name)
+ // This skips *only* over the garbage, since if we're not garbage we're at nul terminator,
+ // which skips this loop
+ for str[str_size] != 0 {
+ str_size -= 1
+ }
+ for str[str_size-1] == 0 {
+ str_size -= 1
+ }
+ // Oh yeah btw i could also just `repne scasb` this thing, but honestly I started doing
+ // it the painful way, might as well finish doing it that way
+ return string(str[:str_size])
}
/// Constructor for the `futex_op` argument of a FUTEX_WAKE_OP call
futex_op :: proc "contextless" (arg_op: Futex_Arg_Op, cmp_op: Futex_Cmp_Op, op_arg: u32, cmp_arg: u32) -> u32 {
- arg_op := cast(u32) arg_op
- cmp_op := cast(u32) cmp_op
- return (arg_op << 28) | (cmp_op << 24) | ((op_arg & 0xfff) << 12) | (cmp_arg & 0xfff)
+ arg_op := cast(u32) arg_op
+ cmp_op := cast(u32) cmp_op
+ return (arg_op << 28) | (cmp_op << 24) | ((op_arg & 0xfff) << 12) | (cmp_arg & 0xfff)
}
/// Helper function for constructing the config for caches
perf_cache_config :: #force_inline proc "contextless" (id: Perf_Hardware_Cache_Id,
- op: Perf_Hardware_Cache_Op_Id,
- res: Perf_Hardware_Cache_Result_Id) -> u64
+ op: Perf_Hardware_Cache_Op_Id,
+ res: Perf_Hardware_Cache_Result_Id) -> u64
{
- return u64(id) | (u64(op) << 8) | (u64(res) << 16)
+ return u64(id) | (u64(op) << 8) | (u64(res) << 16)
} \ No newline at end of file