authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-04-16 22:18:58+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-04-16 22:18:58+02:00
loga8226cd536f50fd14c059812388b87bf99324d51
tree8ac68f966e78cb4752fe116fd476c3ed1c5a8c10
parent2b48f559f424d8bf790bf54f4bb83d631461a681
parent52c000c2478197a4e7b7fe883deb9e6744ee68b2

Merge pull request 'Haiku fixes' (#31851) from ypsvlq/zig:master into master

Reviewed-on: https://codeberg.org/ziglang/zig/pulls/31851 Reviewed-by: Andrew Kelley <andrew@ziglang.org>

5 files changed, 133 insertions(+), 12 deletions(-)

lib/std/Io/Threaded.zig+124-9
......@@ -5367,7 +5367,7 @@ fn dirOpenDirHaiku(
53675367 .NOMEM => return error.SystemResources,
53685368 .NOTDIR => return error.NotDir,
53695369 .PERM => return error.PermissionDenied,
5370 .BUSY => return error.DeviceBusy,
5370 .BUSY => |err| return errnoBug(err),
53715371 else => |err| return posix.unexpectedErrno(err),
53725372 }
53735373 },
......@@ -5813,10 +5813,119 @@ fn dirReadIllumos(userdata: ?*anyopaque, dr: *Dir.Reader, buffer: []Dir.Entry) D
58135813}
58145814
58155815fn dirReadHaiku(userdata: ?*anyopaque, dr: *Dir.Reader, buffer: []Dir.Entry) Dir.Reader.Error!usize {
5816 _ = userdata;
5817 _ = dr;
5818 _ = buffer;
5819 @panic("TODO implement dirReadHaiku");
5816 const t: *Threaded = @ptrCast(@alignCast(userdata));
5817 _ = t;
5818 var buffer_index: usize = 0;
5819 while (buffer.len - buffer_index != 0) {
5820 if (dr.end - dr.index == 0) {
5821 // Refill the buffer, unless we've already created references to
5822 // buffered data.
5823 if (buffer_index != 0) break;
5824 if (dr.state == .reset) {
5825 const syscall: Syscall = try .start();
5826 while (true) {
5827 const rc = posix.system._kern_rewind_dir(dr.dir.handle);
5828 switch (@as(posix.E, @enumFromInt(@min(rc, 0)))) {
5829 .SUCCESS => {
5830 syscall.finish();
5831 break;
5832 },
5833 .INTR => {
5834 try syscall.checkCancel();
5835 continue;
5836 },
5837 else => |e| {
5838 syscall.finish();
5839 switch (e) {
5840 else => |err| return posix.unexpectedErrno(err),
5841 }
5842 },
5843 }
5844 }
5845 dr.state = .reading;
5846 }
5847 const syscall: Syscall = try .start();
5848 const n: usize = while (true) {
5849 const rc = posix.system._kern_read_dir(dr.dir.handle, dr.buffer.ptr, dr.buffer.len, @truncate(dr.buffer.len / @sizeOf(posix.system.DirEnt)));
5850 switch (@as(posix.E, @enumFromInt(@min(rc, 0)))) {
5851 .SUCCESS => {
5852 syscall.finish();
5853 break @intCast(rc);
5854 },
5855 .INTR => {
5856 try syscall.checkCancel();
5857 continue;
5858 },
5859 else => |e| {
5860 syscall.finish();
5861 switch (e) {
5862 else => |err| return posix.unexpectedErrno(err),
5863 }
5864 },
5865 }
5866 };
5867 if (n == 0) {
5868 dr.state = .finished;
5869 return 0;
5870 }
5871 dr.index = 0;
5872 // _kern_read_dir returns entry count, but Dir.Reader is designed for byte count
5873 dr.end = 0;
5874 var i: usize = 0;
5875 while (i < n) : (i += 1) {
5876 const entry = @as(*align(1) posix.system.DirEnt, @ptrCast(&dr.buffer[dr.end]));
5877 dr.end += entry.reclen;
5878 }
5879 }
5880 const entry = @as(*align(1) posix.system.DirEnt, @ptrCast(&dr.buffer[dr.index]));
5881 const next_index = dr.index + entry.reclen;
5882 dr.index = next_index;
5883
5884 const name = std.mem.sliceTo(@as([*:0]u8, @ptrCast(&entry.name)), 0);
5885 if (std.mem.eql(u8, name, ".") or std.mem.eql(u8, name, "..") or entry.ino == 0) continue;
5886
5887 // haiku dirent doesn't expose type, so we have to call stat to get it.
5888 var stat: std.c.Stat = undefined;
5889 {
5890 const syscall: Syscall = try .start();
5891 while (true) {
5892 const rc = posix.system._kern_read_stat(dr.dir.handle, name, false, &stat, @sizeOf(std.c.Stat));
5893 switch (@as(posix.E, @enumFromInt(@min(rc, 0)))) {
5894 .SUCCESS => {
5895 syscall.finish();
5896 break;
5897 },
5898 .INTR => {
5899 try syscall.checkCancel();
5900 continue;
5901 },
5902 else => |e| {
5903 syscall.finish();
5904 switch (e) {
5905 else => |err| return posix.unexpectedErrno(err),
5906 }
5907 },
5908 }
5909 }
5910 }
5911
5912 const entry_kind: File.Kind = switch (stat.mode & posix.S.IFMT) {
5913 posix.S.IFBLK => .block_device,
5914 posix.S.IFCHR => .character_device,
5915 posix.S.IFDIR => .directory,
5916 posix.S.IFIFO => .named_pipe,
5917 posix.S.IFLNK => .sym_link,
5918 posix.S.IFREG => .file,
5919 else => .unknown,
5920 };
5921 buffer[buffer_index] = .{
5922 .name = name,
5923 .kind = entry_kind,
5924 .inode = entry.ino,
5925 };
5926 buffer_index += 1;
5927 }
5928 return buffer_index;
58205929}
58215930
58225931fn dirReadWindows(userdata: ?*anyopaque, dr: *Dir.Reader, buffer: []Dir.Entry) Dir.Reader.Error!usize {
......@@ -9834,7 +9943,10 @@ fn fileReadPositionalPosix(file: File, data: []const []u8, offset: u64) File.Rea
98349943 if (have_preadv) {
98359944 const syscall: Syscall = try .start();
98369945 while (true) {
9837 const rc = preadv_sym(file.handle, dest.ptr, @intCast(dest.len), @bitCast(offset));
9946 const rc = if (native_os == .haiku)
9947 posix.system.readv_pos(file.handle, @bitCast(offset), dest.ptr, @intCast(dest.len))
9948 else
9949 preadv_sym(file.handle, dest.ptr, @intCast(dest.len), @bitCast(offset));
98389950 switch (posix.errno(rc)) {
98399951 .SUCCESS => {
98409952 syscall.finish();
......@@ -9868,7 +9980,7 @@ fn fileReadPositionalPosix(file: File, data: []const []u8, offset: u64) File.Rea
98689980
98699981 const syscall: Syscall = try .start();
98709982 while (true) {
9871 const rc = posix.pread(file.handle, dest[0].ptr, @intCast(dest[0].len), @bitCast(offset));
9983 const rc = pread_sym(file.handle, dest[0].base, @intCast(dest[0].len), @bitCast(offset));
98729984 switch (posix.errno(rc)) {
98739985 .SUCCESS => {
98749986 syscall.finish();
......@@ -10572,7 +10684,10 @@ fn fileWritePositional(
1057210684
1057310685 const syscall: Syscall = try .start();
1057410686 while (true) {
10575 const rc = pwritev_sym(file.handle, &iovecs, @intCast(iovlen), @bitCast(offset));
10687 const rc = if (native_os == .haiku)
10688 posix.system.writev_pos(file.handle, @bitCast(offset), &iovecs, @intCast(iovlen))
10689 else
10690 pwritev_sym(file.handle, &iovecs, @intCast(iovlen), @bitCast(offset));
1057610691 switch (posix.errno(rc)) {
1057710692 .SUCCESS => {
1057810693 syscall.finish();
......@@ -14082,7 +14197,7 @@ pub fn posixSocketModeProtocol(family: posix.sa_family_t, mode: net.Socket.Mode,
1408214197 .dgram => posix.SOCK.DGRAM,
1408314198 .seqpacket => posix.SOCK.SEQPACKET,
1408414199 .raw => posix.SOCK.RAW,
14085 .rdm => posix.SOCK.RDM,
14200 .rdm => if (@hasDecl(posix.SOCK, "RDM")) posix.SOCK.RDM else return error.OptionUnsupported,
1408614201 },
1408714202 if (protocol) |p| @intFromEnum(p) else if (is_windows) switch (family) {
1408814203 posix.AF.UNIX => switch (mode) {
lib/std/c.zig+4-2
......@@ -3260,8 +3260,8 @@ pub const Sigaction = switch (native_os) {
32603260
32613261 /// signal handler
32623262 handler: extern union {
3263 handler: handler_fn,
3264 sigaction: sigaction_fn,
3263 handler: ?handler_fn,
3264 sigaction: ?sigaction_fn,
32653265 },
32663266
32673267 /// signal mask to apply
......@@ -11150,6 +11150,8 @@ pub const _kern_open_dir = haiku._kern_open_dir;
1115011150pub const _kern_read_dir = haiku._kern_read_dir;
1115111151pub const _kern_read_stat = haiku._kern_read_stat;
1115211152pub const _kern_rewind_dir = haiku._kern_rewind_dir;
11153pub const readv_pos = haiku.readv_pos;
11154pub const writev_pos = haiku.writev_pos;
1115311155pub const area_id = haiku.area_id;
1115411156pub const area_info = haiku.area_info;
1115511157pub const directory_which = haiku.directory_which;
lib/std/c/haiku.zig+3
......@@ -6,6 +6,7 @@ const iovec = std.posix.iovec;
66const iovec_const = std.posix.iovec_const;
77const socklen_t = std.c.socklen_t;
88const fd_t = std.c.fd_t;
9const off_t = std.c.off_t;
910const PATH_MAX = std.c.PATH_MAX;
1011const uid_t = std.c.uid_t;
1112const gid_t = std.c.gid_t;
......@@ -28,6 +29,8 @@ pub extern "root" fn _kern_open_dir(fd: fd_t, path: [*:0]const u8) fd_t;
2829pub extern "root" fn _kern_read_dir(fd: fd_t, buffer: [*]u8, bufferSize: usize, maxCount: u32) isize;
2930pub extern "root" fn _kern_rewind_dir(fd: fd_t) status_t;
3031pub extern "root" fn _kern_read_stat(fd: fd_t, path: [*:0]const u8, traverseLink: bool, stat: *std.c.Stat, statSize: usize) status_t;
32pub extern "root" fn readv_pos(fd: fd_t, pos: off_t, vec: [*]const std.c.iovec, count: i32) isize;
33pub extern "root" fn writev_pos(fd: fd_t, pos: off_t, vec: [*]const std.c.iovec_const, count: i32) isize;
3134
3235pub const area_info = extern struct {
3336 area: u32,
lib/std/debug.zig+1-1
......@@ -1576,12 +1576,12 @@ fn handleSegfaultPosix(sig: posix.SIG, info: *const posix.siginfo_t, ctx_ptr: ?*
15761576 .tvos,
15771577 .visionos,
15781578 .watchos,
1579 .haiku,
15791580 => @intFromPtr(info.addr),
15801581 .linux,
15811582 => @intFromPtr(info.fields.sigfault.addr),
15821583 .netbsd,
15831584 => @intFromPtr(info.info.reason.fault.addr),
1584 .haiku,
15851585 .openbsd,
15861586 => @intFromPtr(info.data.fault.addr),
15871587 .illumos,
lib/std/zig/LibCInstallation.zig+1
......@@ -459,6 +459,7 @@ fn findNativeCrtDirPosix(self: *LibCInstallation, gpa: Allocator, io: Io, args:
459459
460460fn findNativeGccDirHaiku(self: *LibCInstallation, gpa: Allocator, io: Io, args: FindNativeOptions) FindError!void {
461461 self.gcc_dir = try ccPrintFileName(gpa, io, .{
462 .environ_map = args.environ_map,
462463 .search_basename = "crtbeginS.o",
463464 .want_dirname = .only_dir,
464465 .verbose = args.verbose,