Browse Source

Fix os.open on linux/osx

matt 6 years ago
parent
commit
0bcf53b513
2 changed files with 54 additions and 65 deletions
  1. 27 32
      core/os/os_linux.odin
  2. 27 33
      core/os/os_osx.odin

+ 27 - 32
core/os/os_linux.odin

@@ -80,37 +80,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;
@@ -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_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);
-	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
core/os/os_osx.odin

@@ -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);
 }
 }