bits.odin 40 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841
  1. package linux
  2. /*
  3. Represents an error returned by most of syscalls
  4. */
  5. Errno :: enum i32 {
  6. NONE = 0,
  7. // Errno-base
  8. EPERM = 1,
  9. ENOENT = 2,
  10. ESRCH = 3,
  11. EINTR = 4,
  12. EIO = 5,
  13. ENXIO = 6,
  14. E2BIG = 7,
  15. ENOEXEC = 8,
  16. EBADF = 9,
  17. ECHILD = 10,
  18. EAGAIN = 11,
  19. ENOMEM = 12,
  20. EACCES = 13,
  21. EFAULT = 14,
  22. ENOTBLK = 15,
  23. EBUSY = 16,
  24. EEXIST = 17,
  25. EXDEV = 18,
  26. ENODEV = 19,
  27. ENOTDIR = 20,
  28. EISDIR = 21,
  29. EINVAL = 22,
  30. ENFILE = 23,
  31. EMFILE = 24,
  32. ENOTTY = 25,
  33. ETXTBSY = 26,
  34. EFBIG = 27,
  35. ENOSPC = 28,
  36. ESPIPE = 29,
  37. EROFS = 30,
  38. EMLINK = 31,
  39. EPIPE = 32,
  40. EDOM = 33,
  41. ERANGE = 34,
  42. // Linux
  43. EDEADLK = 35,
  44. ENAMETOOLONG = 36,
  45. ENOLCK = 37,
  46. ENOSYS = 38,
  47. ENOTEMPTY = 39,
  48. ELOOP = 40,
  49. EUNKNOWN_41 = 41,
  50. ENOMSG = 42,
  51. EIDRM = 43,
  52. ECHRNG = 44,
  53. EL2NSYNC = 45,
  54. EL3HLT = 46,
  55. EL3RST = 47,
  56. ELNRNG = 48,
  57. EUNATCH = 49,
  58. ENOCSI = 50,
  59. EL2HLT = 51,
  60. EBADE = 52,
  61. EBADR = 53,
  62. EXFULL = 54,
  63. ENOANO = 55,
  64. EBADRQC = 56,
  65. EBADSLT = 57,
  66. EUNKNOWN_58 = 58,
  67. EBFONT = 59,
  68. ENOSTR = 60,
  69. ENODATA = 61,
  70. ETIME = 62,
  71. ENOSR = 63,
  72. ENONET = 64,
  73. ENOPKG = 65,
  74. EREMOTE = 66,
  75. ENOLINK = 67,
  76. EADV = 68,
  77. ESRMNT = 69,
  78. ECOMM = 70,
  79. EPROTO = 71,
  80. EMULTIHOP = 72,
  81. EDOTDOT = 73,
  82. EBADMSG = 74,
  83. EOVERFLOW = 75,
  84. ENOTUNIQ = 76,
  85. EBADFD = 77,
  86. EREMCHG = 78,
  87. ELIBACC = 79,
  88. ELIBBAD = 80,
  89. ELIBSCN = 81,
  90. ELIBMAX = 82,
  91. ELIBEXEC = 83,
  92. EILSEQ = 84,
  93. ERESTART = 85,
  94. ESTRPIPE = 86,
  95. EUSERS = 87,
  96. ENOTSOCK = 88,
  97. EDESTADDRREQ = 89,
  98. EMSGSIZE = 90,
  99. EPROTOTYPE = 91,
  100. ENOPROTOOPT = 92,
  101. EPROTONOSUPPORT = 93,
  102. ESOCKTNOSUPPORT = 94,
  103. EOPNOTSUPP = 95,
  104. EPFNOSUPPORT = 96,
  105. EAFNOSUPPORT = 97,
  106. EADDRINUSE = 98,
  107. EADDRNOTAVAIL = 99,
  108. ENETDOWN = 100,
  109. ENETUNREACH = 101,
  110. ENETRESET = 102,
  111. ECONNABORTED = 103,
  112. ECONNRESET = 104,
  113. ENOBUFS = 105,
  114. EISCONN = 106,
  115. ENOTCONN = 107,
  116. ESHUTDOWN = 108,
  117. ETOOMANYREFS = 109,
  118. ETIMEDOUT = 110,
  119. ECONNREFUSED = 111,
  120. EHOSTDOWN = 112,
  121. EHOSTUNREACH = 113,
  122. EALREADY = 114,
  123. EINPROGRESS = 115,
  124. ESTALE = 116,
  125. EUCLEAN = 117,
  126. ENOTNAM = 118,
  127. ENAVAIL = 119,
  128. EISNAM = 120,
  129. EREMOTEIO = 121,
  130. EDQUOT = 122,
  131. ENOMEDIUM = 123,
  132. EMEDIUMTYPE = 124,
  133. ECANCELED = 125,
  134. ENOKEY = 126,
  135. EKEYEXPIRED = 127,
  136. EKEYREVOKED = 128,
  137. EKEYREJECTED = 129,
  138. EOWNERDEAD = 130,
  139. ENOTRECOVERABLE = 131,
  140. ERFKILL = 132,
  141. EHWPOISON = 133,
  142. // Errno aliases
  143. EWOULDBLOCK = EAGAIN,
  144. EDEADLOCK = EDEADLK,
  145. }
  146. /*
  147. Bits for Open_Flags.
  148. RDONLY flag is not present, because it has the value of 0, i.e. it is the
  149. default, unless WRONLY or RDWR is specified.
  150. */
  151. when ODIN_ARCH != .arm64 && ODIN_ARCH != .arm32 {
  152. Open_Flags_Bits :: enum {
  153. WRONLY = 0,
  154. RDWR = 1,
  155. CREAT = 6,
  156. EXCL = 7,
  157. NOCTTY = 8,
  158. TRUNC = 9,
  159. APPEND = 10,
  160. NONBLOCK = 11,
  161. DSYNC = 12,
  162. ASYNC = 13,
  163. DIRECT = 14,
  164. LARGEFILE = 15,
  165. DIRECTORY = 16,
  166. NOFOLLOW = 17,
  167. NOATIME = 18,
  168. CLOEXEC = 19,
  169. PATH = 21,
  170. }
  171. // https://github.com/torvalds/linux/blob/7367539ad4b0f8f9b396baf02110962333719a48/include/uapi/asm-generic/fcntl.h#L19
  172. #assert(1 << uint(Open_Flags_Bits.WRONLY) == 0o0000000_1)
  173. #assert(1 << uint(Open_Flags_Bits.RDWR) == 0o0000000_2)
  174. #assert(1 << uint(Open_Flags_Bits.CREAT) == 0o00000_100)
  175. #assert(1 << uint(Open_Flags_Bits.EXCL) == 0o00000_200)
  176. #assert(1 << uint(Open_Flags_Bits.NOCTTY) == 0o00000_400)
  177. #assert(1 << uint(Open_Flags_Bits.TRUNC) == 0o0000_1000)
  178. #assert(1 << uint(Open_Flags_Bits.APPEND) == 0o0000_2000)
  179. #assert(1 << uint(Open_Flags_Bits.NONBLOCK) == 0o0000_4000)
  180. #assert(1 << uint(Open_Flags_Bits.DSYNC) == 0o000_10000)
  181. #assert(1 << uint(Open_Flags_Bits.ASYNC) == 0o000_20000)
  182. #assert(1 << uint(Open_Flags_Bits.DIRECT) == 0o000_40000)
  183. #assert(1 << uint(Open_Flags_Bits.LARGEFILE) == 0o00_100000)
  184. #assert(1 << uint(Open_Flags_Bits.DIRECTORY) == 0o00_200000)
  185. #assert(1 << uint(Open_Flags_Bits.NOFOLLOW) == 0o00_400000)
  186. #assert(1 << uint(Open_Flags_Bits.NOATIME) == 0o0_1000000)
  187. #assert(1 << uint(Open_Flags_Bits.CLOEXEC) == 0o0_2000000)
  188. #assert(1 << uint(Open_Flags_Bits.PATH) == 0o_10000000)
  189. } else {
  190. Open_Flags_Bits :: enum {
  191. WRONLY = 0,
  192. RDWR = 1,
  193. CREAT = 6,
  194. EXCL = 7,
  195. NOCTTY = 8,
  196. TRUNC = 9,
  197. APPEND = 10,
  198. NONBLOCK = 11,
  199. DSYNC = 12,
  200. ASYNC = 13,
  201. DIRECTORY = 14,
  202. NOFOLLOW = 15,
  203. DIRECT = 16,
  204. LARGEFILE = 17,
  205. NOATIME = 18,
  206. CLOEXEC = 19,
  207. PATH = 21,
  208. }
  209. }
  210. /*
  211. Bits for FD_Flags bitset
  212. */
  213. FD_Flags_Bits :: enum {
  214. SYMLINK_NOFOLLOW = 8,
  215. REMOVEDIR = 9,
  216. EACCESS = 9,
  217. SYMLINK_FOLLOW = 10,
  218. NO_AUTOMOUNT = 11,
  219. EMPTY_PATH = 12,
  220. STATX_FORCE_SYNC = 13,
  221. STATX_DONT_SYNC = 14,
  222. RECURSIVE = 15,
  223. }
  224. /*
  225. The bits for the Mode bitset.
  226. */
  227. Mode_Bits :: enum {
  228. IXOTH = 0, // 0o0000001
  229. IWOTH = 1, // 0o0000002
  230. IROTH = 2, // 0o0000004
  231. IXGRP = 3, // 0o0000010
  232. IWGRP = 4, // 0o0000020
  233. IRGRP = 5, // 0o0000040
  234. IXUSR = 6, // 0o0000100
  235. IWUSR = 7, // 0o0000200
  236. IRUSR = 8, // 0o0000400
  237. ISVTX = 9, // 0o0001000
  238. ISGID = 10, // 0o0002000
  239. ISUID = 11, // 0o0004000
  240. IFIFO = 12, // 0o0010000
  241. IFCHR = 13, // 0o0020000
  242. IFDIR = 14, // 0o0040000
  243. IFREG = 15, // 0o0100000
  244. }
  245. /*
  246. The bits used by the Statx_Mask bitset
  247. */
  248. Statx_Mask_Bits :: enum {
  249. TYPE = 0,
  250. MODE = 1,
  251. NLINK = 2,
  252. UID = 3,
  253. GID = 4,
  254. ATIME = 5,
  255. MTIME = 6,
  256. CTIME = 7,
  257. INO = 8,
  258. SIZE = 9,
  259. BLOCKS = 10,
  260. BTIME = 11,
  261. MNT_ID = 12,
  262. DIOALIGN = 13,
  263. }
  264. /*
  265. Bits found in Statx_Attr bitset
  266. You should not use these directly
  267. */
  268. Statx_Attr_Bits :: enum {
  269. COMPRESSED = 2, // 0x00000004
  270. IMMUTABLE = 4, // 0x00000010
  271. APPEND = 5, // 0x00000020
  272. NODUMP = 6, // 0x00000040
  273. ENCRYPTED = 11, // 0x00000800
  274. AUTOMOUNT = 12, // 0x00001000
  275. MOUNT_ROOT = 13, // 0x00002000
  276. VERITY = 20, // 0x00100000
  277. DAX = 21, // 0x00200000
  278. }
  279. /*
  280. Magic bits for filesystems returned by Stat_FS
  281. */
  282. FS_Magic :: enum u32 {
  283. ADFS_SUPER_MAGIC = 0xadf5,
  284. AFFS_SUPER_MAGIC = 0xadff,
  285. AFS_SUPER_MAGIC = 0x5346414f,
  286. ANON_INODE_FS_MAGIC = 0x09041934,
  287. AUTOFS_SUPER_MAGIC = 0x0187,
  288. BDEVFS_MAGIC = 0x62646576,
  289. BEFS_SUPER_MAGIC = 0x42465331,
  290. BFS_MAGIC = 0x1badface,
  291. BINFMTFS_MAGIC = 0x42494e4d,
  292. BPF_FS_MAGIC = 0xcafe4a11,
  293. BTRFS_SUPER_MAGIC = 0x9123683e,
  294. BTRFS_TEST_MAGIC = 0x73727279,
  295. CGROUP_SUPER_MAGIC = 0x27e0eb,
  296. CGROUP2_SUPER_MAGIC = 0x63677270,
  297. CIFS_MAGIC_NUMBER = 0xff534d42,
  298. CODA_SUPER_MAGIC = 0x73757245,
  299. COH_SUPER_MAGIC = 0x012ff7b7,
  300. CRAMFS_MAGIC = 0x28cd3d45,
  301. DEBUGFS_MAGIC = 0x64626720,
  302. DEVFS_SUPER_MAGIC = 0x1373,
  303. DEVPTS_SUPER_MAGIC = 0x1cd1,
  304. ECRYPTFS_SUPER_MAGIC = 0xf15f,
  305. EFIVARFS_MAGIC = 0xde5e81e4,
  306. EFS_SUPER_MAGIC = 0x00414a53,
  307. EXT_SUPER_MAGIC = 0x137d,
  308. EXT2_OLD_SUPER_MAGIC = 0xef51,
  309. EXT2_SUPER_MAGIC = 0xef53,
  310. EXT3_SUPER_MAGIC = 0xef53,
  311. EXT4_SUPER_MAGIC = 0xef53,
  312. F2FS_SUPER_MAGIC = 0xf2f52010,
  313. FUSE_SUPER_MAGIC = 0x65735546,
  314. FUTEXFS_SUPER_MAGIC = 0xbad1dea,
  315. HFS_SUPER_MAGIC = 0x4244,
  316. HOSTFS_SUPER_MAGIC = 0x00c0ffee,
  317. HPFS_SUPER_MAGIC = 0xf995e849,
  318. HUGETLBFS_MAGIC = 0x958458f6,
  319. ISOFS_SUPER_MAGIC = 0x9660,
  320. JFFS2_SUPER_MAGIC = 0x72b6,
  321. JFS_SUPER_MAGIC = 0x3153464a,
  322. MINIX_SUPER_MAGIC = 0x137f,
  323. MINIX_SUPER_MAGIC2 = 0x138f,
  324. MINIX2_SUPER_MAGIC = 0x2468,
  325. MINIX2_SUPER_MAGIC2 = 0x2478,
  326. MINIX3_SUPER_MAGIC = 0x4d5a,
  327. MQUEUE_MAGIC = 0x19800202,
  328. MSDOS_SUPER_MAGIC = 0x4d44,
  329. MTD_INODE_FS_MAGIC = 0x11307854,
  330. NCP_SUPER_MAGIC = 0x564c,
  331. NFS_SUPER_MAGIC = 0x6969,
  332. NILFS_SUPER_MAGIC = 0x3434,
  333. NSFS_MAGIC = 0x6e736673,
  334. NTFS_SB_MAGIC = 0x5346544e,
  335. OCFS2_SUPER_MAGIC = 0x7461636f,
  336. OPENPROM_SUPER_MAGIC = 0x9fa1,
  337. OVERLAYFS_SUPER_MAGIC = 0x794c7630,
  338. PIPEFS_MAGIC = 0x50495045,
  339. PROC_SUPER_MAGIC = 0x9fa0,
  340. PSTOREFS_MAGIC = 0x6165676c,
  341. QNX4_SUPER_MAGIC = 0x002f,
  342. QNX6_SUPER_MAGIC = 0x68191122,
  343. RAMFS_MAGIC = 0x858458f6,
  344. REISERFS_SUPER_MAGIC = 0x52654973,
  345. ROMFS_MAGIC = 0x7275,
  346. SECURITYFS_MAGIC = 0x73636673,
  347. SELINUX_MAGIC = 0xf97cff8c,
  348. SMACK_MAGIC = 0x43415d53,
  349. SMB_SUPER_MAGIC = 0x517b,
  350. SMB2_MAGIC_NUMBER = 0xfe534d42,
  351. SOCKFS_MAGIC = 0x534f434b,
  352. SQUASHFS_MAGIC = 0x73717368,
  353. SYSFS_MAGIC = 0x62656572,
  354. SYSV2_SUPER_MAGIC = 0x012ff7b6,
  355. SYSV4_SUPER_MAGIC = 0x012ff7b5,
  356. TMPFS_MAGIC = 0x01021994,
  357. TRACEFS_MAGIC = 0x74726163,
  358. UDF_SUPER_MAGIC = 0x15013346,
  359. UFS_MAGIC = 0x00011954,
  360. USBDEVICE_SUPER_MAGIC = 0x9fa2,
  361. V9FS_MAGIC = 0x01021997,
  362. VXFS_SUPER_MAGIC = 0xa501fcf5,
  363. XENFS_SUPER_MAGIC = 0xabba1974,
  364. XENIX_SUPER_MAGIC = 0x012ff7b4,
  365. XFS_SUPER_MAGIC = 0x58465342,
  366. _XIAFS_SUPER_MAGIC = 0x012fd16d,
  367. }
  368. /*
  369. Bits for FS_Flags bitset
  370. */
  371. FS_Flags_Bits :: enum {
  372. RDONLY = 0,
  373. NOSUID = 1,
  374. NODEV = 2,
  375. NOEXEC = 3,
  376. SYNCHRONOUS = 4,
  377. VALID = 5,
  378. MANDLOCK = 6,
  379. NOATIME = 10,
  380. NODIRATIME = 11,
  381. RELATIME = 12,
  382. NOSYMFOLLOW = 13,
  383. }
  384. Seek_Whence :: enum i16 {
  385. SET = 0,
  386. CUR = 1,
  387. END = 2,
  388. DATA = 3,
  389. HOLE = 4,
  390. }
  391. /*
  392. Bits for Close_Range_Flags
  393. */
  394. Close_Range_Flags_Bits :: enum {
  395. CLOEXEC = 2,
  396. UNSHARE = 1,
  397. }
  398. /*
  399. Bits for Rename_Flags
  400. */
  401. Rename_Flags_Bits :: enum {
  402. EXCHANGE = 1,
  403. NOREPLACE = 0,
  404. WHITEOUT = 2,
  405. }
  406. /*
  407. Type of the file in a directory entry
  408. */
  409. Dirent_Type :: enum u8 {
  410. UNKNOWN = 0,
  411. FIFO = 1,
  412. CHR = 2,
  413. DIR = 4,
  414. BLK = 6,
  415. REG = 8,
  416. LNK = 10,
  417. SOCK = 12,
  418. WHT = 14,
  419. }
  420. /*
  421. Type of a lock for fcntl(2)
  422. */
  423. FLock_Type :: enum i16 {
  424. RDLCK = 0,
  425. WRLCK = 1,
  426. UNLCK = 2,
  427. }
  428. /*
  429. Bits for FD_Notifications
  430. */
  431. FD_Notifications_Bits :: enum {
  432. ACCESS = 0,
  433. MODIFY = 1,
  434. CREATE = 2,
  435. DELETE = 3,
  436. RENAME = 4,
  437. ATTRIB = 5,
  438. MULTISHOT = 31,
  439. }
  440. /*
  441. Bits for seal
  442. */
  443. Seal_Bits :: enum {
  444. SEAL = 0,
  445. SHRINK = 1,
  446. GROW = 2,
  447. WRITE = 3,
  448. FUTURE_WRITE = 4,
  449. }
  450. RW_Hint :: enum u64 {
  451. WRITE_LIFE_NOT_SET = 0,
  452. WRITE_LIFE_NONE = 1,
  453. WRITE_LIFE_SHORT = 2,
  454. WRITE_LIFE_MEDIUM = 3,
  455. WRITE_LIFE_LONG = 4,
  456. WRITE_LIFE_EXTREME = 5,
  457. }
  458. FD_Lease :: enum {
  459. RDLCK = 0,
  460. WRLCK = 1,
  461. UNLCK = 2,
  462. }
  463. /*
  464. Kind of owner for FD_Owner
  465. */
  466. F_Owner_Type :: enum i32 {
  467. OWNER_TID = 0,
  468. OWNER_PID = 1,
  469. OWNER_PGRP = 2,
  470. }
  471. /*
  472. Command for fcntl(2)
  473. */
  474. FCntl_Command :: enum {
  475. DUPFD = 0,
  476. GETFD = 1,
  477. SETFD = 2,
  478. GETFL = 3,
  479. SETFL = 4,
  480. GETLK = 5,
  481. SETLK = 6,
  482. SETLKW = 7,
  483. SETOWN = 8,
  484. GETOWN = 9,
  485. SETSIG = 10,
  486. GETSIG = 11,
  487. SETOWN_EX = 15,
  488. GETOWN_EX = 16,
  489. // OFD_GETLK = 36,
  490. // OFD_SETLK = 37,
  491. // OFD_SETLKW = 38,
  492. SETLEASE = 1024,
  493. GETLEASE = 1025,
  494. NOTIFY = 1026,
  495. DUPFD_CLOEXEC = 1030,
  496. SETPIPE_SZ = 1031,
  497. GETPIPE_SZ = 1032,
  498. ADD_SEALS = 1033,
  499. GET_SEALS = 1034,
  500. GET_RW_HINT = 1035,
  501. SET_RW_HINT = 1036,
  502. GET_FILE_RW_HINT = 1037,
  503. SET_FILE_RW_HINT = 1038,
  504. // F_OK = 0,
  505. }
  506. Fd_Poll_Events_Bits :: enum {
  507. IN = 0,
  508. PRI = 1,
  509. OUT = 2,
  510. ERR = 3,
  511. HUP = 4,
  512. NVAL = 5,
  513. RDNORM = 6,
  514. RDBAND = 7,
  515. WRNORM = 8,
  516. WRBAND = 9,
  517. MSG = 10,
  518. REMOVE = 12,
  519. RDHUP = 13,
  520. }
  521. /*
  522. Bits for Mem_Protection bitfield
  523. */
  524. Mem_Protection_Bits :: enum{
  525. READ = 0,
  526. WRITE = 1,
  527. EXEC = 2,
  528. SEM = 3,
  529. // platform-specific section start
  530. ARM64_BTI = 4,
  531. ARM64_MTE = 5,
  532. // platform-specific section end
  533. GROWSDOWN = 24,
  534. GROWSUP = 25,
  535. }
  536. /*
  537. Bits for Map_Flags
  538. */
  539. Map_Flags_Bits :: enum {
  540. SHARED = 0,
  541. PRIVATE = 1,
  542. SHARED_VALIDATE = 2,
  543. FIXED = 4,
  544. ANONYMOUS = 5,
  545. // platform-dependent section start
  546. X86_32BIT = 6,
  547. X86_ABOVE4G = 7,
  548. // platform-dependent section end
  549. GROWSDOWN = 8,
  550. DENYWRITE = 11,
  551. EXECUTABLE = 12,
  552. LOCKED = 13,
  553. NORESERVE = 14,
  554. POPULATE = 15,
  555. NONBLOCK = 16,
  556. STACK = 17,
  557. HUGETLB = 18,
  558. SYNC = 19,
  559. FIXED_NOREPLACE = 20,
  560. UNINITIALIZED = 26,
  561. }
  562. /*
  563. Bits for MLock_Flags
  564. */
  565. MLock_Flags_Bits :: enum {
  566. ONFAULT = 0,
  567. }
  568. /*
  569. Bits for MSync_Flags
  570. */
  571. MSync_Flags_Bits :: enum {
  572. ASYNC = 0,
  573. INVALIDATE = 1,
  574. SYNC = 2,
  575. }
  576. /*
  577. Argument for madvice(2)
  578. */
  579. MAdvice :: enum {
  580. NORMAL = 0,
  581. RANDOM = 1,
  582. SEQUENTIAL = 2,
  583. WILLNEED = 3,
  584. DONTNEED = 4,
  585. FREE = 8,
  586. REMOVE = 9,
  587. DONTFORK = 10,
  588. DOFORK = 11,
  589. MERGEABLE = 12,
  590. UNMERGEABLE = 13,
  591. HUGEPAGE = 14,
  592. NOHUGEPAGE = 15,
  593. DONTDUMP = 16,
  594. DODUMP = 17,
  595. WIPEONFORK = 18,
  596. KEEPONFORK = 19,
  597. COLD = 20,
  598. PAGEOUT = 21,
  599. POPULATE_READ = 22,
  600. POPULATE_WRITE = 23,
  601. DONTNEED_LOCKED = 24,
  602. COLLAPSE = 25,
  603. HWPOISON = 100,
  604. SOFT_OFFLINE = 101,
  605. }
  606. /*
  607. Bits for PKey_Access_Rights
  608. */
  609. PKey_Access_Bits :: enum {
  610. DISABLE_ACCESS = 0,
  611. DISABLE_WRITE = 2,
  612. }
  613. /*
  614. Bits for MRemap_Flags
  615. */
  616. MRemap_Flags_Bits :: enum {
  617. MAYMOVE = 0,
  618. FIXED = 1,
  619. DONTUNMAP = 2,
  620. }
  621. /*
  622. Bits for Get_Random_Flags
  623. */
  624. Get_Random_Flags_Bits :: enum {
  625. RANDOM = 0,
  626. NONBLOCK = 1,
  627. INSECURE = 2,
  628. }
  629. /*
  630. Bits for Perf_Flags
  631. */
  632. Perf_Flags_Bits :: enum {
  633. FD_NO_GROUP = 0,
  634. FD_OUTPUT = 1,
  635. PID_CGROUP = 2,
  636. FD_CLOEXEC = 3,
  637. }
  638. /*
  639. Union tag for Perf_Event_Attr struct
  640. */
  641. Perf_Event_Type :: enum u32 {
  642. HARDWARE = 0,
  643. SOFTWARE = 1,
  644. TRACEPOINT = 2,
  645. HW_CACHE = 3,
  646. RAW = 4,
  647. BREAKPOINT = 5,
  648. }
  649. Perf_Event_Flags_Bits :: enum u64 {
  650. Disabled = 0,
  651. Inherit = 1,
  652. Pinned = 2,
  653. Exclusive = 3,
  654. Exclude_User = 4,
  655. Exclude_Kernel = 5,
  656. Exclude_HV = 6,
  657. Exclude_Idle = 7,
  658. Mmap = 8,
  659. Comm = 9,
  660. Freq = 10,
  661. Inherit_Stat = 11,
  662. Enable_On_Exec = 12,
  663. Task = 13,
  664. Watermark = 14,
  665. Precise_IP_0 = 15,
  666. Precise_IP_1 = 16,
  667. Mmap_Data = 17,
  668. Sample_Id_All = 18,
  669. Exclude_Host = 19,
  670. Exclude_Guest = 20,
  671. Exclude_Callchain_Kernel = 21,
  672. Exclude_Callchain_User = 22,
  673. Mmap2 = 23,
  674. Comm_Exec = 24,
  675. Use_Clockid = 25,
  676. Context_Switch = 26,
  677. Write_Backward = 27,
  678. Namespaces = 28,
  679. KSymbol = 29,
  680. BPF_Event = 30,
  681. Aux_Output = 31,
  682. CGroup = 32,
  683. Text_Poke = 33,
  684. Build_Id = 34,
  685. Inherit_Thread = 35,
  686. Remove_On_Exec = 36,
  687. Sigtrap = 37,
  688. }
  689. Perf_Cap_Flags_Bits :: enum u64 {
  690. Bit0 = 0,
  691. Bit0_Is_Deprecated = 1,
  692. User_Rdpmc = 2,
  693. User_Time = 3,
  694. User_Time_Zero = 4,
  695. User_Time_Short = 5,
  696. }
  697. /*
  698. Specifies the type of the hardware event that you want to get info about
  699. */
  700. Perf_Hardware_Id :: enum u64 {
  701. CPU_CYCLES = 0,
  702. INSTRUCTIONS = 1,
  703. CACHE_REFERENCES = 2,
  704. CACHE_MISSES = 3,
  705. BRANCH_INSTRUCTIONS = 4,
  706. BRANCH_MISSES = 5,
  707. BUS_CYCLES = 6,
  708. STALLED_CYCLES_FRONTEND = 7,
  709. STALLED_CYCLES_BACKEND = 8,
  710. REF_CPU_CYCLES = 9,
  711. }
  712. /*
  713. Specifies the cache for the particular cache event that you want to get info about
  714. */
  715. Perf_Hardware_Cache_Id :: enum u64 {
  716. L1D = 0,
  717. L1I = 1,
  718. LL = 2,
  719. DTLB = 3,
  720. ITLB = 4,
  721. BPU = 5,
  722. NODE = 6,
  723. }
  724. /*
  725. Specifies the cache op that you want to get info about
  726. */
  727. Perf_Hardware_Cache_Op_Id :: enum u64 {
  728. READ = 0,
  729. WRITE = 1,
  730. PREFETCH = 2,
  731. }
  732. /*
  733. Specifies the cache operation result that you want to get info about
  734. */
  735. Perf_Hardware_Cache_Result_Id :: enum u64 {
  736. ACCESS = 0,
  737. MISS = 1,
  738. }
  739. /*
  740. Specifies the particular software event that you want to get info about
  741. */
  742. Perf_Software_Id :: enum u64 {
  743. CPU_CLOCK = 0,
  744. TASK_CLOCK = 1,
  745. PAGE_FAULTS = 2,
  746. CONTEXT_SWITCHES = 3,
  747. CPU_MIGRATIONS = 4,
  748. PAGE_FAULTS_MIN = 5,
  749. PAGE_FAULTS_MAJ = 6,
  750. ALIGNMENT_FAULTS = 7,
  751. EMULATION_FAULTS = 8,
  752. DUMMY = 9,
  753. BPF_OUTPUT = 10,
  754. CGROUP_SWITCHES = 11,
  755. }
  756. /*
  757. Specifies which values to include in the sample
  758. */
  759. Perf_Event_Sample_Type_Bits :: enum {
  760. IP = 0,
  761. TID = 1,
  762. TIME = 2,
  763. ADDR = 3,
  764. READ = 4,
  765. CALLCHAIN = 5,
  766. ID = 6,
  767. CPU = 7,
  768. PERIOD = 8,
  769. STREAM_ID = 9,
  770. RAW = 10,
  771. BRANCH_STACK = 11,
  772. REGS_USER = 12,
  773. STACK_USER = 13,
  774. WEIGHT = 14,
  775. DATA_SRC = 15,
  776. IDENTIFIER = 16,
  777. TRANSACTION = 17,
  778. REGS_INTR = 18,
  779. PHYS_ADDR = 19,
  780. AUX = 20,
  781. CGROUP = 21,
  782. DATA_PAGE_SIZE = 22,
  783. CODE_PAGE_SIZE = 23,
  784. WEIGHT_STRUCT = 24,
  785. }
  786. /// Describes field sets to include in mmaped page
  787. Perf_Read_Format_Bits :: enum {
  788. TOTAL_TIME_ENABLED = 0,
  789. TOTAL_TIME_RUNNING = 1,
  790. ID = 2,
  791. GROUP = 3,
  792. LOST = 4,
  793. }
  794. /*
  795. Chooses the breakpoint type
  796. */
  797. Hardware_Breakpoint_Type :: enum u32 {
  798. EMPTY = 0,
  799. R = 1,
  800. W = 2,
  801. X = 4,
  802. RW = R | W,
  803. INVALID = RW | X,
  804. }
  805. /*
  806. Bits for Branch_Sample_Type
  807. */
  808. Branch_Sample_Type_Bits :: enum {
  809. USER = 0,
  810. KERNEL = 1,
  811. HV = 2,
  812. ANY = 3,
  813. ANY_CALL = 4,
  814. ANY_RETURN = 5,
  815. IND_CALL = 6,
  816. ABORT_TX = 7,
  817. IN_TX = 8,
  818. NO_TX = 9,
  819. COND = 10,
  820. CALL_STACK = 11,
  821. IND_JUMP = 12,
  822. CALL = 13,
  823. NO_FLAGS = 14,
  824. NO_CYCLES = 15,
  825. TYPE_SAVE = 16,
  826. HW_INDEX = 17,
  827. PRIV_SAVE = 18,
  828. }
  829. /*
  830. Represent the type of Id
  831. */
  832. Id_Type :: enum uint {
  833. ALL = 0,
  834. PID = 1,
  835. PGID = 2,
  836. PIDFD = 3,
  837. }
  838. /*
  839. Options for wait syscalls
  840. */
  841. Wait_Option :: enum {
  842. WNOHANG = 0,
  843. WUNTRACED = 1,
  844. WSTOPPED = 1,
  845. WEXITED = 2,
  846. WCONTINUED = 3,
  847. WNOWAIT = 24,
  848. // // For processes created using clone
  849. __WNOTHREAD = 29,
  850. __WALL = 30,
  851. __WCLONE = 31,
  852. }
  853. /*
  854. Bits for flags for pidfd
  855. */
  856. Pid_FD_Flags_Bits :: enum {
  857. NONBLOCK = 11,
  858. }
  859. /*
  860. Priority for process, process group, user
  861. */
  862. Priority_Which :: enum i32 {
  863. PROCESS = 0,
  864. PGRP = 1,
  865. USER = 2,
  866. }
  867. Signal :: enum i32 {
  868. // POSIX-defined signals
  869. SIGINT = 2, // Interactive attention signal.
  870. SIGILL = 4, // Illegal instruction.
  871. SIGABRT = 6, // Abnormal termination.
  872. SIGFPE = 8, // Erroneous arithmetic operation.
  873. SIGSEGV = 11, // Invalid access to storage.
  874. SIGTERM = 15, // Termination request.
  875. // Other POSIX signals
  876. SIGHUP = 1, // Hangup.
  877. SIGQUIT = 3, // Quit.
  878. SIGTRAP = 5, // Trace/breakpoint trap.
  879. SIGKILL = 9, // Killed.
  880. SIGPIPE = 13, // Broken pipe.
  881. SIGALRM = 14, // Alarm clock.
  882. // Adjustments needed for most linux systems
  883. SIGSTKFLT = 16, // Stack fault (obsolete).
  884. SIGPWR = 30, // Power failure imminent.
  885. // Historical signals specified by POSIX.
  886. SIGBUS = 7, // Bus error.
  887. SIGSYS = 31, // Bad system call.
  888. // New(er) POSIX signals (1003.1-2008, 1003.1-2013).
  889. SIGURG = 23, // Urgent data is available at a socket.
  890. SIGSTOP = 19, // Stop, unblockable.
  891. SIGTSTP = 20, // Keyboard stop.
  892. SIGCONT = 18, // Continue.
  893. SIGCHLD = 17, // Child terminated or stopped.
  894. SIGTTIN = 21, // Background read from control terminal.
  895. SIGTTOU = 22, // Background write to control terminal.
  896. SIGPOLL = 29, // Pollable event occurred (System V).
  897. SIGXFSZ = 25, // File size limit exceeded.
  898. SIGXCPU = 24, // CPU time limit exceeded.
  899. SIGVTALRM = 26, // Virtual timer expired.
  900. SIGPROF = 27, // Profiling timer expired.
  901. SIGUSR1 = 10, // User-defined signal 1.
  902. SIGUSR2 = 12, // User-defined signal 2.
  903. // Nonstandard signals found in all modern POSIX systems (including both BSD and Linux).
  904. SIGWINCH = 28, // Window size change (4.3 BSD, Sun).
  905. // Archaic names for compatibility.
  906. SIGIO = SIGPOLL, // I/O now possible (4.2 BSD).
  907. SIGIOT = SIGABRT, // IOT instruction, abort() on a PDP-11.
  908. SIGCLD = SIGCHLD, // Old System V name
  909. }
  910. Sig_Mask_Kind :: enum i32 {
  911. SIG_BLOCK = 0,
  912. SIG_UNBLOCK = 1,
  913. SIG_SETMASK = 2,
  914. }
  915. Sig_Stack_Flag :: enum i32 {
  916. DISABLE = 0,
  917. ONSTACK = 1,
  918. AUTODISARM = 31,
  919. }
  920. Sig_Action_Flag :: enum u32 {
  921. NOCLDSTOP = 0,
  922. NOCLDWAIT = 1,
  923. SIGINFO = 2,
  924. UNSUPPORTED = 10,
  925. EXPOSE_TAGBITS = 11,
  926. RESTORER = 26,
  927. ONSTACK = 27,
  928. RESTART = 28,
  929. NODEFER = 30,
  930. RESETHAND = 31,
  931. }
  932. /*
  933. Translation of code in Sig_Info for when signo is SIGCHLD
  934. */
  935. Sig_Child_Code :: enum {
  936. NONE,
  937. EXITED,
  938. KILLED,
  939. DUMPED,
  940. TRAPPED,
  941. STOPPED,
  942. CONTINUED,
  943. }
  944. /*
  945. Type of socket to create
  946. - For TCP you want to use SOCK_STREAM
  947. - For UDP you want to use SOCK_DGRAM
  948. Also see `Protocol`
  949. */
  950. Socket_Type :: enum {
  951. STREAM = 1,
  952. DGRAM = 2,
  953. RAW = 3,
  954. RDM = 4,
  955. SEQPACKET = 5,
  956. DCCP = 6,
  957. PACKET = 10,
  958. }
  959. /*
  960. Bits for Socket_FD_Flags
  961. */
  962. Socket_FD_Flags_Bits :: enum {
  963. NONBLOCK = 11,
  964. CLOEXEC = 19,
  965. }
  966. /*
  967. Protocol family
  968. */
  969. Protocol_Family :: enum u16 {
  970. UNSPEC = 0,
  971. LOCAL = 1,
  972. UNIX = LOCAL,
  973. FILE = LOCAL,
  974. INET = 2,
  975. AX25 = 3,
  976. IPX = 4,
  977. APPLETALK = 5,
  978. NETROM = 6,
  979. BRIDGE = 7,
  980. ATMPVC = 8,
  981. X25 = 9,
  982. INET6 = 10,
  983. ROSE = 11,
  984. DECnet = 12,
  985. NETBEUI = 13,
  986. SECURITY = 14,
  987. KEY = 15,
  988. NETLINK = 16,
  989. ROUTE = NETLINK,
  990. PACKET = 17,
  991. ASH = 18,
  992. ECONET = 19,
  993. ATMSVC = 20,
  994. RDS = 21,
  995. SNA = 22,
  996. IRDA = 23,
  997. PPPOX = 24,
  998. WANPIPE = 25,
  999. LLC = 26,
  1000. IB = 27,
  1001. MPLS = 28,
  1002. CAN = 29,
  1003. TIPC = 30,
  1004. BLUETOOTH = 31,
  1005. IUCV = 32,
  1006. RXRPC = 33,
  1007. ISDN = 34,
  1008. PHONET = 35,
  1009. IEEE802154 = 36,
  1010. CAIF = 37,
  1011. ALG = 38,
  1012. NFC = 39,
  1013. VSOCK = 40,
  1014. KCM = 41,
  1015. QIPCRTR = 42,
  1016. SMC = 43,
  1017. XDP = 44,
  1018. MCTP = 45,
  1019. }
  1020. /*
  1021. The protocol number according to IANA protocol number list
  1022. Full list of protocol numbers:
  1023. https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml
  1024. Supported by the OS protocols can be queried by reading:
  1025. /etc/protocols
  1026. */
  1027. Protocol :: enum {
  1028. HOPOPT = 0,
  1029. ICMP = 1,
  1030. IGMP = 2,
  1031. GGP = 3,
  1032. IPv4 = 4,
  1033. ST = 5,
  1034. TCP = 6,
  1035. CBT = 7,
  1036. EGP = 8,
  1037. IGP = 9,
  1038. BBN_RCC_MON = 10,
  1039. NVP_II = 11,
  1040. PUP = 12,
  1041. EMCON = 14,
  1042. XNET = 15,
  1043. CHAOS = 16,
  1044. UDP = 17,
  1045. MUX = 18,
  1046. DCN_MEAS = 19,
  1047. HMP = 20,
  1048. PRM = 21,
  1049. XNS_IDP = 22,
  1050. TRUNK_1 = 23,
  1051. TRUNK_2 = 24,
  1052. LEAF_1 = 25,
  1053. LEAF_2 = 26,
  1054. RDP = 27,
  1055. IRTP = 28,
  1056. ISO_TP4 = 29,
  1057. NETBLT = 30,
  1058. MFE_NSP = 31,
  1059. MERIT_INP = 32,
  1060. DCCP = 33,
  1061. THREE_PC = 34,
  1062. IDPR = 35,
  1063. XTP = 36,
  1064. DDP = 37,
  1065. IDPR_CMTP = 38,
  1066. TP_PlusPlus = 39,
  1067. IL = 40,
  1068. IPv6 = 41,
  1069. SDRP = 42,
  1070. IPv6_Route = 43,
  1071. IPv6_Frag = 44,
  1072. IDRP = 45,
  1073. RSVP = 46,
  1074. GRE = 47,
  1075. DSR = 48,
  1076. BNA = 49,
  1077. ESP = 50,
  1078. AH = 51,
  1079. I_NLSP = 52,
  1080. NARP = 54,
  1081. MOBILE = 55,
  1082. TLSP = 56,
  1083. SKIP = 57,
  1084. IPv6_ICMP = 58,
  1085. IPv6_NoNxt = 59,
  1086. IPv6_Opts = 60,
  1087. CFTP = 62,
  1088. SAT_EXPAK = 64,
  1089. KRYPTOLAN = 65,
  1090. RVD = 66,
  1091. IPPC = 67,
  1092. SAT_MON = 69,
  1093. VISA = 70,
  1094. IPCV = 71,
  1095. CPNX = 72,
  1096. CPHB = 73,
  1097. WSN = 74,
  1098. PVP = 75,
  1099. BR_SAT_MON = 76,
  1100. SUN_ND = 77,
  1101. WB_MON = 78,
  1102. WB_EXPAK = 79,
  1103. ISO_IP = 80,
  1104. VMTP = 81,
  1105. SECURE_VMTP = 82,
  1106. VINES = 83,
  1107. IPTM = 84,
  1108. NSFNET_IGP = 85,
  1109. DGP = 86,
  1110. TCF = 87,
  1111. EIGRP = 88,
  1112. OSPFIGP = 89,
  1113. Sprite_RPC = 90,
  1114. LARP = 91,
  1115. MTP = 92,
  1116. AX_25 = 93,
  1117. IPIP = 94,
  1118. SCC_SP = 96,
  1119. ETHERIP = 97,
  1120. ENCAP = 98,
  1121. GMTP = 100,
  1122. IFMP = 101,
  1123. PNNI = 102,
  1124. PIM = 103,
  1125. ARIS = 104,
  1126. SCPS = 105,
  1127. QNX = 106,
  1128. A_N = 107,
  1129. IPComp = 108,
  1130. SNP = 109,
  1131. Compaq_Peer = 110,
  1132. IPX_in_IP = 111,
  1133. VRRP = 112,
  1134. PGM = 113,
  1135. L2TP = 115,
  1136. DDX = 116,
  1137. IATP = 117,
  1138. STP = 118,
  1139. SRP = 119,
  1140. UTI = 120,
  1141. SMP = 121,
  1142. PTP = 123,
  1143. FIRE = 125,
  1144. CRTP = 126,
  1145. CRUDP = 127,
  1146. SSCOPMCE = 128,
  1147. IPLT = 129,
  1148. SPS = 130,
  1149. PIPE = 131,
  1150. SCTP = 132,
  1151. FC = 133,
  1152. RSVP_E2E_IGNORE = 134,
  1153. UDPLite = 136,
  1154. MPLS_in_IP = 137,
  1155. manet = 138,
  1156. HIP = 139,
  1157. Shim6 = 140,
  1158. WESP = 141,
  1159. ROHC = 142,
  1160. Ethernet = 143,
  1161. AGGFRAG = 144,
  1162. NSH = 145,
  1163. Reserved = 255,
  1164. }
  1165. /*
  1166. API Level for getsockopt(2)/setsockopt(2)
  1167. */
  1168. Socket_API_Level :: enum {
  1169. // Comes from <bits/socket-constants.h>
  1170. SOCKET = 1,
  1171. // Copy-pasted from protocol numbers
  1172. TCP = 6,
  1173. UDP = 17,
  1174. // Comes from <bits/socket.h>
  1175. RAW = 255,
  1176. DECNET = 261,
  1177. X25 = 262,
  1178. PACKET = 263,
  1179. ATM = 264,
  1180. AAL = 265,
  1181. IRDA = 266,
  1182. NETBEUI = 267,
  1183. LLC = 268,
  1184. DCCP = 269,
  1185. NETLINK = 270,
  1186. TIPC = 271,
  1187. RXRPC = 272,
  1188. PPPOL2TP = 273,
  1189. BLUETOOTH = 274,
  1190. PNPIPE = 275,
  1191. RDS = 276,
  1192. IUCV = 277,
  1193. CAIF = 278,
  1194. ALG = 279,
  1195. NFC = 280,
  1196. KCM = 281,
  1197. TLS = 282,
  1198. XDP = 283,
  1199. MPTCP = 284,
  1200. MCTP = 285,
  1201. SMC = 286,
  1202. }
  1203. /*
  1204. If Socket_API_Level == .SOCKET, these are the options
  1205. you can specify in getsockopt(2)/setsockopt(2)
  1206. */
  1207. Socket_Option :: enum {
  1208. DEBUG = 1,
  1209. REUSEADDR = 2,
  1210. TYPE = 3,
  1211. ERROR = 4,
  1212. DONTROUTE = 5,
  1213. BROADCAST = 6,
  1214. SNDBUF = 7,
  1215. RCVBUF = 8,
  1216. SNDBUFFORCE = 32,
  1217. RCVBUFFORCE = 33,
  1218. KEEPALIVE = 9,
  1219. OOBINLINE = 10,
  1220. NO_CHECK = 11,
  1221. PRIORITY = 12,
  1222. LINGER = 13,
  1223. BSDCOMPAT = 14,
  1224. REUSEPORT = 15,
  1225. PASSCRED = 16,
  1226. PEERCRED = 17,
  1227. RCVLOWAT = 18,
  1228. SNDLOWAT = 19,
  1229. RCVTIMEO_OLD = 20,
  1230. SNDTIMEO_OLD = 21,
  1231. SECURITY_AUTHENTICATION = 22,
  1232. SECURITY_ENCRYPTION_TRANSPORT = 23,
  1233. SECURITY_ENCRYPTION_NETWORK = 24,
  1234. BINDTODEVICE = 25,
  1235. ATTACH_FILTER = 26,
  1236. DETACH_FILTER = 27,
  1237. GET_FILTER = ATTACH_FILTER,
  1238. PEERNAME = 28,
  1239. ACCEPTCONN = 30,
  1240. PEERSEC = 31,
  1241. PASSSEC = 34,
  1242. MARK = 36,
  1243. PROTOCOL = 38,
  1244. DOMAIN = 39,
  1245. RXQ_OVFL = 40,
  1246. WIFI_STATUS = 41,
  1247. PEEK_OFF = 42,
  1248. NOFCS = 43,
  1249. LOCK_FILTER = 44,
  1250. SELECT_ERR_QUEUE = 45,
  1251. BUSY_POLL = 46,
  1252. MAX_PACING_RATE = 47,
  1253. BPF_EXTENSIONS = 48,
  1254. INCOMING_CPU = 49,
  1255. ATTACH_BPF = 50,
  1256. DETACH_BPF = DETACH_FILTER,
  1257. ATTACH_REUSEPORT_CBPF = 51,
  1258. ATTACH_REUSEPORT_EBPF = 52,
  1259. CNX_ADVICE = 53,
  1260. TIMESTAMPING_OPT_STATS = 54,
  1261. MEMINFO = 55,
  1262. INCOMING_NAPI_ID = 56,
  1263. COOKIE = 57,
  1264. TIMESTAMPING_PKTINFO = 58,
  1265. PEERGROUPS = 59,
  1266. ZEROCOPY = 60,
  1267. TXTIME = 61,
  1268. BINDTOIFINDEX = 62,
  1269. TIMESTAMP_OLD = 29,
  1270. TIMESTAMPNS_OLD = 35,
  1271. TIMESTAMPING_OLD = 37,
  1272. TIMESTAMP_NEW = 63,
  1273. TIMESTAMPNS_NEW = 64,
  1274. TIMESTAMPING_NEW = 65,
  1275. RCVTIMEO_NEW = 66,
  1276. SNDTIMEO_NEW = 67,
  1277. DETACH_REUSEPORT_BPF = 68,
  1278. PREFER_BUSY_POLL = 69,
  1279. BUSY_POLL_BUDGET = 70,
  1280. NETNS_COOKIE = 71,
  1281. BUF_LOCK = 72,
  1282. RESERVE_MEM = 73,
  1283. TXREHASH = 74,
  1284. RCVMARK = 75,
  1285. TIMESTAMP = TIMESTAMP_OLD when _SOCKET_OPTION_OLD else TIMESTAMP_NEW,
  1286. TIMESTAMPNS = TIMESTAMPNS_OLD when _SOCKET_OPTION_OLD else TIMESTAMPNS_NEW,
  1287. TIMESTAMPING = TIMESTAMPING_OLD when _SOCKET_OPTION_OLD else TIMESTAMPING_NEW,
  1288. RCVTIMEO = RCVTIMEO_OLD when _SOCKET_OPTION_OLD else RCVTIMEO_NEW,
  1289. SNDTIMEO = SNDTIMEO_OLD when _SOCKET_OPTION_OLD else SNDTIMEO_NEW,
  1290. }
  1291. @(private)
  1292. _SOCKET_OPTION_OLD :: size_of(rawptr) == 8 /* || size_of(time_t) == size_of(__kernel_long_t) */
  1293. Socket_UDP_Option :: enum {
  1294. CORK = 1,
  1295. ENCAP = 100,
  1296. NO_CHECK6_TX = 101,
  1297. NO_CHECK6_RX = 102,
  1298. SEGMENT = 103,
  1299. GRO = 104,
  1300. }
  1301. UPD_Encapsulation :: enum {
  1302. ENCAP_ESPINUDP_NON_IKE = 1,
  1303. ENCAP_ESPINUDP = 2,
  1304. ENCAP_L2TPINUDP = 3,
  1305. ENCAP_GTP0 = 4,
  1306. ENCAP_GTP1U = 5,
  1307. }
  1308. Socket_TCP_Option :: enum {
  1309. NODELAY = 1,
  1310. MAXSEG = 2,
  1311. CORK = 3,
  1312. KEEPIDLE = 4,
  1313. KEEPINTVL = 5,
  1314. KEEPCNT = 6,
  1315. SYNCNT = 7,
  1316. LINGER2 = 8,
  1317. DEFER_ACCEPT = 9,
  1318. WINDOW_CLAMP = 10,
  1319. INFO = 11,
  1320. QUICKACK = 12,
  1321. CONGESTION = 13,
  1322. MD5SIG = 14,
  1323. COOKIE_TRANSACTIONS = 15,
  1324. THIN_LINEAR_TIMEOUTS = 16,
  1325. THIN_DUPACK = 17,
  1326. USER_TIMEOUT = 18,
  1327. REPAIR = 19,
  1328. REPAIR_QUEUE = 20,
  1329. QUEUE_SEQ = 21,
  1330. REPAIR_OPTIONS = 22,
  1331. FASTOPEN = 23,
  1332. TIMESTAMP = 24,
  1333. NOTSENT_LOWAT = 25,
  1334. CC_INFO = 26,
  1335. SAVE_SYN = 27,
  1336. SAVED_SYN = 28,
  1337. REPAIR_WINDOW = 29,
  1338. FASTOPEN_CONNECT = 30,
  1339. ULP = 31,
  1340. MD5SIG_EXT = 32,
  1341. FASTOPEN_KEY = 33,
  1342. FASTOPEN_NO_COOKIE = 34,
  1343. ZEROCOPY_RECEIVE = 35,
  1344. INQ = 36,
  1345. CM_INQ = INQ,
  1346. TX_DELAY = 37,
  1347. }
  1348. /*
  1349. Bits for Socket_Msg
  1350. */
  1351. Socket_Msg_Bits :: enum {
  1352. OOB = 0,
  1353. PEEK = 1,
  1354. DONTROUTE = 2,
  1355. TRYHARD = DONTROUTE,
  1356. CTRUNC = 3,
  1357. PROXY = 4,
  1358. TRUNC = 5,
  1359. DONTWAIT = 6,
  1360. EOR = 7,
  1361. WAITALL = 8,
  1362. FIN = 9,
  1363. SYN = 10,
  1364. CONFIRM = 11,
  1365. RST = 12,
  1366. ERRQUEUE = 13,
  1367. NOSIGNAL = 14,
  1368. MORE = 15,
  1369. WAITFORONE = 16,
  1370. BATCH = 18,
  1371. ZEROCOPY = 22,
  1372. FASTOPEN = 29,
  1373. CMSG_CLOEXEC = 30,
  1374. }
  1375. /*
  1376. Argument to shutdown(2)
  1377. */
  1378. Shutdown_How :: enum i32 {
  1379. RD = 0,
  1380. WR = 1,
  1381. RDWR = 2,
  1382. }
  1383. /*
  1384. Second argument to futex(2) syscall
  1385. */
  1386. Futex_Op :: enum u32 {
  1387. WAIT = 0,
  1388. WAKE = 1,
  1389. FD = 2,
  1390. REQUEUE = 3,
  1391. CMP_REQUEUE = 4,
  1392. WAKE_OP = 5,
  1393. LOCK_PI = 6,
  1394. UNLOCK_PI = 7,
  1395. TRYLOCK_PI = 8,
  1396. WAIT_BITSET = 9,
  1397. WAKE_BITSET = 10,
  1398. WAIT_REQUEUE_PI = 11,
  1399. CMP_REQUEUE_PI = 12,
  1400. LOCK_PI2 = 13,
  1401. }
  1402. /*
  1403. Bits for Futex_Flags
  1404. */
  1405. Futex_Flags_Bits :: enum {
  1406. PRIVATE = 7,
  1407. REALTIME = 8,
  1408. }
  1409. /*
  1410. Kind of operation on futex, see FUTEX_WAKE_OP
  1411. */
  1412. Futex_Arg_Op :: enum {
  1413. SET = 0, /* uaddr2 = oparg */
  1414. ADD = 1, /* uaddr2 += oparg */
  1415. OR = 2, /* uaddr2 |= oparg */
  1416. ANDN = 3, /* uaddr2 &= ~oparg */
  1417. XOR = 4, /* uaddr2 ^= oparg */
  1418. PO2_SET = 0, /* uaddr2 = 1<<oparg */
  1419. PO2_ADD = 1, /* uaddr2 += 1<<oparg */
  1420. PO2_OR = 2, /* uaddr2 |= 1<<oparg */
  1421. PO2_ANDN = 3, /* uaddr2 &~= 1<<oparg */
  1422. PO2_XOR = 4, /* uaddr2 ^= 1<<oparg */
  1423. }
  1424. /*
  1425. Kind of comparison operation on futex, see FUTEX_WAKE_OP
  1426. */
  1427. Futex_Cmp_Op :: enum {
  1428. EQ = 0, /* if (oldval == cmparg) wake */
  1429. NE = 1, /* if (oldval != cmparg) wake */
  1430. LT = 2, /* if (oldval < cmparg) wake */
  1431. LE = 3, /* if (oldval <= cmparg) wake */
  1432. GT = 4, /* if (oldval > cmparg) wake */
  1433. GE = 5, /* if (oldval >= cmparg) wake */
  1434. }
  1435. /*
  1436. The kind of resource limits
  1437. */
  1438. RLimit_Kind :: enum i32 {
  1439. CPU = 0,
  1440. FSIZE = 1,
  1441. DATA = 2,
  1442. STACK = 3,
  1443. CORE = 4,
  1444. RSS = 5,
  1445. NOFILE = 7,
  1446. AS = 9,
  1447. NPROC = 6,
  1448. MEMLOCK = 8,
  1449. LOCKS = 10,
  1450. SIGPENDING = 11,
  1451. MSGQUEUE = 12,
  1452. NICE = 13,
  1453. RTPRIO = 14,
  1454. RTTIME = 15,
  1455. NLIMITS = 16,
  1456. }
  1457. /*
  1458. Represents the user of resources
  1459. */
  1460. RUsage_Who :: enum i32 {
  1461. CHILDREN = -1,
  1462. SELF = 0,
  1463. THREAD = 1,
  1464. LWP = THREAD,
  1465. }
  1466. /*
  1467. Bits for Personality_Flags
  1468. */
  1469. UNAME26 :: 17
  1470. ADDR_NO_RANDOMIZE :: 18
  1471. FDPIC_FUNCPTRS :: 19
  1472. MMAP_PAGE_ZERO :: 20
  1473. ADDR_COMPAT_LAYOUT :: 21
  1474. READ_IMPLIES_EXEC :: 22
  1475. ADDR_LIMIT_32BIT :: 23
  1476. SHORT_INODE :: 24
  1477. WHOLE_SECONDS :: 25
  1478. STICKY_TIMEOUTS :: 26
  1479. ADDR_LIMIT_3GB :: 27
  1480. /*
  1481. Personality type
  1482. These go into the bottom 8 bits of the personality value
  1483. */
  1484. PER_LINUX :: 0x0000
  1485. PER_LINUX_32BIT :: 0x0000 | ADDR_LIMIT_32BIT
  1486. PER_LINUX_FDPIC :: 0x0000 | FDPIC_FUNCPTRS
  1487. PER_SVR4 :: 0x0001 | STICKY_TIMEOUTS | MMAP_PAGE_ZERO
  1488. PER_SVR3 :: 0x0002 | STICKY_TIMEOUTS | SHORT_INODE
  1489. PER_SCOSVR3 :: 0x0003 | STICKY_TIMEOUTS | WHOLE_SECONDS | SHORT_INODE
  1490. PER_OSR5 :: 0x0003 | STICKY_TIMEOUTS | WHOLE_SECONDS
  1491. PER_WYSEV386 :: 0x0004 | STICKY_TIMEOUTS | SHORT_INODE
  1492. PER_ISCR4 :: 0x0005 | STICKY_TIMEOUTS
  1493. PER_BSD :: 0x0006
  1494. PER_SUNOS :: 0x0006 | STICKY_TIMEOUTS
  1495. PER_XENIX :: 0x0007 | STICKY_TIMEOUTS | SHORT_INODE
  1496. PER_LINUX32 :: 0x0008
  1497. PER_LINUX32_3GB :: 0x0008 | ADDR_LIMIT_3GB
  1498. PER_IRIX32 :: 0x0009 | STICKY_TIMEOUTS
  1499. PER_IRIXN32 :: 0x000a | STICKY_TIMEOUTS
  1500. PER_IRIX64 :: 0x000b | STICKY_TIMEOUTS
  1501. PER_RISCOS :: 0x000c
  1502. PER_SOLARIS :: 0x000d | STICKY_TIMEOUTS
  1503. PER_UW7 :: 0x000e | STICKY_TIMEOUTS | MMAP_PAGE_ZERO
  1504. PER_OSF4 :: 0x000f
  1505. PER_HPUX :: 0x0010
  1506. PER_MASK :: 0x00ff
  1507. /*
  1508. Bits for access modes for shared memory
  1509. */
  1510. IPC_Mode_Bits :: enum {
  1511. WROTH = 1,
  1512. RDOTH = 2,
  1513. WRGRP = 4,
  1514. RDGRP = 5,
  1515. WRUSR = 7,
  1516. RDUSR = 8,
  1517. DEST = 9,
  1518. LOCKED = 10,
  1519. }
  1520. /*
  1521. Shared memory flags bits
  1522. */
  1523. IPC_Flags_Bits :: enum {
  1524. IPC_CREAT = 9,
  1525. IPC_EXCL = 10,
  1526. IPC_NOWAIT = 11,
  1527. // Semaphore
  1528. SEM_UNDO = 9,
  1529. // Shared memory
  1530. SHM_HUGETLB = 11,
  1531. SHM_NORESERVE = 12,
  1532. SHM_RDONLY = 12,
  1533. SHM_RND = 13,
  1534. SHM_REMAP = 14,
  1535. SHM_EXEC = 15,
  1536. // Message queue
  1537. MSG_NOERROR = 12,
  1538. MSG_EXCEPT = 13,
  1539. MSG_COPY = 14,
  1540. }
  1541. /*
  1542. IPC memory commands
  1543. */
  1544. IPC_Cmd :: enum i16 {
  1545. // IPC common
  1546. IPC_RMID = 0,
  1547. IPC_SET = 1,
  1548. IPC_STAT = 2,
  1549. // Shared memory
  1550. SHM_LOCK = 11,
  1551. SHM_UNLOCK = 12,
  1552. SHM_STAT = 13,
  1553. SHM_INFO = 14,
  1554. SHM_STAT_ANY = 15,
  1555. // Semaphore
  1556. GETPID = 11,
  1557. GETVAL = 12,
  1558. GETALL = 13,
  1559. GETNCNT = 14,
  1560. GETZCNT = 15,
  1561. SETVAL = 16,
  1562. SETALL = 17,
  1563. SEM_STAT = 18,
  1564. SEM_INFO = 19,
  1565. SEM_STAT_ANY = 20,
  1566. // Message queue
  1567. MSG_STAT = 11,
  1568. MSG_INFO = 12,
  1569. MSG_STAT_ANY = 13,
  1570. }
  1571. /*
  1572. File locking operation bits
  1573. */
  1574. FLock_Op_Bits :: enum {
  1575. SH = 1,
  1576. EX = 2,
  1577. NB = 4,
  1578. UN = 8,
  1579. }
  1580. /*
  1581. ptrace requests
  1582. */
  1583. PTrace_Request :: enum {
  1584. TRACEME = 0,
  1585. PEEKTEXT = 1,
  1586. PEEKDATA = 2,
  1587. PEEKUSER = 3,
  1588. POKETEXT = 4,
  1589. POKEDATA = 5,
  1590. POKEUSER = 6,
  1591. CONT = 7,
  1592. KILL = 8,
  1593. SINGLESTEP = 9,
  1594. GETREGS = 12,
  1595. SETREGS = 13,
  1596. GETFPREGS = 14,
  1597. SETFPREGS = 15,
  1598. ATTACH = 16,
  1599. DETACH = 17,
  1600. GETFPXREGS = 18,
  1601. SETFPXREGS = 19,
  1602. SYSCALL = 24,
  1603. GET_THREAD_AREA = 25,
  1604. SET_THREAD_AREA = 26,
  1605. ARCH_PRCTL = 30,
  1606. SYSEMU = 31,
  1607. SYSEMU_SINGLESTEP = 32,
  1608. SINGLEBLOCK = 33,
  1609. SETOPTIONS = 0x4200,
  1610. GETEVENTMSG = 0x4201,
  1611. GETSIGINFO = 0x4202,
  1612. SETSIGINFO = 0x4203,
  1613. GETREGSET = 0x4204,
  1614. SETREGSET = 0x4205,
  1615. SEIZE = 0x4206,
  1616. INTERRUPT = 0x4207,
  1617. LISTEN = 0x4208,
  1618. PEEKSIGINFO = 0x4209,
  1619. GETSIGMASK = 0x420a,
  1620. SETSIGMASK = 0x420b,
  1621. SECCOMP_GET_FILTER = 0x420c,
  1622. SECCOMP_GET_METADATA = 0x420d,
  1623. GET_SYSCALL_INFO = 0x420e,
  1624. GET_RSEQ_CONFIGURATION = 0x420f,
  1625. }
  1626. /*
  1627. ptrace options
  1628. */
  1629. PTrace_Options_Bits :: enum {
  1630. TRACESYSGOOD = 0,
  1631. TRACEFORK = 1,
  1632. TRACEVFORK = 2,
  1633. TRACECLONE = 3,
  1634. TRACEEXEC = 4,
  1635. TRACEVFORKDONE = 5,
  1636. TRACEEXIT = 6,
  1637. TRACESECCOMP = 7,
  1638. EXITKILL = 20,
  1639. SUSPEND_SECCOMP = 21,
  1640. }
  1641. /*
  1642. ptrace event codes.
  1643. */
  1644. PTrace_Event_Code :: enum {
  1645. EVENT_FORK = 1,
  1646. EVENT_VFORK = 2,
  1647. EVENT_CLONE = 3,
  1648. EVENT_EXEC = 4,
  1649. EVENT_VFORK_DONE = 5,
  1650. EVENT_EXIT = 6,
  1651. EVENT_SECCOMP = 7,
  1652. EVENT_STOP = 128,
  1653. }
  1654. /*
  1655. ptrace's get syscall info operation.
  1656. */
  1657. PTrace_Get_Syscall_Info_Op :: enum u8 {
  1658. NONE = 0,
  1659. ENTRY = 1,
  1660. EXIT = 2,
  1661. SECCOMP = 3,
  1662. }
  1663. /*
  1664. ptrace's PEEKSIGINFO flags bits
  1665. */
  1666. PTrace_Peek_Sig_Info_Flags_Bits :: enum {
  1667. SHARED = 0,
  1668. }
  1669. /*
  1670. Syslog actions.
  1671. */
  1672. Syslog_Action :: enum i32 {
  1673. CLOSE = 0,
  1674. OPEN = 1,
  1675. READ = 2,
  1676. READ_ALL = 3,
  1677. READ_CLEAR = 4,
  1678. CLEAR = 5,
  1679. CONSOLE_OFF = 6,
  1680. CONSOLE_ON = 7,
  1681. CONSOLE_LEVEL = 8,
  1682. SIZE_UNREAD = 9,
  1683. SIZE_BUFFER = 10,
  1684. }
  1685. /*
  1686. Bits for splice flags.
  1687. */
  1688. Splice_Flags_Bits :: enum {
  1689. MOVE = 0x01,
  1690. NONBLOCK = 0x02,
  1691. MORE = 0x04,
  1692. GIFT = 0x08,
  1693. }
  1694. /*
  1695. Clock IDs for various system clocks.
  1696. */
  1697. Clock_Id :: enum {
  1698. REALTIME = 0,
  1699. MONOTONIC = 1,
  1700. PROCESS_CPUTIME_ID = 2,
  1701. THREAD_CPUTIME_ID = 3,
  1702. MONOTONIC_RAW = 4,
  1703. REALTIME_COARSE = 5,
  1704. MONOTONIC_COARSE = 6,
  1705. BOOTTIME = 7,
  1706. REALTIME_ALARM = 8,
  1707. BOOTTIME_ALARM = 9,
  1708. }
  1709. /*
  1710. Bits for POSIX interval timer flags.
  1711. */
  1712. ITimer_Flags_Bits :: enum {
  1713. ABSTIME = 1,
  1714. }
  1715. /*
  1716. Bits for epoll_create(2) flags.
  1717. */
  1718. EPoll_Flags_Bits :: enum {
  1719. FDCLOEXEC = 19,
  1720. }
  1721. EPoll_Event_Kind :: enum u32 {
  1722. IN = 0x001,
  1723. PRI = 0x002,
  1724. OUT = 0x004,
  1725. RDNORM = 0x040,
  1726. RDBAND = 0x080,
  1727. WRNORM = 0x100,
  1728. WRBAND = 0x200,
  1729. MSG = 0x400,
  1730. ERR = 0x008,
  1731. HUP = 0x010,
  1732. RDHUP = 0x2000,
  1733. EXCLUSIVE = 1<<28,
  1734. WAKEUP = 1<<29,
  1735. ONESHOT = 1<<30,
  1736. ET = 1<<31,
  1737. }
  1738. EPoll_Ctl_Opcode :: enum i32 {
  1739. ADD = 1,
  1740. DEL = 2,
  1741. MOD = 3,
  1742. }
  1743. /*
  1744. Bits for execveat(2) flags.
  1745. */
  1746. Execveat_Flags_Bits :: enum {
  1747. AT_SYMLINK_NOFOLLOW = 8,
  1748. AT_EMPTY_PATH = 12,
  1749. }