diff --git a/mod.zig b/mod.zig index 8e858095c92e8d42271a6d09c95e1c0b291bf746..470801ca1b2a60c86dd51f03dfd61f867f60b909 100644 --- a/mod.zig +++ b/mod.zig @@ -2206,6 +2206,14 @@ pub const libc = struct { /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/read.html pub extern fn read(fd: c_int, buf: [*]u8, count: usize) isize; + /// ssize_t readlink(const char *restrict path, char *restrict buf, size_t bufsize); + /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/readlink.html + pub extern fn readlink(noalias path: [*:0]const u8, noalias buf: [*]u8, len: usize) isize; + + /// ssize_t readlinkat(int fd, const char *restrict path, char *restrict buf, size_t bufsize); + /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/readlinkat.html + pub extern fn readlinkat(fd: c_int, noalias path: [*:0]const u8, noalias buf: [*]u8, len: usize) isize; + /// ssize_t recv(int socket, void *buffer, size_t length, int flags); /// https://pubs.opengroup.org/onlinepubs/9699919799.orig/functions/recv.html pub extern fn recv(fd: c_int, buffer: [*]u8, length: usize, flags: c_int) isize; @@ -3137,3 +3145,9 @@ pub fn memfd_create(name: [*:0]const u8, flags: c_uint) !c_int { std.debug.assert(rc >= 0); return rc; } +pub fn readlinkat(dirfd: c_int, noalias path: [*:0]const u8, noalias buf: []u8) ![:0]u8 { + const rc = libc.readlinkat(dirfd, path, buf.ptr, buf.len); + if (rc == -1) return errno.fromInt(errno.fromLibC()); + std.debug.assert(rc >= 0); + return buf[0..@intCast(rc) :0]; +} diff --git a/test.zig b/test.zig index fa77a4ada674e8f42c3c8154c816fbc981f4e5a8..27f5efb45c0f72e0af3abd6ac4608e885862e86a 100644 --- a/test.zig +++ b/test.zig @@ -29,4 +29,5 @@ test { _ = &linux.freeaddrinfo; _ = &linux.clock_gettime; _ = &linux.memfd_create; + _ = &linux.readlinkat; }