aboutsummaryrefslogtreecommitdiff
path: root/lib/std/os.zig
diff options
context:
space:
mode:
authorAl Hoang <3811822-hoanga@users.noreply.gitlab.com>2020-12-25 07:48:04 -0600
committerAndrew Kelley <andrew@ziglang.org>2021-02-25 16:41:42 -0700
commit025635c3f80912f0f967b57e6d22fe42e94b64f0 (patch)
tree69a4dafe3e0909e3155642ed23d2b94ebb5595dd /lib/std/os.zig
parent297eabd4accbcae42bfe821078a79e4af06a2dde (diff)
downloadzig-025635c3f80912f0f967b57e6d22fe42e94b64f0.tar.gz
zig-025635c3f80912f0f967b57e6d22fe42e94b64f0.zip
initial support for haiku past stage0
Diffstat (limited to 'lib/std/os.zig')
-rw-r--r--lib/std/os.zig19
1 files changed, 18 insertions, 1 deletions
diff --git a/lib/std/os.zig b/lib/std/os.zig
index 61d9749415..b7a471ef2c 100644
--- a/lib/std/os.zig
+++ b/lib/std/os.zig
@@ -32,6 +32,7 @@ const MAX_PATH_BYTES = std.fs.MAX_PATH_BYTES;
pub const darwin = @import("os/darwin.zig");
pub const dragonfly = @import("os/dragonfly.zig");
pub const freebsd = @import("os/freebsd.zig");
+pub const haiku = @import("os/haiku.zig");
pub const netbsd = @import("os/netbsd.zig");
pub const openbsd = @import("os/openbsd.zig");
pub const linux = @import("os/linux.zig");
@@ -66,6 +67,7 @@ else if (builtin.link_libc)
else switch (builtin.os.tag) {
.macos, .ios, .watchos, .tvos => darwin,
.freebsd => freebsd,
+ .haiku => haiku,
.linux => linux,
.netbsd => netbsd,
.openbsd => openbsd,
@@ -932,7 +934,7 @@ pub fn pwrite(fd: fd_t, bytes: []const u8, offset: u64) PWriteError!usize {
/// If `iov.len` is larger than will fit in a `u31`, a partial write will occur.
pub fn pwritev(fd: fd_t, iov: []const iovec_const, offset: u64) PWriteError!usize {
const have_pwrite_but_not_pwritev = switch (std.Target.current.os.tag) {
- .windows, .macos, .ios, .watchos, .tvos => true,
+ .windows, .macos, .ios, .watchos, .tvos, .haiku => true,
else => false,
};
@@ -3889,6 +3891,21 @@ pub fn pipe2(flags: u32) PipeError![2]fd_t {
}
}
}
+ if (comptime std.Target.current.isHaiku()) {
+ var fds: [2]fd_t = try pipe();
+ if (flags == 0) return fds;
+ 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;
+ }
const new_flags = flags & ~@as(u32, O_CLOEXEC);
// Set every other flag affecting the file status using F_SETFL.