sys_ipc.odin 1.8 KB

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