Browse Source

posix: fix file type checks in stat

Laytan Laats 1 year ago
parent
commit
e05fddc001
1 changed files with 33 additions and 141 deletions
  1. 33 141
      core/sys/posix/sys_stat.odin

+ 33 - 141
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