瀏覽代碼

Merge pull request #1150 from rasa-silva/fix_osx_absolute_path_from_handle

Fix `absolute_path_from_handle` on OSX
Jeroen van Rijn 4 年之前
父節點
當前提交
809b3a87af
共有 1 個文件被更改,包括 9 次插入6 次删除
  1. 9 6
      core/os/os_darwin.odin

+ 9 - 6
core/os/os_darwin.odin

@@ -6,7 +6,6 @@ foreign import pthread "System.framework"
 
 import "core:runtime"
 import "core:strings"
-import "core:strconv"
 import "core:c"
 
 Handle    :: distinct i32
@@ -273,6 +272,8 @@ W_OK :: 2 // Test for write permission
 X_OK :: 1 // Test for execute permission
 F_OK :: 0 // Test for file existance
 
+F_GETPATH :: 50 // return the full path of the fd
+
 foreign libc {
 	@(link_name="__error") __error :: proc() -> ^int ---
 
@@ -292,6 +293,7 @@ foreign libc {
 	@(link_name="closedir")         _unix_closedir      :: proc(dirp: Dir) -> c.int ---
 	@(link_name="rewinddir")        _unix_rewinddir     :: proc(dirp: Dir) ---
 	@(link_name="readdir_r")        _unix_readdir_r     :: proc(dirp: Dir, entry: ^Dirent, result: ^^Dirent) -> c.int ---
+	@(link_name = "fcntl")          _unix_fcntl         :: proc(fd: Handle, cmd: c.int, buf: ^byte) -> c.int ---
 
 	@(link_name="malloc")   _unix_malloc   :: proc(size: int) -> rawptr ---
 	@(link_name="calloc")   _unix_calloc   :: proc(num, size: int) -> rawptr ---
@@ -488,12 +490,13 @@ _readlink :: proc(path: string) -> (string, Errno) {
 
 absolute_path_from_handle :: proc(fd: Handle) -> (string, Errno) {
 	buf : [256]byte
-	fd_str := strconv.itoa( buf[:], cast(int)fd )
-
-	procfs_path := strings.concatenate( []string{ "/proc/self/fd/", fd_str } )
-	defer delete(procfs_path)
+	res  := _unix_fcntl(fd, F_GETPATH, &buf[0])
+	if	res != 0 {
+		return "", Errno(get_last_error())
+	}
 
-	return _readlink(procfs_path)
+	path := strings.clone_from_cstring(cstring(&buf[0]), context.temp_allocator)
+	return path, ERROR_NONE
 }
 
 absolute_path_from_relative :: proc(rel: string) -> (path: string, err: Errno) {