Browse Source

Fix bit flags on fcntl linux POSIX implemention. Add sys/sem linux implementation.

Isaac Andrade 11 months ago
parent
commit
97e06cb98e
2 changed files with 37 additions and 2 deletions
  1. 7 2
      core/sys/posix/fcntl.odin
  2. 30 0
      core/sys/posix/sys_sem.odin

+ 7 - 2
core/sys/posix/fcntl.odin

@@ -123,12 +123,16 @@ O_Flag_Bits :: enum c.int {
 	NONBLOCK  = log2(O_NONBLOCK),
 	// Write I/O shall complete as defined by synchronized I/O file integrity completion.
 	SYNC      = log2(O_SYNC),
+
 	// NOTE: use with `posix.O_RSYNC + { .OTHER_FLAG, .OTHER_FLAG }`, unfortunately can't be in
 	// this bit set enum because it is 0 on some platforms and a value on others.
 	// RSYNC = O_RSYNC,
 
 	// Execute only.
-	EXEC      = O_EXEC when ODIN_OS == .Linux else log2(O_EXEC),
+	// NOTE: use with `posix.O_ENTER + { .OTHER_FLAG, .OTHER_FLAG }`, unfortunately can't be in
+	// this bit set enum because it is 0 on some platforms and a value on others.
+	// EXEC      = O_EXEC
+
 	// Reading and writing.
 	RDWR      = log2(O_RDWR),
 	// Writing only.
@@ -139,7 +143,8 @@ O_Flag_Bits :: enum c.int {
 O_Flags :: bit_set[O_Flag_Bits; c.int]
 
 // A mask of all the access mode bits.
-O_ACCMODE :: O_Flags{ .EXEC, .RDWR, .WRONLY }
+// NOTE: .EXEC and .RDONLY also belong here, but they are 0 on some platforms. 
+O_ACCMODE :: O_Flags{ .RDWR, .WRONLY }
 
 AT_Flag_Bits :: enum c.int {
 	EACCESS          = log2(AT_EACCESS),

+ 30 - 0
core/sys/posix/sys_sem.odin

@@ -127,6 +127,36 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS
 		sem_flg: c.short,  /* [PSX] operation flags */
 	}
 
+} else when ODIN_OS == .Linux {
+
+	SEM_UNDO :: 0x1000 // undo the operation on exit
+
+	// Commands for `semctl'.
+	GETPID  :: 11
+	GETVAL  :: 12
+	GETALL  :: 13
+	GETNCNT :: 14
+	GETZCNT :: 15
+	SETVAL  :: 16
+	SETALL  :: 17
+
+	semid_ds :: struct {
+		sem_perm:  ipc_perm,  // [PSX] operation permission structure
+		sem_otime: time_t,    // [PSX] last semop()
+    __sem_otime_high: c.ulong,
+		sem_ctime: time_t,    // [PSX] last time changed by semctl()
+    __sem_ctime_high: c.ulong,
+		sem_nsems: c.ulong, // [PSX] number of semaphores in set
+    __glibc_reserved3: c.ulong,
+    __glibc_reserved4: c.ulong,
+	}
+
+	sembuf :: struct {
+		sem_num: c.ushort, /* [PSX] semaphore number */
+		sem_op:  c.short,  /* [PSX] semaphore operation */
+		sem_flg: c.short,  /* [PSX] operation flags */
+	}
+
 } else {
 	#panic("posix is unimplemented for the current target")
 }