| ... | @@ -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 | } |
| 5814 | | 5814 | |
| 5815 | fn dirReadHaiku(userdata: ?*anyopaque, dr: *Dir.Reader, buffer: []Dir.Entry) Dir.Reader.Error!usize { | 5815 | fn 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 | } |
| 5821 | | 5930 | |
| 5822 | fn dirReadWindows(userdata: ?*anyopaque, dr: *Dir.Reader, buffer: []Dir.Entry) Dir.Reader.Error!usize { | 5931 | fn 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 |
| 9868 | | 9980 | |
| 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( |
| 10572 | | 10684 | |
| 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) { |