authorgravatar for git@aiotter.comaiotter <git@aiotter.com> 2022-05-06 21:58:20+09:00
committergravatar for git@aiotter.comaiotter <git@aiotter.com> 2022-05-06 23:54:13+09:00
log83d837813999b73771a0e9623ed1c6c5339e4f4c
treea1cd60d6c0780a629bd60a4975060cc1b6027b80
parentac1aaec9c38eb44b93099ff18579a9401f107100

std.c: Add C APIs to read directories


2 files changed, 19 insertions(+), 0 deletions(-)

lib/std/c.zig+15
......@@ -59,6 +59,20 @@ pub usingnamespace switch (builtin.os.tag) {
5959
6060pub const whence_t = if (builtin.os.tag == .wasi) std.os.wasi.whence_t else c_int;
6161
62// Unix-like systems
63pub usingnamespace switch (builtin.os.tag) {
64 .netbsd, .windows => struct {},
65 else => struct {
66 pub const DIR = opaque {};
67 pub extern "c" fn opendir(pathname: [*:0]const u8) ?*DIR;
68 pub extern "c" fn fdopendir(fd: c_int) ?*DIR;
69 pub extern "c" fn rewinddir(dp: *DIR) void;
70 pub extern "c" fn closedir(dp: *DIR) c_int;
71 pub extern "c" fn telldir(dp: *DIR) c_long;
72 pub extern "c" fn seekdir(dp: *DIR, loc: c_long) void;
73 },
74};
75
6276pub usingnamespace switch (builtin.os.tag) {
6377 .netbsd, .macos, .ios, .watchos, .tvos, .windows => struct {},
6478 else => struct {
......@@ -76,6 +90,7 @@ pub usingnamespace switch (builtin.os.tag) {
7690 pub extern "c" fn sigfillset(set: ?*c.sigset_t) void;
7791 pub extern "c" fn alarm(seconds: c_uint) c_uint;
7892 pub extern "c" fn sigwait(set: ?*c.sigset_t, sig: ?*c_int) c_int;
93 pub extern "c" fn readdir(dp: *c.DIR) ?*c.dirent;
7994 },
8095};
8196
lib/std/c/darwin.zig+4
......@@ -62,9 +62,13 @@ const private = struct {
6262 /// force 64bit version.
6363 /// Note that this is fixed on aarch64 and no longer necessary.
6464 extern "c" fn @"fstatat$INODE64"(dirfd: fd_t, path_name: [*:0]const u8, buf: *Stat, flags: u32) c_int;
65
66 extern "c" fn readdir(dir: *std.c.DIR) ?*dirent;
67 extern "c" fn @"readdir$INODE64"(dir: *std.c.DIR) ?*dirent;
6568};
6669pub const fstat = if (native_arch == .aarch64) private.fstat else private.@"fstat$INODE64";
6770pub const fstatat = if (native_arch == .aarch64) private.fstatat else private.@"fstatat$INODE64";
71pub const readdir = if (native_arch == .aarch64) private.readdir else private.@"readdir$INODE64";
6872
6973pub extern "c" fn mach_absolute_time() u64;
7074pub extern "c" fn mach_continuous_time() u64;