authorgravatar for samadi@vktec.org.ukSamadi van Koten <samadi@vktec.org.uk> 2021-06-07 22:06:45+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-06-15 12:14:03+02:00
log71e99c869012194cc4a23c5842b746533c1ae2bb
treedfe8deff0e277fd83ebb3c32c918f916ed1f177e
parent7611b80f432be29f3fa83ea1891002fd20f0a07f

Add std.os.dup()


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

lib/std/os.zig+10
......@@ -1282,6 +1282,16 @@ pub fn openatW(dir_fd: fd_t, file_path_w: []const u16, flags: u32, mode: mode_t)
12821282 };
12831283}
12841284
1285pub fn dup(old_fd: fd_t) !fd_t {
1286 const rc = system.dup(old_fd);
1287 return switch (errno(rc)) {
1288 0 => return @intCast(fd_t, rc),
1289 EMFILE => error.ProcessFdQuotaExceeded,
1290 EBADF => unreachable, // invalid file descriptor
1291 else => |err| return unexpectedErrno(err),
1292 };
1293}
1294
12851295pub fn dup2(old_fd: fd_t, new_fd: fd_t) !void {
12861296 while (true) {
12871297 switch (errno(system.dup2(old_fd, new_fd))) {
lib/std/os/linux.zig+4
......@@ -94,6 +94,10 @@ pub fn getErrno(r: usize) u12 {
9494 return if (signed_r > -4096 and signed_r < 0) @intCast(u12, -signed_r) else 0;
9595}
9696
97pub fn dup(old: i32) usize {
98 return syscall1(.dup, @bitCast(usize, @as(isize, old)));
99}
100
97101pub fn dup2(old: i32, new: i32) usize {
98102 if (@hasField(SYS, "dup2")) {
99103 return syscall2(.dup2, @bitCast(usize, @as(isize, old)), @bitCast(usize, @as(isize, new)));