diff --git a/core/sys/linux/bits.odin b/core/sys/linux/bits.odin index f78891bc8..12b10e806 100644 --- a/core/sys/linux/bits.odin +++ b/core/sys/linux/bits.odin @@ -152,66 +152,43 @@ Errno :: enum i32 { RDONLY flag is not present, because it has the value of 0, i.e. it is the default, unless WRONLY or RDWR is specified. */ -when ODIN_ARCH != .arm64 && ODIN_ARCH != .arm32 { - Open_Flags_Bits :: enum { - WRONLY = 0, - RDWR = 1, - CREAT = 6, - EXCL = 7, - NOCTTY = 8, - TRUNC = 9, - APPEND = 10, - NONBLOCK = 11, - DSYNC = 12, - ASYNC = 13, - DIRECT = 14, - LARGEFILE = 15, - DIRECTORY = 16, - NOFOLLOW = 17, - NOATIME = 18, - CLOEXEC = 19, - PATH = 21, - } - // https://github.com/torvalds/linux/blob/7367539ad4b0f8f9b396baf02110962333719a48/include/uapi/asm-generic/fcntl.h#L19 - #assert(1 << uint(Open_Flags_Bits.WRONLY) == 0o0000000_1) - #assert(1 << uint(Open_Flags_Bits.RDWR) == 0o0000000_2) - #assert(1 << uint(Open_Flags_Bits.CREAT) == 0o00000_100) - #assert(1 << uint(Open_Flags_Bits.EXCL) == 0o00000_200) - #assert(1 << uint(Open_Flags_Bits.NOCTTY) == 0o00000_400) - #assert(1 << uint(Open_Flags_Bits.TRUNC) == 0o0000_1000) - #assert(1 << uint(Open_Flags_Bits.APPEND) == 0o0000_2000) - #assert(1 << uint(Open_Flags_Bits.NONBLOCK) == 0o0000_4000) - #assert(1 << uint(Open_Flags_Bits.DSYNC) == 0o000_10000) - #assert(1 << uint(Open_Flags_Bits.ASYNC) == 0o000_20000) - #assert(1 << uint(Open_Flags_Bits.DIRECT) == 0o000_40000) - #assert(1 << uint(Open_Flags_Bits.LARGEFILE) == 0o00_100000) - #assert(1 << uint(Open_Flags_Bits.DIRECTORY) == 0o00_200000) - #assert(1 << uint(Open_Flags_Bits.NOFOLLOW) == 0o00_400000) - #assert(1 << uint(Open_Flags_Bits.NOATIME) == 0o0_1000000) - #assert(1 << uint(Open_Flags_Bits.CLOEXEC) == 0o0_2000000) - #assert(1 << uint(Open_Flags_Bits.PATH) == 0o_10000000) - -} else { - Open_Flags_Bits :: enum { - WRONLY = 0, - RDWR = 1, - CREAT = 6, - EXCL = 7, - NOCTTY = 8, - TRUNC = 9, - APPEND = 10, - NONBLOCK = 11, - DSYNC = 12, - ASYNC = 13, - DIRECTORY = 14, - NOFOLLOW = 15, - DIRECT = 16, - LARGEFILE = 17, - NOATIME = 18, - CLOEXEC = 19, - PATH = 21, - } +Open_Flags_Bits :: enum { + WRONLY = 0, + RDWR = 1, + CREAT = 6, + EXCL = 7, + NOCTTY = 8, + TRUNC = 9, + APPEND = 10, + NONBLOCK = 11, + DSYNC = 12, + ASYNC = 13, + DIRECT = 14, + LARGEFILE = 15, + DIRECTORY = 16, + NOFOLLOW = 17, + NOATIME = 18, + CLOEXEC = 19, + PATH = 21, } +// https://github.com/torvalds/linux/blob/7367539ad4b0f8f9b396baf02110962333719a48/include/uapi/asm-generic/fcntl.h#L19 +#assert(1 << uint(Open_Flags_Bits.WRONLY) == 0o0000000_1) +#assert(1 << uint(Open_Flags_Bits.RDWR) == 0o0000000_2) +#assert(1 << uint(Open_Flags_Bits.CREAT) == 0o00000_100) +#assert(1 << uint(Open_Flags_Bits.EXCL) == 0o00000_200) +#assert(1 << uint(Open_Flags_Bits.NOCTTY) == 0o00000_400) +#assert(1 << uint(Open_Flags_Bits.TRUNC) == 0o0000_1000) +#assert(1 << uint(Open_Flags_Bits.APPEND) == 0o0000_2000) +#assert(1 << uint(Open_Flags_Bits.NONBLOCK) == 0o0000_4000) +#assert(1 << uint(Open_Flags_Bits.DSYNC) == 0o000_10000) +#assert(1 << uint(Open_Flags_Bits.ASYNC) == 0o000_20000) +#assert(1 << uint(Open_Flags_Bits.DIRECT) == 0o000_40000) +#assert(1 << uint(Open_Flags_Bits.LARGEFILE) == 0o00_100000) +#assert(1 << uint(Open_Flags_Bits.DIRECTORY) == 0o00_200000) +#assert(1 << uint(Open_Flags_Bits.NOFOLLOW) == 0o00_400000) +#assert(1 << uint(Open_Flags_Bits.NOATIME) == 0o0_1000000) +#assert(1 << uint(Open_Flags_Bits.CLOEXEC) == 0o0_2000000) +#assert(1 << uint(Open_Flags_Bits.PATH) == 0o_10000000) /* Bits for FD_Flags bitset diff --git a/core/sys/posix/fcntl.odin b/core/sys/posix/fcntl.odin index be33739e4..1ccc07c54 100644 --- a/core/sys/posix/fcntl.odin +++ b/core/sys/posix/fcntl.odin @@ -92,120 +92,52 @@ Lock_Type :: enum c.short { WRLCK = F_WRLCK, } -// Assertions made to unify this bit set. -#assert(O_RDONLY == 0) +O_Flag_Bits :: enum c.int { + // Sets FD_CLOEXEC on the file descriptor. + CLOEXEC = log2(O_CLOEXEC), + // If not exists, combined with DIRECTORY will cause creation of a directory, otherwise a regular file. + CREAT = log2(O_CREAT), + // Fails if the opened descriptor would not be a directory. + DIRECTORY = log2(O_DIRECTORY), + // If combined with CREAT, causes a failure if the file already exists. + EXCL = log2(O_EXCL), + // If terminal device, do not make it the controlling terminal for the process. + NOCTTY = log2(O_NOCTTY), + // Don't follow symbolic links, fail with errno ELOOP. + NOFOLLOW = log2(O_NOFOLLOW), + // If exists and regular, truncate the length to 0. + TRUNC = log2(O_TRUNC), -when ODIN_OS == .Linux { + // NOTE: use with `posix.O_TTY_INIT + { .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. + // TTY_INIT = O_TTY_INIT, - O_Flag_Bits :: enum c.int { - // Sets FD_CLOEXEC on the file descriptor. - CLOEXEC = log2(O_CLOEXEC), - // If not exists, combined with DIRECTORY will cause creation of a directory, otherwise a regular file. - CREAT = log2(O_CREAT), - // Fails if the opened descriptor would not be a directory. - DIRECTORY = log2(O_DIRECTORY), - // If combined with CREAT, causes a failure if the file already exists. - EXCL = log2(O_EXCL), - // If terminal device, do not make it the controlling terminal for the process. - NOCTTY = log2(O_NOCTTY), - // Don't follow symbolic links, fail with errno ELOOP. - NOFOLLOW = log2(O_NOFOLLOW), - // If exists and regular, truncate the length to 0. - TRUNC = log2(O_TRUNC), + // Set file offset to end of file prior to each write. + APPEND = log2(O_APPEND), + // Write I/O shall complete as defined by synchronized I/O data integrity completion. + DSYNC = log2(O_DSYNC), + // Causes nonblocking behaviour in various situations. + 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_TTY_INIT + { .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. - // TTY_INIT = O_TTY_INIT, + // 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, - // Set file offset to end of file prior to each write. - APPEND = log2(O_APPEND), - // Write I/O shall complete as defined by synchronized I/O data integrity completion. - DSYNC = log2(O_DSYNC), - // Causes nonblocking behaviour in various situations. - 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. - // 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. - WRONLY = log2(O_WRONLY), - // Reading only. - // RDONLY = 0, // Default - } - - O_Flags :: bit_set[O_Flag_Bits; c.int] - -} else { - - O_Flag_Bits :: enum c.int { - // Sets FD_CLOEXEC on the file descriptor. - CLOEXEC = log2(O_CLOEXEC), - // If not exists, combined with DIRECTORY will cause creation of a directory, otherwise a regular file. - CREAT = log2(O_CREAT), - // Fails if the opened descriptor would not be a directory. - DIRECTORY = log2(O_DIRECTORY), - // If combined with CREAT, causes a failure if the file already exists. - EXCL = log2(O_EXCL), - // If terminal device, do not make it the controlling terminal for the process. - NOCTTY = log2(O_NOCTTY), - // Don't follow symbolic links, fail with errno ELOOP. - NOFOLLOW = log2(O_NOFOLLOW), - // If exists and regular, truncate the length to 0. - TRUNC = log2(O_TRUNC), - - // NOTE: use with `posix.O_TTY_INIT + { .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. - // TTY_INIT = O_TTY_INIT, - - // Set file offset to end of file prior to each write. - APPEND = log2(O_APPEND), - // Write I/O shall complete as defined by synchronized I/O data integrity completion. - DSYNC = log2(O_DSYNC), - // Causes nonblocking behaviour in various situations. - 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 = log2(O_EXEC), - - // Reading and writing. - RDWR = log2(O_RDWR), - // Writing only. - WRONLY = log2(O_WRONLY), - // Reading only. - // RDONLY = 0, // Default - } - - O_Flags :: bit_set[O_Flag_Bits; c.int] + // Execute only. + EXEC = log2(O_EXEC), + // Reading and writing. + RDWR = log2(O_RDWR), + // Writing only. + WRONLY = log2(O_WRONLY), + // Reading only. + // RDONLY = 0, // Default } -// A mask of all the access mode bits. -when ODIN_OS == .Linux { +O_Flags :: bit_set[O_Flag_Bits; c.int] - // NOTE: .EXEC and .RDONLY also belong here, but they are 0 on some platforms. - O_ACCMODE :: O_Flags{ .RDWR, .WRONLY } - -} else { - - // NOTE: .RDONLY also belong here, but they are 0 on some platforms. - O_ACCMODE :: O_Flags{ .EXEC, .RDWR, .WRONLY } - -} +O_ACCMODE :: O_Flags{ .EXEC, .RDWR, .WRONLY } AT_Flag_Bits :: enum c.int { EACCESS = log2(AT_EACCESS), @@ -265,7 +197,7 @@ when ODIN_OS == .Darwin { _O_SEARCH :: O_EXEC | O_DIRECTORY O_SEARCH :: O_Flags{.EXEC, .DIRECTORY} - AT_FDCWD: FD : -2 + AT_FDCWD: FD: -2 AT_EACCESS :: 0x0010 AT_SYMLINK_NOFOLLOW :: 0x0020 @@ -329,7 +261,7 @@ when ODIN_OS == .Darwin { _O_SEARCH :: O_EXEC O_SEARCH :: O_Flags{ .EXEC } - AT_FDCWD: FD : -100 + AT_FDCWD: FD: -100 AT_EACCESS :: 0x0100 AT_SYMLINK_NOFOLLOW :: 0x0200 @@ -396,7 +328,7 @@ when ODIN_OS == .Darwin { _O_SEARCH :: 0x00800000 O_SEARCH :: O_Flags{O_Flag_Bits(log2(_O_SEARCH))} - AT_FDCWD: FD : -100 + AT_FDCWD: FD: -100 AT_EACCESS :: 0x100 AT_SYMLINK_NOFOLLOW :: 0x200 @@ -460,7 +392,7 @@ when ODIN_OS == .Darwin { _O_SEARCH :: 0 O_SEARCH :: O_Flags{} // NOTE: not defined in the headers - AT_FDCWD: FD : -100 + AT_FDCWD: FD: -100 AT_EACCESS :: 0x01 AT_SYMLINK_NOFOLLOW :: 0x02 @@ -480,21 +412,21 @@ when ODIN_OS == .Darwin { off_t :: distinct c.int64_t pid_t :: distinct c.int - F_DUPFD :: 0 // Duplicate file descriptor. - F_GETFD :: 1 /* Get file descriptor flags. */ - F_SETFD :: 2 /* Set file descriptor flags. */ - F_GETFL :: 3 /* Get file status flags. */ - F_SETFL :: 4 /* Set file status flags. */ - F_GETLK :: 5 /* Get record locking info. */ - F_SETLK :: 6 /* Set record locking info (non-blocking). */ - F_SETLKW :: 7 /* Set record locking info (blocking). */ - F_SETOWN :: 8 /* Get owner (process receiving SIGIO). */ - F_GETOWN :: 9 /* Set owner (process receiving SIGIO). */ - F_RDLCK :: 0 /* Read lock. */ - F_UNLCK :: 2 /* Remove lock. */ - F_WRLCK :: 1 /* Write lock. */ + F_DUPFD :: 0 + F_GETFD :: 1 + F_SETFD :: 2 + F_GETFL :: 3 + F_SETFL :: 4 + F_GETLK :: 5 + F_SETLK :: 6 + F_SETLKW :: 7 + F_SETOWN :: 8 + F_GETOWN :: 9 + F_RDLCK :: 0 + F_UNLCK :: 2 + F_WRLCK :: 1 - F_DUPFD_CLOEXEC :: 1030 /* Duplicate file descriptor with close-on-exit set. */ + F_DUPFD_CLOEXEC :: 1030 FD_CLOEXEC :: 1 @@ -517,8 +449,7 @@ when ODIN_OS == .Darwin { _O_RSYNC :: 0 O_RSYNC :: O_Flags{} - // NOTE: Not implemented in Linux - O_EXEC :: 0 + O_EXEC :: 0x04000000 // NOTE: not defined in the headers O_RDONLY :: 0 O_WRONLY :: 0o1 @@ -527,19 +458,19 @@ when ODIN_OS == .Darwin { _O_SEARCH :: 0 O_SEARCH :: O_Flags{} - AT_FDCWD: FD : -100 // Special value used to indicate the *at functions should use the current working directory. + AT_FDCWD: FD: -100 - AT_EACCESS :: 0x200 // Test access permitted for effective IDs, not real IDs. - AT_SYMLINK_NOFOLLOW :: 0x100 // Do not follow symbolic links. - AT_SYMLINK_FOLLOW :: 0x400 // Follow symbolic links. - AT_REMOVEDIR :: 0x200 // Remove directory instead of unlinking file. + AT_EACCESS :: 0x200 + AT_SYMLINK_NOFOLLOW :: 0x100 + AT_SYMLINK_FOLLOW :: 0x400 + AT_REMOVEDIR :: 0x200 flock :: struct { - l_start: off_t, // [PSX] relative offset in bytes. - l_len: off_t, // [PSX] size; if 0 then until EOF. - l_pid: pid_t, // [PSX] process ID of the process holding the lock. - l_type: Lock_Type, // [PSX] type of lock. - l_whence: c.short, // [PSX] flag (Whence) of starting offset. + l_start: off_t, /* [PSX] relative offset in bytes. */ + l_len: off_t, /* [PSX] size; if 0 then until EOF. */ + l_pid: pid_t, /* [PSX] process ID of the process holding the lock. */ + l_type: Lock_Type, /* [PSX] type of lock. */ + l_whence: c.short, /* [PSX] flag (Whence) of starting offset. */ } } else { diff --git a/core/sys/posix/glob.odin b/core/sys/posix/glob.odin index b09104900..c17f8b2c3 100644 --- a/core/sys/posix/glob.odin +++ b/core/sys/posix/glob.odin @@ -178,15 +178,12 @@ when ODIN_OS == .Darwin { glob_t :: struct { gl_pathc: c.size_t, /* [PSX] count of paths matched by pattern */ - gl_matchc: c.size_t, /* count of paths matching pattern */ + gl_pathv: [^]cstring `fmt:"v,gl_pathc"`, /* [PSX] pointer to list of matched pathnames */ gl_offs: c.size_t, /* [PSX] slots to reserve at the beginning of gl_pathv */ gl_flags: Glob_Flags, /* copy of flags parameter to glob */ - gl_pathv: [^]cstring `fmt:"v,gl_pathc"`, /* [PSX] pointer to list of matched pathnames */ // Non-standard alternate file system access functions: - gl_errfunc: proc "c" (cstring, c.int) -> c.int, - gl_closedir: proc "c" (dirp: DIR), gl_readdir: proc "c" (dirp: DIR) -> ^dirent, gl_opendir: proc "c" (path: cstring) -> DIR, diff --git a/core/sys/posix/langinfo.odin b/core/sys/posix/langinfo.odin index 7f521e3a4..04b46921c 100644 --- a/core/sys/posix/langinfo.odin +++ b/core/sys/posix/langinfo.odin @@ -301,58 +301,58 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD { DAY_1 :: 0x20_007 DAY_2 :: 0x20_008 DAY_3 :: 0x20_009 - DAY_4 :: 0x20_010 - DAY_5 :: 0x20_011 - DAY_6 :: 0x20_012 - DAY_7 :: 0x20_013 + DAY_4 :: 0x20_00A + DAY_5 :: 0x20_00B + DAY_6 :: 0x20_00C + DAY_7 :: 0x20_00D - ABMON_1 :: 0x20_014 - ABMON_2 :: 0x20_015 - ABMON_3 :: 0x20_016 - ABMON_4 :: 0x20_017 - ABMON_5 :: 0x20_018 - ABMON_6 :: 0x20_019 - ABMON_7 :: 0x20_020 - ABMON_8 :: 0x20_021 - ABMON_9 :: 0x20_022 - ABMON_10 :: 0x20_023 - ABMON_11 :: 0x20_024 - ABMON_12 :: 0x20_025 + ABMON_1 :: 0x20_00E + ABMON_2 :: 0x20_010 + ABMON_3 :: 0x20_011 + ABMON_4 :: 0x20_012 + ABMON_5 :: 0x20_013 + ABMON_6 :: 0x20_014 + ABMON_7 :: 0x20_015 + ABMON_8 :: 0x20_016 + ABMON_9 :: 0x20_017 + ABMON_10 :: 0x20_018 + ABMON_11 :: 0x20_019 + ABMON_12 :: 0x20_01A - MON_1 :: 0x20_026 - MON_2 :: 0x20_027 - MON_3 :: 0x20_028 - MON_4 :: 0x20_029 - MON_5 :: 0x20_030 - MON_6 :: 0x20_031 - MON_7 :: 0x20_032 - MON_8 :: 0x20_033 - MON_9 :: 0x20_034 - MON_10 :: 0x20_035 - MON_11 :: 0x20_036 - MON_12 :: 0x20_037 + MON_1 :: 0x20_01B + MON_2 :: 0x20_01C + MON_3 :: 0x20_01D + MON_4 :: 0x20_01E + MON_5 :: 0x20_020 + MON_6 :: 0x20_021 + MON_7 :: 0x20_022 + MON_8 :: 0x20_023 + MON_9 :: 0x20_024 + MON_10 :: 0x20_025 + MON_11 :: 0x20_026 + MON_12 :: 0x20_027 - AM_STR :: 0x20_038 - PM_STR :: 0x20_039 + AM_STR :: 0x20_028 + PM_STR :: 0x20_029 - D_T_FMT :: 0x20_040 - D_FMT :: 0x20_041 - T_FMT :: 0x20_042 - T_FMT_AMPM :: 0x20_043 + D_T_FMT :: 0x20_02A + D_FMT :: 0x20_02B + T_FMT :: 0x20_02C + T_FMT_AMPM :: 0x20_02D - ERA :: 0x20_044 - ERA_D_FMT :: 0x20_045 - ALT_DIGITS :: 0x20_046 - ERA_D_T_FMT :: 0x20_047 - ERA_T_FMT :: 0x20_048 + ERA :: 0x20_02E + ERA_D_FMT :: 0x20_030 + ALT_DIGITS :: 0x20_031 + ERA_D_T_FMT :: 0x20_032 + ERA_T_FMT :: 0x20_033 // NOTE: CODESET is the 16th member of the enum group starting with value // LC_CTYPE << 16, LC_CTYPE is 0. - CODESET :: 0x15 + CODESET :: 0x0F // NOTE: CRNCYSTR is the 16th member of the enum group starting with value // LC_MONETARY << 16, LC_MONETARY is 4. - CRNCYSTR :: 0x40_000 + CRNCYSTR :: 0x40_00F // NOTE: RADIXCHAR is the 1st member of the enum group starting with value // LC_NUMERIC << 16, LC_NUMERIC is 1. diff --git a/core/sys/posix/limits.odin b/core/sys/posix/limits.odin index 81ede3368..58adce0a1 100644 --- a/core/sys/posix/limits.odin +++ b/core/sys/posix/limits.odin @@ -466,24 +466,24 @@ when ODIN_OS == .Darwin { // AIO_LISTIO_MAX :: sysconf(._AIO_LISTIO_MAX) // AIO_MAX :: sysconf(._AIO_MAX) - AIO_PRIO_DELTA_MAX :: 20 + // AIO_PRIO_DELTA_MAX :: sysconf(._AIO_PRIO_DELTA_MAX) ARG_MAX :: 131_072 // ATEXIT_MAX :: sysconf(._ATEXIT_MAX) // CHILD_MAX :: sysconf(._POSIX_ARG_MAX) - DELAYTIMER_MAX :: 2_147_483_647 - HOST_NAME_MAX :: 64 + // DELAYTIMER_MAX :: sysconf(._DELAYTIMER_MAX) + // HOST_NAME_MAX :: sysconf(._HOST_NAME_MAX) // IOV_MAX :: sysconf(._XOPEN_IOV_MAX) - LOGIN_NAME_MAX :: 256 + // LOGIN_NAME_MAX :: sysconf(._LOGIN_NAME_MAX) // MQ_OPEN_MAX :: sysconf(._MQ_OPEN_MAX) // MQ_PRIO_MAX :: sysconf(._MQ_PRIO_MAX) // PAGESIZE :: PAGE_SIZE // PAGE_SIZE :: sysconf(._PAGE_SIZE) PTHREAD_DESTRUCTOR_ITERATIONS :: 4 - PTHREAD_KEYS_MAX :: 1024 - PTHREAD_STACK_MIN :: 16_384 - RTSIG_MAX :: 32 + // PTHREAD_KEYS_MAX :: sysconf(._PTHREAD_KEYS_MAX) + // PTHREAD_STACK_MIN :: sysconf(._PTHREAD_STACK_MIN) + // RTSIG_MAX :: sysconf(._RTSIG_MAX) // SEM_NSEMS_MAX :: sysconf(._SEM_NSEMS_MAX) - SEM_VALUE_MAX :: 2_147_483_647 + // SEM_VALUE_MAX :: sysconf(._SEM_VALUE_MAX) // SIGQUEUE_MAX :: sysconf(._SIGQUEUE_MAX) // SS_REPL_MAX :: sysconf(._SS_REPL_MAX) // STREAM_MAX :: sysconf(._STREAM_MAX) @@ -493,7 +493,7 @@ when ODIN_OS == .Darwin { // TRACE_NAME_MAX :: sysconf(._TRACE_NAME_MAX) // TRACE_SYS_MAX :: sysconf(._TRACE_SYS_MAX) // TRACE_USER_EVENT_MAX :: sysconf(._TRACE_USER_EVENT_MAX) - TTY_NAME_MAX :: 32 + // TTY_NAME_MAX :: sysconf(._TTY_NAME_MAX) // TZNAME_MAX :: sysconf(._TZNAME_MAX) // The values in the following list may be constants within an implementation or may vary from @@ -518,7 +518,7 @@ when ODIN_OS == .Darwin { // POSIX_REC_MAX_XFER_SIZE :: sysconf(._POSIX_REC_MAX_XFER_SIZE) // POSIX_REC_MIN_XFER_SIZE :: sysconf(._POSIX_REC_MIN_XFER_SIZE) // POSIX_REC_XFER_ALIGN :: sysconf(._POSIX_REC_XFER_ALIGN) - SYMLINK_MAX :: PATH_MAX + // SYMLINK_MAX :: pathconf(".", ._SYMLINK_MAX) // The magnitude limitations in the following list shall be fixed by specific implementations. @@ -536,17 +536,17 @@ when ODIN_OS == .Darwin { CHARCLASS_NAME_MAX :: 14 COLL_WEIGHTS_MAX :: 2 EXPR_NEST_MAX :: 32 - LINE_MAX :: 2048 - NGROUPS_MAX :: 65_536 + // LINE_MAX :: sysconf(._LINE_MAX) + // NGROUPS_MAX :: sysconf(._NGROUPS_MAX) RE_DUP_MAX :: 255 // Other limits. - + NL_ARGMAX :: 9 - NL_LANGMAX :: 14 + NL_LANGMAX :: 32 // 14 on glibc, 32 on musl NL_MSGMAX :: 32_767 NL_SETMAX :: 255 - NL_TEXTMAX :: 255 + NL_TEXTMAX :: 2048 // 255 on glibc, 2048 on musl NZERO :: 20 } else { diff --git a/core/sys/posix/netdb.odin b/core/sys/posix/netdb.odin index cd965e2a4..f31de2c2b 100644 --- a/core/sys/posix/netdb.odin +++ b/core/sys/posix/netdb.odin @@ -427,7 +427,7 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS NI_NUMERICHOST :: 1 NI_NAMEREQD :: 8 NI_NUMERICSERV :: 2 - NI_NUMERICSCOPE :: 0 // NOTE: not implemented + NI_NUMERICSCOPE :: 0x100 NI_DGRAM :: 16 } diff --git a/core/sys/posix/netinet_in.odin b/core/sys/posix/netinet_in.odin index d5121606b..22bfde9bc 100644 --- a/core/sys/posix/netinet_in.odin +++ b/core/sys/posix/netinet_in.odin @@ -45,20 +45,18 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS } when ODIN_OS == .Linux { + sockaddr_in :: struct { sin_family: sa_family_t, /* [PSX] AF_INET (but a smaller size) */ sin_port: in_port_t, /* [PSX] port number */ sin_addr: in_addr, /* [PSX] IP address */ - sin_zero: [size_of(sockaddr) - - u16 - - size_of(in_port_t) - - size_of(in_addr)]c.char, + sin_zero: [8]c.char, } sockaddr_in6 :: struct { sin6_family: sa_family_t, /* [PSX] AF_INET6 (but a smaller size) */ sin6_port: in_port_t, /* [PSX] port number */ - sin6_flowinfo: u32be, /* [PSX] IPv6 traffic class and flow information */ + sin6_flowinfo: u32be, /* [PSX] IPv6 traffic class and flow information */ sin6_addr: in6_addr, /* [PSX] IPv6 address */ sin6_scope_id: c.uint32_t, /* [PSX] set of interfaces for a scope */ } diff --git a/core/sys/posix/poll.odin b/core/sys/posix/poll.odin index 3d403d625..9e38afe12 100644 --- a/core/sys/posix/poll.odin +++ b/core/sys/posix/poll.odin @@ -21,17 +21,11 @@ foreign lib { [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/poll.html ]] */ - poll :: proc(fds: [^]pollfd, nfds: nfds_t, timeout: c.int) -> Poll_Error --- + poll :: proc(fds: [^]pollfd, nfds: nfds_t, timeout: c.int) -> c.int --- } nfds_t :: c.uint -Poll_Error :: enum c.int { - EAGAIN = cast(c.int)Errno.EAGAIN, - EINTR = cast(c.int)Errno.EINTR, - EINVAL = cast(c.int)Errno.EINVAL, -} - Poll_Event_Bits :: enum c.short { // Data other than high-priority data may be read without blocking. IN = log2(POLLIN), diff --git a/core/sys/posix/posix.odin b/core/sys/posix/posix.odin index 5cb4122a6..44486e424 100644 --- a/core/sys/posix/posix.odin +++ b/core/sys/posix/posix.odin @@ -1,5 +1,7 @@ /* -Bindings for most POSIX APIs. +Raw bindings for most POSIX APIs. + +Targets glibc and musl compatibility. APIs that have been left out are due to not being useful, being fully replaced (and better) by other Odin packages, diff --git a/core/sys/posix/pthread.odin b/core/sys/posix/pthread.odin index aa7b50a6f..76acb1a3d 100644 --- a/core/sys/posix/pthread.odin +++ b/core/sys/posix/pthread.odin @@ -521,7 +521,7 @@ when ODIN_OS == .Darwin { PTHREAD_CANCEL_ENABLE :: 0 PTHREAD_CANCEL_DISABLE :: 1 - PTHREAD_CANCELED :: rawptr(uintptr(-1)) + PTHREAD_CANCELED :: rawptr(~uintptr(0)) PTHREAD_CREATE_JOINABLE :: 0 PTHREAD_CREATE_DETACHED :: 1 @@ -542,7 +542,7 @@ when ODIN_OS == .Darwin { pthread_t :: distinct c.ulong pthread_attr_t :: struct #raw_union { - __size: [56]c.char, + __size: [56]c.char, // NOTE: may be smaller depending on libc or arch, but never larger. __align: c.long, } @@ -550,6 +550,11 @@ when ODIN_OS == .Darwin { sched_param :: struct { sched_priority: c.int, /* [PSX] process or thread execution scheduling priority */ + + // NOTE: may be smaller depending on libc or arch, but never larger. + __reserved1: c.int, + __reserved2: [4]c.long, + __reserved3: c.int, } } else { diff --git a/core/sys/posix/signal.odin b/core/sys/posix/signal.odin index 6748c162f..1e3f05104 100644 --- a/core/sys/posix/signal.odin +++ b/core/sys/posix/signal.odin @@ -220,16 +220,6 @@ foreign lib { const struct timespec *restrict); int sigwaitinfo(const sigset_t *restrict, siginfo_t *restrict); */ - - when ODIN_OS == .Linux { - /* Return number of available real-time signal with highest priority. */ - @(private) - __libc_current_sigrtmin :: proc() -> result --- - - /* Return number of available real-time signal with lowest priority. */ - @(private) - __libc_current_sigrtmax :: proc() -> result --- - } } sigval :: struct #raw_union { @@ -490,11 +480,6 @@ when ODIN_OS == .Darwin { uid_t :: distinct c.uint32_t sigset_t :: distinct c.uint32_t - // NOTE: unimplemented on darwin. - // - // SIGRTMIN :: - // SIGRTMAX :: - SIGHUP :: 1 SIGQUIT :: 3 SIGTRAP :: 5 @@ -635,11 +620,6 @@ when ODIN_OS == .Darwin { __bits: [4]c.uint32_t, } - // NOTE: unimplemented on FreeBSD. - // - // SIGRTMIN :: 65 - // SIGRTMAX :: 126 - SIGHUP :: 1 SIGQUIT :: 3 SIGTRAP :: 5 @@ -804,11 +784,6 @@ when ODIN_OS == .Darwin { __bits: [4]c.uint32_t, } - // NOTE: unimplemented on NetBSD. - // - // SIGRTMIN :: 33 - // SIGRTMAX :: 63 - SIGHUP :: 1 SIGQUIT :: 3 SIGTRAP :: 5 @@ -1146,9 +1121,6 @@ when ODIN_OS == .Darwin { [1024/(8 * size_of(c.ulong))]val, } - SIGRTMIN :: __libc_current_sigrtmin() - SIGRTMAX :: __libc_current_sigrtmax() - SIGHUP :: 1 SIGQUIT :: 3 SIGTRAP :: 5 @@ -1174,10 +1146,15 @@ when ODIN_OS == .Darwin { // NOTE: this is actually defined as `sigaction`, but due to the function with the same name // `_t` has been added. + sigaction_t :: struct { - sa_handler: proc "c" (Signal), - sa_flags: SA_Flags, - sa_mask: sigset_t, + using _: struct #raw_union { + sa_handler: proc "c" (Signal), /* [PSX] signal-catching function or one of the SIG_IGN or SIG_DFL */ + sa_sigaction: proc "c" (Signal, ^siginfo_t, rawptr), /* [PSX] signal-catching function */ + }, + sa_mask: sigset_t, /* [PSX] set of signals to be blocked during execution of the signal handling function */ + sa_flags: SA_Flags, /* [PSX] special flags */ + sa_restorer: proc "c" (), } SIG_BLOCK :: 0 @@ -1195,8 +1172,13 @@ when ODIN_OS == .Darwin { SS_ONSTACK :: 1 SS_DISABLE :: 2 - MINSIGSTKSZ :: 2048 - SIGSTKSZ :: 8192 + when ODIN_ARCH == .arm64 { + MINSIGSTKSZ :: 6144 + SIGSTKSZ :: 12288 + } else { + MINSIGSTKSZ :: 2048 + SIGSTKSZ :: 8192 + } stack_t :: struct { ss_sp: rawptr, /* [PSX] stack base or pointer */ @@ -1204,9 +1186,27 @@ when ODIN_OS == .Darwin { ss_size: c.size_t, /* [PSX] stack size */ } - // WARNING: This implementaion might be completely wrong and need to be reviewed and corrected. - siginfo_t :: struct { + @(private) + __SI_MAX_SIZE :: 128 + + when size_of(int) == 8 { + @(private) + _pad0 :: struct { + _pad0: c.int, + } + @(private) + __SI_PAD_SIZE :: (__SI_MAX_SIZE / size_of(c.int)) - 4 + + } else { + @(private) + _pad0 :: struct {} + @(private) + __SI_PAD_SIZE :: (__SI_MAX_SIZE / size_of(c.int)) - 3 + } + + siginfo_t :: struct #align(8) { si_signo: Signal, /* [PSX] signal number */ + si_errno: Errno, /* [PSX] errno value associated with this signal */ si_code: struct #raw_union { /* [PSX] specific more detailed codes per signal */ ill: ILL_Code, fpe: FPE_Code, @@ -1217,13 +1217,25 @@ when ODIN_OS == .Darwin { poll: POLL_Code, any: Any_Code, }, - si_errno: Errno, /* [PSX] errno value associated with this signal */ - si_pid: pid_t, /* [PSX] sending process ID */ - si_uid: uid_t, /* [PSX] real user ID of sending process */ - si_addr: rawptr, /* [PSX] address of faulting instruction */ - si_status: c.int, /* [PSX] exit value or signal */ - si_band: c.long, /* [PSX] band event for SIGPOLL */ - si_value: sigval, /* [PSX] signal value */ + __pad0: _pad0, + using _sifields: struct #raw_union { + _pad: [__SI_PAD_SIZE]c.int, + + using _: struct { + si_pid: pid_t, /* [PSX] sending process ID */ + si_uid: uid_t, /* [PSX] real user ID of sending process */ + using _: struct #raw_union { + si_status: c.int, /* [PSX] exit value or signal */ + si_value: sigval, /* [PSX] signal value */ + }, + }, + using _: struct { + si_addr: rawptr, /* [PSX] address of faulting instruction */ + }, + using _: struct { + si_band: c.long, /* [PSX] band event for SIGPOLL */ + }, + }, } ILL_ILLOPC :: 1 diff --git a/core/sys/posix/sys_ipc.odin b/core/sys/posix/sys_ipc.odin index 0ba9d2d5d..33f8fa259 100644 --- a/core/sys/posix/sys_ipc.odin +++ b/core/sys/posix/sys_ipc.odin @@ -36,7 +36,7 @@ IPC_Flag_Bits :: enum c.int { } IPC_Flags :: bit_set[IPC_Flag_Bits; c.int] -when ODIN_OS == .Darwin || ODIN_OS == .Linux { +when ODIN_OS == .Darwin { key_t :: distinct c.int32_t @@ -84,6 +84,32 @@ when ODIN_OS == .Darwin || ODIN_OS == .Linux { IPC_SET :: 1 IPC_STAT :: 2 +} else when ODIN_OS == .Linux { + + key_t :: distinct c.int32_t + + ipc_perm :: struct { + __ipc_perm_key: key_t, + uid: uid_t, /* [PSX] owner's user ID */ + gid: gid_t, /* [PSX] owner's group ID */ + cuid: uid_t, /* [PSX] creator's user ID */ + cgid: gid_t, /* [PSX] creator's group ID */ + mode: mode_t, /* [PSX] read/write perms */ + __ipc_perm_seq: c.int, + __pad1: c.long, + __pad2: c.long, + } + + IPC_CREAT :: 0o01000 + IPC_EXCL :: 0o02000 + IPC_NOWAIT :: 0o04000 + + IPC_PRIVATE :: key_t(0) + + IPC_RMID :: 0 + IPC_SET :: 1 + IPC_STAT :: 2 + } else { #panic("posix is unimplemented for the current target") } diff --git a/core/sys/posix/sys_mman.odin b/core/sys/posix/sys_mman.odin index d71a92639..2f4eb566b 100644 --- a/core/sys/posix/sys_mman.odin +++ b/core/sys/posix/sys_mman.odin @@ -191,11 +191,7 @@ when ODIN_OS == .Darwin || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS MCL_CURRENT :: 0x0001 MCL_FUTURE :: 0x0002 - when ODIN_OS == .Linux { - MAP_FAILED :: rawptr(~uintptr(-1)) - } else { - MAP_FAILED :: rawptr(~uintptr(0)) - } + MAP_FAILED :: rawptr(~uintptr(0)) POSIX_MADV_DONTNEED :: 4 POSIX_MADV_NORMAL :: 0 diff --git a/core/sys/posix/sys_resource.odin b/core/sys/posix/sys_resource.odin index ad944a7bb..55789ee95 100644 --- a/core/sys/posix/sys_resource.odin +++ b/core/sys/posix/sys_resource.odin @@ -103,7 +103,7 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS rlim_t :: distinct c.uint64_t - RLIM_INFINITY :: max(rlim_t) - 1 when ODIN_OS == .Linux else (rlim_t(1) << 63) - 1 + RLIM_INFINITY :: ~rlim_t(0) when ODIN_OS == .Linux else (rlim_t(1) << 63) - 1 RLIM_SAVED_MAX :: RLIM_INFINITY RLIM_SAVED_CUR :: RLIM_INFINITY @@ -145,10 +145,13 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS RLIMIT_FSIZE :: 1 RLIMIT_NOFILE :: 7 when ODIN_OS == .Linux else 8 RLIMIT_STACK :: 3 + when ODIN_OS == .Linux { RLIMIT_AS :: 9 + } else when ODIN_OS == .Darwin || ODIN_OS == .OpenBSD { + RLIMIT_AS :: 5 } else { - RLIMIT_AS :: 5 when ODIN_OS == .Darwin || ODIN_OS == .OpenBSD else 10 + RLIMIT_AS :: 10 } } else { diff --git a/core/sys/posix/sys_socket.odin b/core/sys/posix/sys_socket.odin index 185bb7722..e613f0a10 100644 --- a/core/sys/posix/sys_socket.odin +++ b/core/sys/posix/sys_socket.odin @@ -323,11 +323,7 @@ when ODIN_OS == .NetBSD { when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux { - when ODIN_OS == .Linux { - socklen_t :: distinct c.uint32_t - } else { - socklen_t :: distinct c.uint - } + socklen_t :: distinct c.uint _sa_family_t :: distinct c.uint8_t @@ -518,11 +514,7 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS } // The maximum backlog queue length for listen(). - when ODIN_OS == .Linux { - SOMAXCONN :: 4096 - } else { - SOMAXCONN :: 128 - } + SOMAXCONN :: 128 when ODIN_OS == .Linux { MSG_CTRUNC :: 0x008