diff options
| author | flysand7 <yyakut.ac@gmail.com> | 2023-10-27 11:30:13 +1100 |
|---|---|---|
| committer | flysand7 <yyakut.ac@gmail.com> | 2023-10-27 11:30:13 +1100 |
| commit | bbd4c1054e18f18e934828b5160efce076027d1e (patch) | |
| tree | ec668882e371e67093792638be0ff61f1c0e44ad /core/sys | |
| parent | 4d65b1ab9cb86bcbbfb0e5b26e3552f6f3582004 (diff) | |
convert spaces to tabs
Diffstat (limited to 'core/sys')
| -rw-r--r-- | core/sys/linux/bits.odin | 2198 | ||||
| -rw-r--r-- | core/sys/linux/constants.odin | 24 | ||||
| -rw-r--r-- | core/sys/linux/helpers.odin | 90 | ||||
| -rw-r--r-- | core/sys/linux/sys.odin | 1308 | ||||
| -rw-r--r-- | core/sys/linux/types.odin | 632 | ||||
| -rw-r--r-- | core/sys/linux/wrappers.odin | 84 |
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 |