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!...@@ -1401,7 +1401,7 @@ pub fn openDir(self: Dir, sub_path: []const u8, args: OpenDirOptions) OpenError!
1401 const sub_path_w = try windows.sliceToPrefixedFileW(self.fd, sub_path);1401 const sub_path_w = try windows.sliceToPrefixedFileW(self.fd, sub_path);
1402 return self.openDirW(sub_path_w.span().ptr, args);1402 return self.openDirW(sub_path_w.span().ptr, args);
1403 },1403 },
1404 .wasi => {1404 .wasi => if (!builtin.link_libc) {
1405 var base: std.os.wasi.rights_t = .{1405 var base: std.os.wasi.rights_t = .{
1406 .FD_FILESTAT_GET = true,1406 .FD_FILESTAT_GET = true,
1407 .FD_FDSTAT_SET_FLAGS = true,1407 .FD_FDSTAT_SET_FLAGS = true,
...@@ -1446,11 +1446,10 @@ pub fn openDir(self: Dir, sub_path: []const u8, args: OpenDirOptions) OpenError!...@@ -1446,11 +1446,10 @@ pub fn openDir(self: Dir, sub_path: []const u8, args: OpenDirOptions) OpenError!
1446 };1446 };
1447 return .{ .fd = fd };1447 return .{ .fd = fd };
1448 },1448 },
1449 else => {1449 else => {},
1450 const sub_path_c = try posix.toPosixPath(sub_path);
1451 return self.openDirZ(&sub_path_c, args);
1452 },
1453 }1450 }
1451 const sub_path_c = try posix.toPosixPath(sub_path);
1452 return self.openDirZ(&sub_path_c, args);
1454}1453}
14551454
1456/// Same as `openDir` except the parameter is null-terminated.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,7 +1459,9 @@ pub fn openDirZ(self: Dir, sub_path_c: [*:0]const u8, args: OpenDirOptions) Open
1460 const sub_path_w = try windows.cStrToPrefixedFileW(self.fd, sub_path_c);1459 const sub_path_w = try windows.cStrToPrefixedFileW(self.fd, sub_path_c);
1461 return self.openDirW(sub_path_w.span().ptr, args);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 return openDir(self, mem.sliceTo(sub_path_c, 0), args);1465 return openDir(self, mem.sliceTo(sub_path_c, 0), args);
1465 },1466 },
1466 .haiku => {1467 .haiku => {
...@@ -1484,19 +1485,27 @@ pub fn openDirZ(self: Dir, sub_path_c: [*:0]const u8, args: OpenDirOptions) Open...@@ -1484,19 +1485,27 @@ pub fn openDirZ(self: Dir, sub_path_c: [*:0]const u8, args: OpenDirOptions) Open
1484 else => |err| return posix.unexpectedErrno(err),1485 else => |err| return posix.unexpectedErrno(err),
1485 }1486 }
1486 },1487 },
1487 else => {1488 else => {},
1488 var symlink_flags: posix.O = .{1489 }
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;
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,
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}
15011510
1502/// Same as `openDir` except the path parameter is WTF-16 LE encoded, NT-prefixed.1511/// Same as `openDir` except the path parameter is WTF-16 LE encoded, NT-prefixed.