diff --git a/lib/std/os.zig b/lib/std/os.zig index 072771b000..c3fb42f782 100644 --- 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 index dfc17d730b..4b3454de52 100644 --- 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)));