| ... | ... | @@ -1401,7 +1401,7 @@ pub fn openDir(self: Dir, sub_path: []const u8, args: OpenDirOptions) OpenError! |
| 1401 | 1401 | const sub_path_w = try windows.sliceToPrefixedFileW(self.fd, sub_path); |
| 1402 | 1402 | return self.openDirW(sub_path_w.span().ptr, args); |
| 1403 | 1403 | }, |
| 1404 | | .wasi => { |
| 1404 | .wasi => if (!builtin.link_libc) { |
| 1405 | 1405 | var base: std.os.wasi.rights_t = .{ |
| 1406 | 1406 | .FD_FILESTAT_GET = true, |
| 1407 | 1407 | .FD_FDSTAT_SET_FLAGS = true, |
| ... | ... | @@ -1446,11 +1446,10 @@ pub fn openDir(self: Dir, sub_path: []const u8, args: OpenDirOptions) OpenError! |
| 1446 | 1446 | }; |
| 1447 | 1447 | return .{ .fd = fd }; |
| 1448 | 1448 | }, |
| 1449 | | else => { |
| 1450 | | const sub_path_c = try posix.toPosixPath(sub_path); |
| 1451 | | return self.openDirZ(&sub_path_c, args); |
| 1452 | | }, |
| 1449 | else => {}, |
| 1453 | 1450 | } |
| 1451 | const sub_path_c = try posix.toPosixPath(sub_path); |
| 1452 | return self.openDirZ(&sub_path_c, args); |
| 1454 | 1453 | } |
| 1455 | 1454 | |
| 1456 | 1455 | /// Same as `openDir` except the parameter is null-terminated. |
| ... | ... | @@ -1460,7 +1459,9 @@ pub fn openDirZ(self: Dir, sub_path_c: [*:0]const u8, args: OpenDirOptions) Open |
| 1460 | 1459 | const sub_path_w = try windows.cStrToPrefixedFileW(self.fd, sub_path_c); |
| 1461 | 1460 | return self.openDirW(sub_path_w.span().ptr, args); |
| 1462 | 1461 | }, |
| 1463 | | .wasi => { |
| 1462 | // Use the libc API when libc is linked because it implements things |
| 1463 | // such as opening absolute directory paths. |
| 1464 | .wasi => if (!builtin.link_libc) { |
| 1464 | 1465 | return openDir(self, mem.sliceTo(sub_path_c, 0), args); |
| 1465 | 1466 | }, |
| 1466 | 1467 | .haiku => { |
| ... | ... | @@ -1484,19 +1485,27 @@ pub fn openDirZ(self: Dir, sub_path_c: [*:0]const u8, args: OpenDirOptions) Open |
| 1484 | 1485 | else => |err| return posix.unexpectedErrno(err), |
| 1485 | 1486 | } |
| 1486 | 1487 | }, |
| 1487 | | else => { |
| 1488 | | var symlink_flags: posix.O = .{ |
| 1489 | | .ACCMODE = .RDONLY, |
| 1490 | | .NOFOLLOW = args.no_follow, |
| 1491 | | .DIRECTORY = true, |
| 1492 | | .CLOEXEC = true, |
| 1493 | | }; |
| 1494 | | if (@hasField(posix.O, "PATH") and !args.iterate) |
| 1495 | | symlink_flags.PATH = true; |
| 1488 | else => {}, |
| 1489 | } |
| 1496 | 1490 | |
| 1497 | | return self.openDirFlagsZ(sub_path_c, symlink_flags); |
| 1491 | var symlink_flags: posix.O = switch (native_os) { |
| 1492 | .wasi => .{ |
| 1493 | .read = true, |
| 1494 | .NOFOLLOW = args.no_follow, |
| 1495 | .DIRECTORY = true, |
| 1498 | 1496 | }, |
| 1499 | | } |
| 1497 | else => .{ |
| 1498 | .ACCMODE = .RDONLY, |
| 1499 | .NOFOLLOW = args.no_follow, |
| 1500 | .DIRECTORY = true, |
| 1501 | .CLOEXEC = true, |
| 1502 | }, |
| 1503 | }; |
| 1504 | |
| 1505 | if (@hasField(posix.O, "PATH") and !args.iterate) |
| 1506 | symlink_flags.PATH = true; |
| 1507 | |
| 1508 | return self.openDirFlagsZ(sub_path_c, symlink_flags); |
| 1500 | 1509 | } |
| 1501 | 1510 | |
| 1502 | 1511 | /// Same as `openDir` except the path parameter is WTF-16 LE encoded, NT-prefixed. |