sys_ipc.odin 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #+build linux, darwin, netbsd, openbsd, freebsd
  2. package posix
  3. import "core:c"
  4. when ODIN_OS == .Darwin {
  5. foreign import lib "system:System.framework"
  6. } else {
  7. foreign import lib "system:c"
  8. }
  9. // sys/ipc.h = XSI interprocess communication access structure
  10. foreign lib {
  11. /*
  12. Generate an IPC key.
  13. Returns: -1 (setting errno) on failure, the key otherwise
  14. [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/ftok.html ]]
  15. */
  16. ftok :: proc(path: cstring, id: c.int) -> key_t ---
  17. }
  18. IPC_Cmd :: enum c.int {
  19. RMID = IPC_RMID,
  20. SET = IPC_SET,
  21. STAT = IPC_STAT,
  22. }
  23. IPC_Flag_Bits :: enum c.int {
  24. CREAT = log2(IPC_CREAT),
  25. EXCL = log2(IPC_EXCL),
  26. NOWAIT = log2(IPC_NOWAIT),
  27. MSG_NOERROR = log2(MSG_NOERROR),
  28. }
  29. IPC_Flags :: bit_set[IPC_Flag_Bits; c.int]
  30. when ODIN_OS == .Darwin {
  31. key_t :: distinct c.int32_t
  32. ipc_perm :: struct {
  33. uid: uid_t, /* [PSX] owner's user ID */
  34. gid: gid_t, /* [PSX] owner's group ID */
  35. cuid: uid_t, /* [PSX] creator's user ID */
  36. cgid: gid_t, /* [PSX] creator's group ID */
  37. mode: mode_t, /* [PSX] read/write perms */
  38. _seq: c.ushort,
  39. _key: key_t,
  40. }
  41. IPC_CREAT :: 0o01000
  42. IPC_EXCL :: 0o02000
  43. IPC_NOWAIT :: 0o04000
  44. IPC_PRIVATE :: key_t(0)
  45. IPC_RMID :: 0
  46. IPC_SET :: 1
  47. IPC_STAT :: 2
  48. } else when ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD {
  49. key_t :: distinct c.long
  50. ipc_perm :: struct {
  51. cuid: uid_t, /* [PSX] creator's user ID */
  52. cgid: gid_t, /* [PSX] creator's group ID */
  53. uid: uid_t, /* [PSX] owner's user ID */
  54. gid: gid_t, /* [PSX] owner's group ID */
  55. mode: mode_t, /* [PSX] read/write perms */
  56. _seq: c.ushort,
  57. _key: key_t,
  58. }
  59. IPC_CREAT :: 0o01000
  60. IPC_EXCL :: 0o02000
  61. IPC_NOWAIT :: 0o04000
  62. IPC_PRIVATE :: key_t(0)
  63. IPC_RMID :: 0
  64. IPC_SET :: 1
  65. IPC_STAT :: 2
  66. } else when ODIN_OS == .Linux {
  67. key_t :: distinct c.int32_t
  68. ipc_perm :: struct {
  69. __ipc_perm_key: key_t,
  70. uid: uid_t, /* [PSX] owner's user ID */
  71. gid: gid_t, /* [PSX] owner's group ID */
  72. cuid: uid_t, /* [PSX] creator's user ID */
  73. cgid: gid_t, /* [PSX] creator's group ID */
  74. mode: mode_t, /* [PSX] read/write perms */
  75. __ipc_perm_seq: c.int,
  76. __pad1: c.long,
  77. __pad2: c.long,
  78. }
  79. IPC_CREAT :: 0o01000
  80. IPC_EXCL :: 0o02000
  81. IPC_NOWAIT :: 0o04000
  82. IPC_PRIVATE :: key_t(0)
  83. IPC_RMID :: 0
  84. IPC_SET :: 1
  85. IPC_STAT :: 2
  86. }