aboutsummaryrefslogtreecommitdiff
path: root/lib/std/os.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2020-02-07 11:28:42 -0500
committerAndrew Kelley <andrew@ziglang.org>2020-02-07 11:28:42 -0500
commit71873e71338fcdecf248d0fb994918ee943cd2e6 (patch)
treedcc7be23496a297dcf36ca3bd1725b2fcc4ddfcb /lib/std/os.zig
parent0b5bcd2f56a84e66d5c700744ec1838381893667 (diff)
downloadzig-71873e71338fcdecf248d0fb994918ee943cd2e6.tar.gz
zig-71873e71338fcdecf248d0fb994918ee943cd2e6.zip
implement os.pipe2 for darwin
Diffstat (limited to 'lib/std/os.zig')
-rw-r--r--lib/std/os.zig23
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,