diff options
| author | Al Hoang <3811822-hoanga@users.noreply.gitlab.com> | 2020-12-25 07:48:04 -0600 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-02-25 16:41:42 -0700 |
| commit | 025635c3f80912f0f967b57e6d22fe42e94b64f0 (patch) | |
| tree | 69a4dafe3e0909e3155642ed23d2b94ebb5595dd /lib/std/os.zig | |
| parent | 297eabd4accbcae42bfe821078a79e4af06a2dde (diff) | |
| download | zig-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.zig | 19 |
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. |
