Add std.os.dup()

This commit is contained in:
Samadi van Koten 2021-06-07 22:06:45 +01:00 committed by Jakub Konka
parent 7611b80f43
commit 71e99c8690
2 changed files with 14 additions and 0 deletions

View File

@ -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))) {

View File

@ -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)));