diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2020-02-07 11:28:42 -0500 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2020-02-07 11:28:42 -0500 |
| commit | 71873e71338fcdecf248d0fb994918ee943cd2e6 (patch) | |
| tree | dcc7be23496a297dcf36ca3bd1725b2fcc4ddfcb /lib/std/os.zig | |
| parent | 0b5bcd2f56a84e66d5c700744ec1838381893667 (diff) | |
| download | zig-71873e71338fcdecf248d0fb994918ee943cd2e6.tar.gz zig-71873e71338fcdecf248d0fb994918ee943cd2e6.zip | |
implement os.pipe2 for darwin
Diffstat (limited to 'lib/std/os.zig')
| -rw-r--r-- | lib/std/os.zig | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/lib/std/os.zig b/lib/std/os.zig index 94e2ca3869..45c830d04e 100644 --- a/lib/std/os.zig +++ b/lib/std/os.zig @@ -2528,6 +2528,29 @@ pub fn pipe() PipeError![2]fd_t { } pub fn pipe2(flags: u32) PipeError![2]fd_t { + if (comptime std.Target.current.isDarwin()) { + var fds: [2]fd_t = undefined; + switch (errno(system.pipe(&fds, flags))) { + 0 => {}, + EINVAL => unreachable, // Invalid flags + EFAULT => unreachable, // Invalid fds pointer + ENFILE => return error.SystemFdQuotaExceeded, + EMFILE => return error.ProcessFdQuotaExceeded, + else => |err| return unexpectedErrno(err), + } + errdefer { + close(fds[0]); + close(fds[1]); + } + for (fds) |fd| switch (errno(system.fcntl(fd, F_SETFL, flags))) { + 0 => {}, + EINVAL => unreachable, // Invalid flags + EBADF => unreachable, // Always a race condition + else => |err| return unexpectedErrno(err), + }; + return fds; + } + var fds: [2]fd_t = undefined; switch (errno(system.pipe2(&fds, flags))) { 0 => return fds, |
