Fix os.open on linux/osx

This commit is contained in:
matt
2018-12-26 04:31:12 -07:00
parent 956dd26aa0
commit 0bcf53b513
2 changed files with 54 additions and 65 deletions
+27 -32
View File
@@ -80,37 +80,37 @@ Stat :: struct {
}; };
// File type // File type
S_IFMT :: 0170000; // Type of file mask S_IFMT :: 0o170000; // Type of file mask
S_IFIFO :: 0010000; // Named pipe (fifo) S_IFIFO :: 0o010000; // Named pipe (fifo)
S_IFCHR :: 0020000; // Character special S_IFCHR :: 0o020000; // Character special
S_IFDIR :: 0040000; // Directory S_IFDIR :: 0o040000; // Directory
S_IFBLK :: 0060000; // Block special S_IFBLK :: 0o060000; // Block special
S_IFREG :: 0100000; // Regular S_IFREG :: 0o100000; // Regular
S_IFLNK :: 0120000; // Symbolic link S_IFLNK :: 0o120000; // Symbolic link
S_IFSOCK :: 0140000; // Socket 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_IRWXU :: 0o0700; // RWX mask for owner
S_IRUSR :: 0000400; // R for owner S_IRUSR :: 0o0400; // R for owner
S_IWUSR :: 0000200; // W for owner S_IWUSR :: 0o0200; // W for owner
S_IXUSR :: 0000100; // X 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_IRWXG :: 0o0070; // RWX mask for group
S_IRGRP :: 0000040; // R for group S_IRGRP :: 0o0040; // R for group
S_IWGRP :: 0000020; // W for group S_IWGRP :: 0o0020; // W for group
S_IXGRP :: 0000010; // X 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_IRWXO :: 0o0007; // RWX mask for other
S_IROTH :: 0000004; // R for other S_IROTH :: 0o0004; // R for other
S_IWOTH :: 0000002; // W for other S_IWOTH :: 0o0002; // W for other
S_IXOTH :: 0000001; // X for other S_IXOTH :: 0o0001; // X for other
S_ISUID :: 0004000; // Set user id on execution S_ISUID :: 0o4000; // Set user id on execution
S_ISGID :: 0002000; // Set group id on execution S_ISGID :: 0o2000; // Set group id on execution
S_ISVTX :: 0001000; // Directory restrcted delete 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;
@@ -143,7 +143,7 @@ CLOCK_REALTIME_ALARM :: 8;
CLOCK_BOOTTIME_ALARM :: 9; CLOCK_BOOTTIME_ALARM :: 9;
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(fd: Handle) -> i32 ---; @(link_name="close") _unix_close :: proc(fd: Handle) -> i32 ---;
@(link_name="read") _unix_read :: proc(fd: Handle, buf: rawptr, size: int) -> int ---; @(link_name="read") _unix_read :: proc(fd: Handle, buf: rawptr, size: int) -> int ---;
@(link_name="write") _unix_write :: proc(fd: Handle, buf: rawptr, size: int) -> int ---; @(link_name="write") _unix_write :: proc(fd: Handle, buf: rawptr, size: int) -> int ---;
@@ -171,20 +171,15 @@ 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 :: proc(path: string, flags: int = O_RDONLY, mode: int = 0) -> (Handle, Errno) {
open_simple :: proc(path: string, mode: int) -> (Handle, Errno) {
cstr := strings.new_cstring(path); cstr := strings.new_cstring(path);
handle := _unix_open(cstr, mode); handle := _unix_open(cstr, flags, mode);
delete(cstr); 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);
+27 -33
View File
@@ -81,37 +81,37 @@ Stat :: struct {
}; };
// File type // File type
S_IFMT :: 0170000; // Type of file mask S_IFMT :: 0o170000; // Type of file mask
S_IFIFO :: 0010000; // Named pipe (fifo) S_IFIFO :: 0o010000; // Named pipe (fifo)
S_IFCHR :: 0020000; // Character special S_IFCHR :: 0o020000; // Character special
S_IFDIR :: 0040000; // Directory S_IFDIR :: 0o040000; // Directory
S_IFBLK :: 0060000; // Block special S_IFBLK :: 0o060000; // Block special
S_IFREG :: 0100000; // Regular S_IFREG :: 0o100000; // Regular
S_IFLNK :: 0120000; // Symbolic link S_IFLNK :: 0o120000; // Symbolic link
S_IFSOCK :: 0140000; // Socket 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_IRWXU :: 0o0700; // RWX mask for owner
S_IRUSR :: 0000400; // R for owner S_IRUSR :: 0o0400; // R for owner
S_IWUSR :: 0000200; // W for owner S_IWUSR :: 0o0200; // W for owner
S_IXUSR :: 0000100; // X 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_IRWXG :: 0o0070; // RWX mask for group
S_IRGRP :: 0000040; // R for group S_IRGRP :: 0o0040; // R for group
S_IWGRP :: 0000020; // W for group S_IWGRP :: 0o0020; // W for group
S_IXGRP :: 0000010; // X 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_IRWXO :: 0o0007; // RWX mask for other
S_IROTH :: 0000004; // R for other S_IROTH :: 0o0004; // R for other
S_IWOTH :: 0000002; // W for other S_IWOTH :: 0o0002; // W for other
S_IXOTH :: 0000001; // X for other S_IXOTH :: 0o0001; // X for other
S_ISUID :: 0004000; // Set user id on execution S_ISUID :: 0o4000; // Set user id on execution
S_ISGID :: 0002000; // Set group id on execution S_ISGID :: 0o2000; // Set group id on execution
S_ISVTX :: 0001000; // Directory restrcted delete 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 :: proc(path: string, flags: int = O_RDONLY, mode: int = 0) -> (Handle, Errno) {
open_simple :: proc(path: string, mode: int) -> (Handle, Errno) {
cstr := strings.new_cstring(path); cstr := strings.new_cstring(path);
defer delete(cstr); handle := _unix_open(cstr, flags, mode);
handle := _unix_open(cstr, 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);
} }