zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 71e99c869012194cc4a23c5842b746533c1ae2bb (tree)
parent 7611b80f432be29f3fa83ea1891002fd20f0a07f
Author: Samadi van Koten <samadi@vktec.org.uk>
Date:   Mon,  7 Jun 2021 22:06:45 +0100

Add std.os.dup()

Diffstat:
Mlib/std/os.zig | 10++++++++++
Mlib/std/os/linux.zig | 4++++
2 files changed, 14 insertions(+), 0 deletions(-)

diff --git a/lib/std/os.zig b/lib/std/os.zig @@ -1282,6 +1282,16 @@ pub fn openatW(dir_fd: fd_t, file_path_w: []const u16, flags: u32, mode: mode_t) }; } +pub fn dup(old_fd: fd_t) !fd_t { + const rc = system.dup(old_fd); + return switch (errno(rc)) { + 0 => return @intCast(fd_t, rc), + EMFILE => error.ProcessFdQuotaExceeded, + EBADF => unreachable, // invalid file descriptor + else => |err| return unexpectedErrno(err), + }; +} + pub fn dup2(old_fd: fd_t, new_fd: fd_t) !void { while (true) { switch (errno(system.dup2(old_fd, new_fd))) { diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig @@ -94,6 +94,10 @@ pub fn getErrno(r: usize) u12 { return if (signed_r > -4096 and signed_r < 0) @intCast(u12, -signed_r) else 0; } +pub fn dup(old: i32) usize { + return syscall1(.dup, @bitCast(usize, @as(isize, old))); +} + pub fn dup2(old: i32, new: i32) usize { if (@hasField(SYS, "dup2")) { return syscall2(.dup2, @bitCast(usize, @as(isize, old)), @bitCast(usize, @as(isize, new)));