Browse Source

Fix read_dir on OSX

Ricardo Silva 3 years ago
parent
commit
01aa0c4151
2 changed files with 6 additions and 7 deletions
  1. 0 2
      core/os/dir_darwin.odin
  2. 6 5
      core/os/os_darwin.odin

+ 0 - 2
core/os/dir_darwin.odin

@@ -19,8 +19,6 @@ read_dir :: proc(fd: Handle, n: int, allocator := context.allocator) -> (fi: []F
 		return
 		return
 	}
 	}
 
 
-	defer delete(dirpath)
-
 	n := n
 	n := n
 	size := n
 	size := n
 	if n <= 0 {
 	if n <= 0 {

+ 6 - 5
core/os/os_darwin.odin

@@ -215,13 +215,14 @@ OS_Stat :: struct {
 	_reserve2:     i64,  // RESERVED
 	_reserve2:     i64,  // RESERVED
 }
 }
 
 
-// NOTE(laleksic, 2021-01-21): Comment and rename these to match OS_Stat above
+DARWIN_MAXPATHLEN :: 1024
 Dirent :: struct {
 Dirent :: struct {
 	ino:    u64,
 	ino:    u64,
 	off:    u64,
 	off:    u64,
 	reclen: u16,
 	reclen: u16,
+	namlen: u16,
 	type:   u8,
 	type:   u8,
-	name:   [256]byte,
+	name:   [DARWIN_MAXPATHLEN]byte,
 }
 }
 
 
 Dir :: distinct rawptr // DIR*
 Dir :: distinct rawptr // DIR*
@@ -289,10 +290,10 @@ foreign libc {
 	@(link_name="fstat64")          _unix_fstat         :: proc(fd: Handle, stat: ^OS_Stat) -> c.int ---
 	@(link_name="fstat64")          _unix_fstat         :: proc(fd: Handle, stat: ^OS_Stat) -> c.int ---
 	@(link_name="readlink")         _unix_readlink      :: proc(path: cstring, buf: ^byte, bufsiz: c.size_t) -> c.ssize_t ---
 	@(link_name="readlink")         _unix_readlink      :: proc(path: cstring, buf: ^byte, bufsiz: c.size_t) -> c.ssize_t ---
 	@(link_name="access")           _unix_access        :: proc(path: cstring, mask: int) -> int ---
 	@(link_name="access")           _unix_access        :: proc(path: cstring, mask: int) -> int ---
-	@(link_name="fdopendir")        _unix_fdopendir     :: proc(fd: Handle) -> Dir ---
+	@(link_name="fdopendir$INODE64") _unix_fdopendir    :: proc(fd: Handle) -> Dir ---
 	@(link_name="closedir")         _unix_closedir      :: proc(dirp: Dir) -> c.int ---
 	@(link_name="closedir")         _unix_closedir      :: proc(dirp: Dir) -> c.int ---
 	@(link_name="rewinddir")        _unix_rewinddir     :: proc(dirp: Dir) ---
 	@(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="readdir_r$INODE64") _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="fcntl")            _unix_fcntl         :: proc(fd: Handle, cmd: c.int, buf: ^byte) -> c.int ---
 
 
 	@(link_name="malloc")   _unix_malloc   :: proc(size: int) -> rawptr ---
 	@(link_name="malloc")   _unix_malloc   :: proc(size: int) -> rawptr ---
@@ -450,7 +451,7 @@ _rewinddir :: proc(dirp: Dir) {
 _readdir :: proc(dirp: Dir) -> (entry: Dirent, err: Errno, end_of_stream: bool) {
 _readdir :: proc(dirp: Dir) -> (entry: Dirent, err: Errno, end_of_stream: bool) {
 	result: ^Dirent
 	result: ^Dirent
 	rc := _unix_readdir_r(dirp, &entry, &result)
 	rc := _unix_readdir_r(dirp, &entry, &result)
-
+	
 	if rc != 0 {
 	if rc != 0 {
 		err = Errno(get_last_error())
 		err = Errno(get_last_error())
 		return
 		return