mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-04 22:58:46 +00:00
posix: fix file type checks in stat
This commit is contained in:
+33
-141
@@ -154,13 +154,10 @@ S_IRWXO :: mode_t{ .IROTH, .IWOTH, .IXOTH }
|
|||||||
Mode_Bits :: enum c.int {
|
Mode_Bits :: enum c.int {
|
||||||
// File type:
|
// File type:
|
||||||
|
|
||||||
IFBLK = log2(S_IFBLK), /* Block special */
|
IFCHR = log2(_S_IFCHR), /* Character special */
|
||||||
IFCHR = log2(S_IFCHR), /* Character special */
|
IFIFO = log2(_S_IFIFO), /* FIFO special */
|
||||||
IFIFO = log2(S_IFIFO), /* FIFO special */
|
IFREG = log2(_S_IFREG), /* Regular */
|
||||||
IFREG = log2(S_IFREG), /* Regular */
|
IFDIR = log2(_S_IFDIR), /* Directory */
|
||||||
IFDIR = log2(S_IFDIR), /* Directory */
|
|
||||||
IFLNK = log2(S_IFLNK), /* Symbolic link */
|
|
||||||
IFSOCK = log2(S_IFSOCK), /* Socket */
|
|
||||||
|
|
||||||
// Permissions:
|
// Permissions:
|
||||||
|
|
||||||
@@ -183,64 +180,53 @@ Mode_Bits :: enum c.int {
|
|||||||
mode_t :: bit_set[Mode_Bits; _mode_t]
|
mode_t :: bit_set[Mode_Bits; _mode_t]
|
||||||
#assert(size_of(mode_t) == size_of(_mode_t))
|
#assert(size_of(mode_t) == size_of(_mode_t))
|
||||||
|
|
||||||
// NOTE: making these `.IFREG in m` would probably be fine too,
|
S_IFMT :: mode_t{ .IFCHR, .IFREG, .IFDIR, .IFIFO }
|
||||||
// but implementations make this an exclusive check so lets stick to it.
|
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.
|
// Test for a block special file.
|
||||||
S_ISBLK :: #force_inline proc "contextless" (m: mode_t) -> bool {
|
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.
|
// Test for a character special file.
|
||||||
S_ISCHR :: #force_inline proc "contextless" (m: mode_t) -> bool {
|
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.
|
// Test for a pipe or FIFO special file.
|
||||||
S_ISFIFO :: #force_inline proc "contextless" (m: mode_t) -> bool {
|
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.
|
// Test for a regular file.
|
||||||
S_ISREG :: #force_inline proc "contextless" (m: mode_t) -> bool {
|
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.
|
// Test for a directory.
|
||||||
S_ISDIR :: #force_inline proc "contextless" (m: mode_t) -> bool {
|
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.
|
// Test for a symbolic link.
|
||||||
S_ISLNK :: #force_inline proc "contextless" (m: mode_t) -> bool {
|
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.
|
// Test for a socket.
|
||||||
S_ISSOCK :: #force_inline proc "contextless" (m: mode_t) -> bool {
|
S_ISSOCK :: #force_inline proc "contextless" (m: mode_t) -> bool {
|
||||||
return (m & _S_IFMT) == { .IFSOCK }
|
return (m & S_IFMT) == S_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)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_S_IRWXU :: 0o000700
|
_S_IRWXU :: 0o000700
|
||||||
@@ -262,6 +248,16 @@ _S_ISUID :: 0o004000
|
|||||||
_S_ISGID :: 0o002000
|
_S_ISGID :: 0o002000
|
||||||
_S_ISVTX :: 0o001000
|
_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 {
|
when ODIN_OS == .NetBSD {
|
||||||
@(private) LSTAT :: "__stat50"
|
@(private) LSTAT :: "__stat50"
|
||||||
@(private) LFSTAT :: "__fstat50"
|
@(private) LFSTAT :: "__fstat50"
|
||||||
@@ -304,32 +300,6 @@ when ODIN_OS == .Darwin {
|
|||||||
st_qspare: [2]c.int64_t, /* RESERVED */
|
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_NOW :: -1
|
||||||
UTIME_OMIT :: -2
|
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_NOW :: -1
|
||||||
UTIME_OMIT :: -2
|
UTIME_OMIT :: -2
|
||||||
|
|
||||||
@@ -449,32 +393,6 @@ when ODIN_OS == .Darwin {
|
|||||||
st_spare: [2]c.uint32_t,
|
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_NOW :: (1 << 30) - 1
|
||||||
UTIME_OMIT :: (1 << 30) - 2
|
UTIME_OMIT :: (1 << 30) - 2
|
||||||
|
|
||||||
@@ -506,32 +424,6 @@ when ODIN_OS == .Darwin {
|
|||||||
st_birthtimespec: timespec,
|
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_NOW :: -2
|
||||||
UTIME_OMIT :: -1
|
UTIME_OMIT :: -1
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user