authorgravatar for samadi@vktec.org.ukSamadi van Koten <samadi@vktec.org.uk> 2021-06-07 22:06:45+01:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2021-06-14 12:17:12+03:00
logee048d65692c6db9d084da951d3113af7db367aa
tree932e8e4c154ddd42fe6c212a9aec9ca84d167c2f
parent2d4c4396524d7572d2869d79a209e5772a33a59b

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)...@@ -1282,6 +1282,16 @@ pub fn openatW(dir_fd: fd_t, file_path_w: []const u16, flags: u32, mode: mode_t)
1282 };1282 };
1283}1283}
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
1285pub fn dup2(old_fd: fd_t, new_fd: fd_t) !void {1295pub fn dup2(old_fd: fd_t, new_fd: fd_t) !void {
1286 while (true) {1296 while (true) {
1287 switch (errno(system.dup2(old_fd, new_fd))) {1297 switch (errno(system.dup2(old_fd, new_fd))) {
lib/std/os/linux.zig+4
...@@ -94,6 +94,10 @@ pub fn getErrno(r: usize) u12 {...@@ -94,6 +94,10 @@ pub fn getErrno(r: usize) u12 {
94 return if (signed_r > -4096 and signed_r < 0) @intCast(u12, -signed_r) else 0;94 return if (signed_r > -4096 and signed_r < 0) @intCast(u12, -signed_r) else 0;
95}95}
9696
97pub fn dup(old: i32) usize {
98 return syscall1(.dup, @bitCast(usize, @as(isize, old)));
99}
100
97pub fn dup2(old: i32, new: i32) usize {101pub fn dup2(old: i32, new: i32) usize {
98 if (@hasField(SYS, "dup2")) {102 if (@hasField(SYS, "dup2")) {
99 return syscall2(.dup2, @bitCast(usize, @as(isize, old)), @bitCast(usize, @as(isize, new)));103 return syscall2(.dup2, @bitCast(usize, @as(isize, old)), @bitCast(usize, @as(isize, new)));