Correct cleanpath_from_handle for os.fstat

This commit is contained in:
gingerBill
2022-03-08 10:01:44 +00:00
parent 8f897de267
commit 31959b0751
+10 -33
View File
@@ -132,26 +132,11 @@ cleanpath_strip_prefix :: proc(buf: []u16) -> []u16 {
@(private) @(private)
cleanpath_from_handle :: proc(fd: Handle) -> (string, Errno) { cleanpath_from_handle :: proc(fd: Handle) -> (string, Errno) {
if fd == 0 { buf, err := cleanpath_from_handle_u16(fd)
return "", ERROR_INVALID_HANDLE if err != 0 {
return "", err
} }
h := win32.HANDLE(fd) return win32.utf16_to_utf8(buf, context.allocator), err
MAX_PATH := win32.DWORD(260) + 1
buf: []u16
for {
buf = make([]u16, MAX_PATH, context.temp_allocator)
err := win32.GetFinalPathNameByHandleW(h, raw_data(buf), MAX_PATH, 0)
switch Errno(err) {
case ERROR_PATH_NOT_FOUND, ERROR_INVALID_PARAMETER:
return "", Errno(err)
case ERROR_NOT_ENOUGH_MEMORY:
MAX_PATH = MAX_PATH*2 + 1
continue
}
break
}
return cleanpath_from_buf(buf), ERROR_NONE
} }
@(private) @(private)
cleanpath_from_handle_u16 :: proc(fd: Handle) -> ([]u16, Errno) { cleanpath_from_handle_u16 :: proc(fd: Handle) -> ([]u16, Errno) {
@@ -160,21 +145,13 @@ cleanpath_from_handle_u16 :: proc(fd: Handle) -> ([]u16, Errno) {
} }
h := win32.HANDLE(fd) h := win32.HANDLE(fd)
MAX_PATH := win32.DWORD(260) + 1 n := win32.GetFinalPathNameByHandleW(h, nil, 0, 0)
buf: []u16 if n == 0 {
for { return nil, Errno(win32.GetLastError())
buf = make([]u16, MAX_PATH, context.temp_allocator)
err := win32.GetFinalPathNameByHandleW(h, raw_data(buf), MAX_PATH, 0)
switch Errno(err) {
case ERROR_PATH_NOT_FOUND, ERROR_INVALID_PARAMETER:
return nil, Errno(err)
case ERROR_NOT_ENOUGH_MEMORY:
MAX_PATH = MAX_PATH*2 + 1
continue
}
break
} }
return cleanpath_strip_prefix(buf), ERROR_NONE buf := make([]u16, max(n, win32.DWORD(260))+1, context.temp_allocator)
buf_len := win32.GetFinalPathNameByHandleW(h, raw_data(buf), n, 0)
return buf[:buf_len], ERROR_NONE
} }
@(private) @(private)
cleanpath_from_buf :: proc(buf: []u16) -> string { cleanpath_from_buf :: proc(buf: []u16) -> string {