aboutsummaryrefslogtreecommitdiff
path: root/core/sys
diff options
context:
space:
mode:
authorLaytan Laats <laytanlaats@hotmail.com>2024-08-02 21:42:07 +0200
committerLaytan Laats <laytanlaats@hotmail.com>2024-08-14 01:44:37 +0200
commite05fddc00121f1e244fa141c9dc35d4dcee69b98 (patch)
tree3e90f15d3f6ed05dbc3b343b3488dcaee582be5f /core/sys
parent406e60f5ddebb39c94a4447181dd211a1ec1b791 (diff)
posix: fix file type checks in stat
Diffstat (limited to 'core/sys')
-rw-r--r--core/sys/posix/sys_stat.odin174
1 files changed, 33 insertions, 141 deletions
diff --git a/core/sys/posix/sys_stat.odin b/core/sys/posix/sys_stat.odin
index 016f1b1e6..dd66d7d14 100644
--- a/core/sys/posix/sys_stat.odin
+++ b/core/sys/posix/sys_stat.odin
@@ -154,13 +154,10 @@ S_IRWXO :: mode_t{ .IROTH, .IWOTH, .IXOTH }
Mode_Bits :: enum c.int {
// File type:
- IFBLK = log2(S_IFBLK), /* Block special */
- IFCHR = log2(S_IFCHR), /* Character special */
- IFIFO = log2(S_IFIFO), /* FIFO special */
- IFREG = log2(S_IFREG), /* Regular */
- IFDIR = log2(S_IFDIR), /* Directory */
- IFLNK = log2(S_IFLNK), /* Symbolic link */
- IFSOCK = log2(S_IFSOCK), /* Socket */
+ IFCHR = log2(_S_IFCHR), /* Character special */
+ IFIFO = log2(_S_IFIFO), /* FIFO special */
+ IFREG = log2(_S_IFREG), /* Regular */
+ IFDIR = log2(_S_IFDIR), /* Directory */
// Permissions:
@@ -183,64 +180,53 @@ Mode_Bits :: enum c.int {
mode_t :: bit_set[Mode_Bits; _mode_t]
#assert(size_of(mode_t) == size_of(_mode_t))
-// NOTE: making these `.IFREG in m` would probably be fine too,
-// but implementations make this an exclusive check so lets stick to it.
+S_IFMT :: mode_t{ .IFCHR, .IFREG, .IFDIR, .IFIFO }
+S_IFSOCK :: mode_t{ .IFREG, .IFDIR }
+S_IFLNK :: mode_t{ .IFREG, .IFCHR }
+S_IFBLK :: mode_t{ .IFDIR, .IFCHR }
+S_IFIFO :: mode_t{ .IFIFO }
+S_IFCHR :: mode_t{ .IFCHR }
+S_IFDIR :: mode_t{ .IFDIR }
+S_IFREG :: mode_t{ .IFREG }
-_S_IFMT :: mode_t{ .IFBLK, .IFCHR, .IFIFO, .IFREG, .IFDIR, .IFLNK, .IFSOCK }
+#assert(_S_IFMT == _S_IFCHR|_S_IFREG|_S_IFDIR|_S_IFIFO)
+#assert(_S_IFSOCK == _S_IFREG|_S_IFDIR)
+#assert(_S_IFLNK == _S_IFREG|_S_IFCHR)
+#assert(_S_IFBLK == _S_IFDIR|_S_IFCHR)
// Test for a block special file.
S_ISBLK :: #force_inline proc "contextless" (m: mode_t) -> bool {
- return (m & _S_IFMT) == { .IFBLK }
+ return (m & S_IFMT) == S_IFBLK
}
// Test for a character special file.
S_ISCHR :: #force_inline proc "contextless" (m: mode_t) -> bool {
- return (m & _S_IFMT) == { .IFCHR }
+ return (m & S_IFMT) == S_IFCHR
}
// Test for a pipe or FIFO special file.
S_ISFIFO :: #force_inline proc "contextless" (m: mode_t) -> bool {
- return (m & _S_IFMT) == { .IFIFO }
+ return (m & S_IFMT) == S_IFIFO
}
// Test for a regular file.
S_ISREG :: #force_inline proc "contextless" (m: mode_t) -> bool {
- return (m & _S_IFMT) == { .IFREG }
+ return (m & S_IFMT) == S_IFREG
}
// Test for a directory.
S_ISDIR :: #force_inline proc "contextless" (m: mode_t) -> bool {
- return (m & _S_IFMT) == { .IFDIR }
+ return (m & S_IFMT) == S_IFDIR
}
// Test for a symbolic link.
S_ISLNK :: #force_inline proc "contextless" (m: mode_t) -> bool {
- return (m & _S_IFMT) == { .IFLNK }
+ return (m & S_IFMT) == S_IFLNK
}
// Test for a socket.
S_ISSOCK :: #force_inline proc "contextless" (m: mode_t) -> bool {
- return (m & _S_IFMT) == { .IFSOCK }
-}
-
-// Test for a message queue.
-S_TYPEISMQ :: #force_inline proc "contextless" (m: mode_t) -> bool {
- return _S_TYPEISMQ(m)
-}
-
-// Test for a semaphore.
-S_TYPEISSEM :: #force_inline proc "contextless" (m: mode_t) -> bool {
- return _S_TYPEISSEM(m)
-}
-
-// Test for a shared memory object.
-S_TYPEISSHM :: #force_inline proc "contextless" (m: mode_t) -> bool {
- return _S_TYPEISSHM(m)
-}
-
-// Test macro for a typed memory object.
-S_TYPEISTMO :: #force_inline proc "contextless" (m: mode_t) -> bool {
- return _S_TYPEISTMO(m)
+ return (m & S_IFMT) == S_IFSOCK
}
_S_IRWXU :: 0o000700
@@ -262,6 +248,16 @@ _S_ISUID :: 0o004000
_S_ISGID :: 0o002000
_S_ISVTX :: 0o001000
+_S_IFBLK :: 0o060000
+_S_IFCHR :: 0o020000
+_S_IFIFO :: 0o010000
+_S_IFREG :: 0o100000
+_S_IFDIR :: 0o040000
+_S_IFLNK :: 0o120000
+_S_IFSOCK :: 0o140000
+
+_S_IFMT :: 0o170000
+
when ODIN_OS == .NetBSD {
@(private) LSTAT :: "__stat50"
@(private) LFSTAT :: "__fstat50"
@@ -304,32 +300,6 @@ when ODIN_OS == .Darwin {
st_qspare: [2]c.int64_t, /* RESERVED */
}
- S_IFBLK :: 0o060000
- S_IFCHR :: 0o020000
- S_IFIFO :: 0o010000
- S_IFREG :: 0o100000
- S_IFDIR :: 0o040000
- S_IFLNK :: 0o120000
- S_IFSOCK :: 0o140000
-
- __S_IFMT :: 0o170000
-
- _S_TYPEISMQ :: #force_inline proc "contextless" (m: mode_t) -> bool {
- return false
- }
-
- _S_TYPEISSEM :: #force_inline proc "contextless" (m: mode_t) -> bool {
- return false
- }
-
- _S_TYPEISSHM :: #force_inline proc "contextless" (m: mode_t) -> bool {
- return false
- }
-
- _S_TYPEISTMO :: #force_inline proc "contextless" (m: mode_t) -> bool {
- return false
- }
-
UTIME_NOW :: -1
UTIME_OMIT :: -2
@@ -391,32 +361,6 @@ when ODIN_OS == .Darwin {
}
}
- S_IFBLK :: 0o060000
- S_IFCHR :: 0o020000
- S_IFIFO :: 0o010000
- S_IFREG :: 0o100000
- S_IFDIR :: 0o040000
- S_IFLNK :: 0o120000
- S_IFSOCK :: 0o140000
-
- __S_IFMT :: 0o170000
-
- _S_TYPEISMQ :: #force_inline proc "contextless" (m: mode_t) -> bool {
- return false
- }
-
- _S_TYPEISSEM :: #force_inline proc "contextless" (m: mode_t) -> bool {
- return false
- }
-
- _S_TYPEISSHM :: #force_inline proc "contextless" (m: mode_t) -> bool {
- return false
- }
-
- _S_TYPEISTMO :: #force_inline proc "contextless" (m: mode_t) -> bool {
- return false
- }
-
UTIME_NOW :: -1
UTIME_OMIT :: -2
@@ -449,32 +393,6 @@ when ODIN_OS == .Darwin {
st_spare: [2]c.uint32_t,
}
- S_IFBLK :: 0o060000
- S_IFCHR :: 0o020000
- S_IFIFO :: 0o010000
- S_IFREG :: 0o100000
- S_IFDIR :: 0o040000
- S_IFLNK :: 0o120000
- S_IFSOCK :: 0o140000
-
- __S_IFMT :: 0o170000
-
- _S_TYPEISMQ :: #force_inline proc "contextless" (m: mode_t) -> bool {
- return false
- }
-
- _S_TYPEISSEM :: #force_inline proc "contextless" (m: mode_t) -> bool {
- return false
- }
-
- _S_TYPEISSHM :: #force_inline proc "contextless" (m: mode_t) -> bool {
- return false
- }
-
- _S_TYPEISTMO :: #force_inline proc "contextless" (m: mode_t) -> bool {
- return false
- }
-
UTIME_NOW :: (1 << 30) - 1
UTIME_OMIT :: (1 << 30) - 2
@@ -506,32 +424,6 @@ when ODIN_OS == .Darwin {
st_birthtimespec: timespec,
}
- S_IFBLK :: 0o060000
- S_IFCHR :: 0o020000
- S_IFIFO :: 0o010000
- S_IFREG :: 0o100000
- S_IFDIR :: 0o040000
- S_IFLNK :: 0o120000
- S_IFSOCK :: 0o140000
-
- __S_IFMT :: 0o170000
-
- _S_TYPEISMQ :: #force_inline proc "contextless" (m: mode_t) -> bool {
- return false
- }
-
- _S_TYPEISSEM :: #force_inline proc "contextless" (m: mode_t) -> bool {
- return false
- }
-
- _S_TYPEISSHM :: #force_inline proc "contextless" (m: mode_t) -> bool {
- return false
- }
-
- _S_TYPEISTMO :: #force_inline proc "contextless" (m: mode_t) -> bool {
- return false
- }
-
UTIME_NOW :: -2
UTIME_OMIT :: -1