|
@@ -81,37 +81,37 @@ Stat :: struct {
|
|
};
|
|
};
|
|
|
|
|
|
// File type
|
|
// File type
|
|
-S_IFMT :: 0170000; // Type of file mask
|
|
|
|
-S_IFIFO :: 0010000; // Named pipe (fifo)
|
|
|
|
-S_IFCHR :: 0020000; // Character special
|
|
|
|
-S_IFDIR :: 0040000; // Directory
|
|
|
|
-S_IFBLK :: 0060000; // Block special
|
|
|
|
-S_IFREG :: 0100000; // Regular
|
|
|
|
-S_IFLNK :: 0120000; // Symbolic link
|
|
|
|
-S_IFSOCK :: 0140000; // Socket
|
|
|
|
|
|
+S_IFMT :: 0o170000; // Type of file mask
|
|
|
|
+S_IFIFO :: 0o010000; // Named pipe (fifo)
|
|
|
|
+S_IFCHR :: 0o020000; // Character special
|
|
|
|
+S_IFDIR :: 0o040000; // Directory
|
|
|
|
+S_IFBLK :: 0o060000; // Block special
|
|
|
|
+S_IFREG :: 0o100000; // Regular
|
|
|
|
+S_IFLNK :: 0o120000; // Symbolic link
|
|
|
|
+S_IFSOCK :: 0o140000; // Socket
|
|
|
|
|
|
// File mode
|
|
// File mode
|
|
// Read, write, execute/search by owner
|
|
// Read, write, execute/search by owner
|
|
-S_IRWXU :: 0000700; // RWX mask for owner
|
|
|
|
-S_IRUSR :: 0000400; // R for owner
|
|
|
|
-S_IWUSR :: 0000200; // W for owner
|
|
|
|
-S_IXUSR :: 0000100; // X for owner
|
|
|
|
|
|
+S_IRWXU :: 0o0700; // RWX mask for owner
|
|
|
|
+S_IRUSR :: 0o0400; // R for owner
|
|
|
|
+S_IWUSR :: 0o0200; // W for owner
|
|
|
|
+S_IXUSR :: 0o0100; // X for owner
|
|
|
|
|
|
// Read, write, execute/search by group
|
|
// Read, write, execute/search by group
|
|
-S_IRWXG :: 0000070; // RWX mask for group
|
|
|
|
-S_IRGRP :: 0000040; // R for group
|
|
|
|
-S_IWGRP :: 0000020; // W for group
|
|
|
|
-S_IXGRP :: 0000010; // X for group
|
|
|
|
|
|
+S_IRWXG :: 0o0070; // RWX mask for group
|
|
|
|
+S_IRGRP :: 0o0040; // R for group
|
|
|
|
+S_IWGRP :: 0o0020; // W for group
|
|
|
|
+S_IXGRP :: 0o0010; // X for group
|
|
|
|
|
|
// Read, write, execute/search by others
|
|
// Read, write, execute/search by others
|
|
-S_IRWXO :: 0000007; // RWX mask for other
|
|
|
|
-S_IROTH :: 0000004; // R for other
|
|
|
|
-S_IWOTH :: 0000002; // W for other
|
|
|
|
-S_IXOTH :: 0000001; // X for other
|
|
|
|
|
|
+S_IRWXO :: 0o0007; // RWX mask for other
|
|
|
|
+S_IROTH :: 0o0004; // R for other
|
|
|
|
+S_IWOTH :: 0o0002; // W for other
|
|
|
|
+S_IXOTH :: 0o0001; // X for other
|
|
|
|
|
|
-S_ISUID :: 0004000; // Set user id on execution
|
|
|
|
-S_ISGID :: 0002000; // Set group id on execution
|
|
|
|
-S_ISVTX :: 0001000; // Directory restrcted delete
|
|
|
|
|
|
+S_ISUID :: 0o4000; // Set user id on execution
|
|
|
|
+S_ISGID :: 0o2000; // Set group id on execution
|
|
|
|
+S_ISVTX :: 0o1000; // Directory restrcted delete
|
|
|
|
|
|
S_ISLNK :: inline proc(m: u32) -> bool do return (m & S_IFMT) == S_IFLNK;
|
|
S_ISLNK :: inline proc(m: u32) -> bool do return (m & S_IFMT) == S_IFLNK;
|
|
S_ISREG :: inline proc(m: u32) -> bool do return (m & S_IFMT) == S_IFREG;
|
|
S_ISREG :: inline proc(m: u32) -> bool do return (m & S_IFMT) == S_IFREG;
|
|
@@ -127,7 +127,7 @@ X_OK :: 1; // Test for execute permission
|
|
F_OK :: 0; // Test for file existance
|
|
F_OK :: 0; // Test for file existance
|
|
|
|
|
|
foreign libc {
|
|
foreign libc {
|
|
- @(link_name="open") _unix_open :: proc(path: cstring, mode: int) -> Handle ---;
|
|
|
|
|
|
+ @(link_name="open") _unix_open :: proc(path: cstring, flags: int, #c_vararg mode: ..any) -> Handle ---;
|
|
@(link_name="close") _unix_close :: proc(handle: Handle) ---;
|
|
@(link_name="close") _unix_close :: proc(handle: Handle) ---;
|
|
@(link_name="read") _unix_read :: proc(handle: Handle, buffer: rawptr, count: int) -> int ---;
|
|
@(link_name="read") _unix_read :: proc(handle: Handle, buffer: rawptr, count: int) -> int ---;
|
|
@(link_name="write") _unix_write :: proc(handle: Handle, buffer: rawptr, count: int) -> int ---;
|
|
@(link_name="write") _unix_write :: proc(handle: Handle, buffer: rawptr, count: int) -> int ---;
|
|
@@ -152,22 +152,16 @@ foreign dl {
|
|
@(link_name="dlerror") _unix_dlerror :: proc() -> cstring ---;
|
|
@(link_name="dlerror") _unix_dlerror :: proc() -> cstring ---;
|
|
}
|
|
}
|
|
|
|
|
|
-// TODO(zangent): Change this to just `open` when Bill fixes overloading.
|
|
|
|
-open_simple :: proc(path: string, mode: int) -> (Handle, Errno) {
|
|
|
|
|
|
+open :: proc(path: string, flags: int = O_RDONLY, mode: int = 0) -> (Handle, Errno) {
|
|
cstr := strings.new_cstring(path);
|
|
cstr := strings.new_cstring(path);
|
|
- defer delete(cstr);
|
|
|
|
- handle := _unix_open(cstr, mode);
|
|
|
|
|
|
+ handle := _unix_open(cstr, flags, mode);
|
|
|
|
+ delete(cstr);
|
|
if handle == -1 {
|
|
if handle == -1 {
|
|
return 0, 1;
|
|
return 0, 1;
|
|
}
|
|
}
|
|
return handle, 0;
|
|
return handle, 0;
|
|
}
|
|
}
|
|
|
|
|
|
-// NOTE(zangent): This is here for compatability reasons. Should this be here?
|
|
|
|
-open :: proc(path: string, mode: int = O_RDONLY, perm: u32 = 0) -> (Handle, Errno) {
|
|
|
|
- return open_simple(path, mode);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
close :: proc(fd: Handle) {
|
|
close :: proc(fd: Handle) {
|
|
_unix_close(fd);
|
|
_unix_close(fd);
|
|
}
|
|
}
|