Commit ee048d6569

Samadi van Koten <samadi@vktec.org.uk>
2021-06-07 23:06:45
Add std.os.dup()
1 parent 2d4c439
Changed files (2)
lib
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)));
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))) {