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(...@@ -5367,7 +5367,7 @@ fn dirOpenDirHaiku(
5367 .NOMEM => return error.SystemResources,5367 .NOMEM => return error.SystemResources,
5368 .NOTDIR => return error.NotDir,5368 .NOTDIR => return error.NotDir,
5369 .PERM => return error.PermissionDenied,5369 .PERM => return error.PermissionDenied,
5370 .BUSY => return error.DeviceBusy,5370 .BUSY => |err| return errnoBug(err),
5371 else => |err| return posix.unexpectedErrno(err),5371 else => |err| return posix.unexpectedErrno(err),
5372 }5372 }
5373 },5373 },
...@@ -5813,10 +5813,119 @@ fn dirReadIllumos(userdata: ?*anyopaque, dr: *Dir.Reader, buffer: []Dir.Entry) D...@@ -5813,10 +5813,119 @@ fn dirReadIllumos(userdata: ?*anyopaque, dr: *Dir.Reader, buffer: []Dir.Entry) D
5813}5813}
58145814
5815fn dirReadHaiku(userdata: ?*anyopaque, dr: *Dir.Reader, buffer: []Dir.Entry) Dir.Reader.Error!usize {5815fn dirReadHaiku(userdata: ?*anyopaque, dr: *Dir.Reader, buffer: []Dir.Entry) Dir.Reader.Error!usize {
5816 _ = userdata;5816 const t: *Threaded = @ptrCast(@alignCast(userdata));
5817 _ = dr;5817 _ = t;
5818 _ = buffer;5818 var buffer_index: usize = 0;
5819 @panic("TODO implement dirReadHaiku");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;
5820}5929}
58215930
5822fn dirReadWindows(userdata: ?*anyopaque, dr: *Dir.Reader, buffer: []Dir.Entry) Dir.Reader.Error!usize {5931fn 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...@@ -9834,7 +9943,10 @@ fn fileReadPositionalPosix(file: File, data: []const []u8, offset: u64) File.Rea
9834 if (have_preadv) {9943 if (have_preadv) {
9835 const syscall: Syscall = try .start();9944 const syscall: Syscall = try .start();
9836 while (true) {9945 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));
9838 switch (posix.errno(rc)) {9950 switch (posix.errno(rc)) {
9839 .SUCCESS => {9951 .SUCCESS => {
9840 syscall.finish();9952 syscall.finish();
...@@ -9868,7 +9980,7 @@ fn fileReadPositionalPosix(file: File, data: []const []u8, offset: u64) File.Rea...@@ -9868,7 +9980,7 @@ fn fileReadPositionalPosix(file: File, data: []const []u8, offset: u64) File.Rea
98689980
9869 const syscall: Syscall = try .start();9981 const syscall: Syscall = try .start();
9870 while (true) {9982 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));
9872 switch (posix.errno(rc)) {9984 switch (posix.errno(rc)) {
9873 .SUCCESS => {9985 .SUCCESS => {
9874 syscall.finish();9986 syscall.finish();
...@@ -10572,7 +10684,10 @@ fn fileWritePositional(...@@ -10572,7 +10684,10 @@ fn fileWritePositional(
1057210684
10573 const syscall: Syscall = try .start();10685 const syscall: Syscall = try .start();
10574 while (true) {10686 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));
10576 switch (posix.errno(rc)) {10691 switch (posix.errno(rc)) {
10577 .SUCCESS => {10692 .SUCCESS => {
10578 syscall.finish();10693 syscall.finish();
...@@ -14082,7 +14197,7 @@ pub fn posixSocketModeProtocol(family: posix.sa_family_t, mode: net.Socket.Mode,...@@ -14082,7 +14197,7 @@ pub fn posixSocketModeProtocol(family: posix.sa_family_t, mode: net.Socket.Mode,
14082 .dgram => posix.SOCK.DGRAM,14197 .dgram => posix.SOCK.DGRAM,
14083 .seqpacket => posix.SOCK.SEQPACKET,14198 .seqpacket => posix.SOCK.SEQPACKET,
14084 .raw => posix.SOCK.RAW,14199 .raw => posix.SOCK.RAW,
14085 .rdm => posix.SOCK.RDM,14200 .rdm => if (@hasDecl(posix.SOCK, "RDM")) posix.SOCK.RDM else return error.OptionUnsupported,
14086 },14201 },
14087 if (protocol) |p| @intFromEnum(p) else if (is_windows) switch (family) {14202 if (protocol) |p| @intFromEnum(p) else if (is_windows) switch (family) {
14088 posix.AF.UNIX => switch (mode) {14203 posix.AF.UNIX => switch (mode) {
lib/std/c.zig+4-2
...@@ -3260,8 +3260,8 @@ pub const Sigaction = switch (native_os) {...@@ -3260,8 +3260,8 @@ pub const Sigaction = switch (native_os) {
32603260
3261 /// signal handler3261 /// signal handler
3262 handler: extern union {3262 handler: extern union {
3263 handler: handler_fn,3263 handler: ?handler_fn,
3264 sigaction: sigaction_fn,3264 sigaction: ?sigaction_fn,
3265 },3265 },
32663266
3267 /// signal mask to apply3267 /// signal mask to apply
...@@ -11150,6 +11150,8 @@ pub const _kern_open_dir = haiku._kern_open_dir;...@@ -11150,6 +11150,8 @@ pub const _kern_open_dir = haiku._kern_open_dir;
11150pub const _kern_read_dir = haiku._kern_read_dir;11150pub const _kern_read_dir = haiku._kern_read_dir;
11151pub const _kern_read_stat = haiku._kern_read_stat;11151pub const _kern_read_stat = haiku._kern_read_stat;
11152pub const _kern_rewind_dir = haiku._kern_rewind_dir;11152pub const _kern_rewind_dir = haiku._kern_rewind_dir;
11153pub const readv_pos = haiku.readv_pos;
11154pub const writev_pos = haiku.writev_pos;
11153pub const area_id = haiku.area_id;11155pub const area_id = haiku.area_id;
11154pub const area_info = haiku.area_info;11156pub const area_info = haiku.area_info;
11155pub const directory_which = haiku.directory_which;11157pub const directory_which = haiku.directory_which;
lib/std/c/haiku.zig+3
...@@ -6,6 +6,7 @@ const iovec = std.posix.iovec;...@@ -6,6 +6,7 @@ const iovec = std.posix.iovec;
6const iovec_const = std.posix.iovec_const;6const iovec_const = std.posix.iovec_const;
7const socklen_t = std.c.socklen_t;7const socklen_t = std.c.socklen_t;
8const fd_t = std.c.fd_t;8const fd_t = std.c.fd_t;
9const off_t = std.c.off_t;
9const PATH_MAX = std.c.PATH_MAX;10const PATH_MAX = std.c.PATH_MAX;
10const uid_t = std.c.uid_t;11const uid_t = std.c.uid_t;
11const gid_t = std.c.gid_t;12const 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;...@@ -28,6 +29,8 @@ pub extern "root" fn _kern_open_dir(fd: fd_t, path: [*:0]const u8) fd_t;
28pub extern "root" fn _kern_read_dir(fd: fd_t, buffer: [*]u8, bufferSize: usize, maxCount: u32) isize;29pub extern "root" fn _kern_read_dir(fd: fd_t, buffer: [*]u8, bufferSize: usize, maxCount: u32) isize;
29pub extern "root" fn _kern_rewind_dir(fd: fd_t) status_t;30pub extern "root" fn _kern_rewind_dir(fd: fd_t) status_t;
30pub extern "root" fn _kern_read_stat(fd: fd_t, path: [*:0]const u8, traverseLink: bool, stat: *std.c.Stat, statSize: usize) status_t;31pub 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
32pub const area_info = extern struct {35pub const area_info = extern struct {
33 area: u32,36 area: u32,
lib/std/debug.zig+1-1
...@@ -1576,12 +1576,12 @@ fn handleSegfaultPosix(sig: posix.SIG, info: *const posix.siginfo_t, ctx_ptr: ?*...@@ -1576,12 +1576,12 @@ fn handleSegfaultPosix(sig: posix.SIG, info: *const posix.siginfo_t, ctx_ptr: ?*
1576 .tvos,1576 .tvos,
1577 .visionos,1577 .visionos,
1578 .watchos,1578 .watchos,
1579 .haiku,
1579 => @intFromPtr(info.addr),1580 => @intFromPtr(info.addr),
1580 .linux,1581 .linux,
1581 => @intFromPtr(info.fields.sigfault.addr),1582 => @intFromPtr(info.fields.sigfault.addr),
1582 .netbsd,1583 .netbsd,
1583 => @intFromPtr(info.info.reason.fault.addr),1584 => @intFromPtr(info.info.reason.fault.addr),
1584 .haiku,
1585 .openbsd,1585 .openbsd,
1586 => @intFromPtr(info.data.fault.addr),1586 => @intFromPtr(info.data.fault.addr),
1587 .illumos,1587 .illumos,
lib/std/zig/LibCInstallation.zig+1
...@@ -459,6 +459,7 @@ fn findNativeCrtDirPosix(self: *LibCInstallation, gpa: Allocator, io: Io, args:...@@ -459,6 +459,7 @@ fn findNativeCrtDirPosix(self: *LibCInstallation, gpa: Allocator, io: Io, args:
459459
460fn findNativeGccDirHaiku(self: *LibCInstallation, gpa: Allocator, io: Io, args: FindNativeOptions) FindError!void {460fn findNativeGccDirHaiku(self: *LibCInstallation, gpa: Allocator, io: Io, args: FindNativeOptions) FindError!void {
461 self.gcc_dir = try ccPrintFileName(gpa, io, .{461 self.gcc_dir = try ccPrintFileName(gpa, io, .{
462 .environ_map = args.environ_map,
462 .search_basename = "crtbeginS.o",463 .search_basename = "crtbeginS.o",
463 .want_dirname = .only_dir,464 .want_dirname = .only_dir,
464 .verbose = args.verbose,465 .verbose = args.verbose,