authorgravatar for mail@linusgroh.deLinus Groh <mail@linusgroh.de> 2024-04-20 17:14:35+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-04-23 17:11:48-07:00
log7974576967157aede2beff8c960d18685d7d5b6d
treee0b5769413481e0226c04af74578f98e9252d5e8
parent011a78325eeab3c233f878b4e02bb7564033fb13

std.fs.Dir.openDir: use wasi libc API when -lc

Same as #19680 but for directories.

1 files changed, 26 insertions(+), 17 deletions(-)

lib/std/fs/Dir.zig+26-17
......@@ -1401,7 +1401,7 @@ pub fn openDir(self: Dir, sub_path: []const u8, args: OpenDirOptions) OpenError!
14011401 const sub_path_w = try windows.sliceToPrefixedFileW(self.fd, sub_path);
14021402 return self.openDirW(sub_path_w.span().ptr, args);
14031403 },
1404 .wasi => {
1404 .wasi => if (!builtin.link_libc) {
14051405 var base: std.os.wasi.rights_t = .{
14061406 .FD_FILESTAT_GET = true,
14071407 .FD_FDSTAT_SET_FLAGS = true,
......@@ -1446,11 +1446,10 @@ pub fn openDir(self: Dir, sub_path: []const u8, args: OpenDirOptions) OpenError!
14461446 };
14471447 return .{ .fd = fd };
14481448 },
1449 else => {
1450 const sub_path_c = try posix.toPosixPath(sub_path);
1451 return self.openDirZ(&sub_path_c, args);
1452 },
1449 else => {},
14531450 }
1451 const sub_path_c = try posix.toPosixPath(sub_path);
1452 return self.openDirZ(&sub_path_c, args);
14541453}
14551454
14561455/// 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
14601459 const sub_path_w = try windows.cStrToPrefixedFileW(self.fd, sub_path_c);
14611460 return self.openDirW(sub_path_w.span().ptr, args);
14621461 },
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) {
14641465 return openDir(self, mem.sliceTo(sub_path_c, 0), args);
14651466 },
14661467 .haiku => {
......@@ -1484,19 +1485,27 @@ pub fn openDirZ(self: Dir, sub_path_c: [*:0]const u8, args: OpenDirOptions) Open
14841485 else => |err| return posix.unexpectedErrno(err),
14851486 }
14861487 },
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 }
14961490
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,
14981496 },
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);
15001509}
15011510
15021511/// Same as `openDir` except the path parameter is WTF-16 LE encoded, NT-prefixed.