Browse Source

Implement `init_long_path_support`

gingerBill 1 year ago
parent
commit
efa8c92bab
3 changed files with 28 additions and 8 deletions
  1. 1 4
      core/os/os2/errors_windows.odin
  2. 1 1
      core/os/os2/file_windows.odin
  3. 26 3
      core/os/os2/path_windows.odin

+ 1 - 4
core/os/os2/errors_windows.odin

@@ -17,10 +17,7 @@ _error_string :: proc(errno: i32) -> string {
 	if idx, ok := slice.binary_search(ti.values, err); ok {
 		return ti.names[idx]
 	}
-
-	// TODO(bill): _error_string for windows
-	// FormatMessageW
-	return ""
+	return "<unknown platform error>"
 }
 
 _get_platform_error :: proc() -> Error {

+ 1 - 1
core/os/os2/file_windows.odin

@@ -231,7 +231,7 @@ _read :: proc(f: ^File_Impl, p: []byte) -> (n: i64, err: Error) {
 			return 0, nil
 		}
 
-		// TODO(bill): should this be moved to `_File` instead?
+		// TODO(bill): should this be moved to `File_Impl` instead?
 		BUF_SIZE :: 386
 		buf16: [BUF_SIZE]u16
 		buf8: [4*BUF_SIZE]u8

+ 26 - 3
core/os/os2/path_windows.odin

@@ -139,10 +139,33 @@ can_use_long_paths: bool
 
 @(init)
 init_long_path_support :: proc() {
-	// TODO(bill): init_long_path_support
-	// ADD THIS SHIT
-	// registry_path := win32.L(`Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled`)
 	can_use_long_paths = false
+
+	key: win32.HKEY
+	res := win32.RegOpenKeyExW(win32.HKEY_LOCAL_MACHINE, win32.L(`SYSTEM\CurrentControlSet\Control\FileSystem`), 0, win32.KEY_READ, &key)
+	defer win32.RegCloseKey(key)
+	if res != 0 {
+		return
+	}
+
+	value: u32
+	size := u32(size_of(value))
+	res = win32.RegGetValueW(
+		key,
+		nil,
+		win32.L("LongPathsEnabled"),
+		win32.RRF_RT_ANY,
+		nil,
+		&value,
+		&size,
+	)
+	if res != 0 {
+		return
+	}
+	if value == 1 {
+		can_use_long_paths = true
+	}
+
 }
 
 @(require_results)