Browse Source

mkdir_all: close last open file

CiD- 3 years ago
parent
commit
4b1822ade8
1 changed files with 6 additions and 6 deletions
  1. 6 6
      core/os/os2/path_linux.odin

+ 6 - 6
core/os/os2/path_linux.odin

@@ -35,7 +35,7 @@ _mkdir :: proc(path: string, perm: File_Mode) -> Error {
 _mkdir_all :: proc(path: string, perm: File_Mode) -> Error {
 	_mkdirat :: proc(dfd: Handle, path: []u8, perm: int, has_created: ^bool) -> Error {
 		if len(path) == 0 {
-			return nil
+			return _ok_or_error(unix.sys_close(int(dfd)))
 		}
 		i: int
 		for /**/; i < len(path) - 1 && path[i] != '/'; i += 1 {}
@@ -43,18 +43,18 @@ _mkdir_all :: proc(path: string, perm: File_Mode) -> Error {
 		new_dfd := unix.sys_openat(int(dfd), cstring(&path[0]), _OPENDIR_FLAGS)
 		switch new_dfd {
 		case -ENOENT:
-			res := unix.sys_mkdirat(int(dfd), cstring(&path[0]), perm)
-			if res < 0 {
+			if res := unix.sys_mkdirat(int(dfd), cstring(&path[0]), perm); res < 0 {
 				return _get_platform_error(res)
 			}
 			has_created^ = true
-			new_dfd = unix.sys_openat(int(dfd), cstring(&path[0]), _OPENDIR_FLAGS)
-			if new_dfd < 0 {
+			if new_dfd = unix.sys_openat(int(dfd), cstring(&path[0]), _OPENDIR_FLAGS); new_dfd < 0 {
 				return _get_platform_error(new_dfd)
 			}
 			fallthrough
 		case 0:
-			unix.sys_close(int(dfd))
+			if res := unix.sys_close(int(dfd)) < 0; res < 0 {
+				return _get_platform_error(res)
+			}
 			// skip consecutive '/'
 			for i += 1; i < len(path) && path[i] == '/'; i += 1 {}
 			return _mkdirat(Handle(new_dfd), path[i:], perm, has_created)