| ... | ... | @@ -5345,7 +5345,7 @@ fn dirOpenDirHaiku( |
| 5345 | 5345 | .NOMEM => return error.SystemResources, |
| 5346 | 5346 | .NOTDIR => return error.NotDir, |
| 5347 | 5347 | .PERM => return error.PermissionDenied, |
| 5348 | | .BUSY => return error.DeviceBusy, |
| 5348 | .BUSY => |err| return errnoBug(err), |
| 5349 | 5349 | else => |err| return posix.unexpectedErrno(err), |
| 5350 | 5350 | } |
| 5351 | 5351 | }, |
| ... | ... | @@ -5791,10 +5791,119 @@ fn dirReadIllumos(userdata: ?*anyopaque, dr: *Dir.Reader, buffer: []Dir.Entry) D |
| 5791 | 5791 | } |
| 5792 | 5792 | |
| 5793 | 5793 | fn dirReadHaiku(userdata: ?*anyopaque, dr: *Dir.Reader, buffer: []Dir.Entry) Dir.Reader.Error!usize { |
| 5794 | | _ = userdata; |
| 5795 | | _ = dr; |
| 5796 | | _ = buffer; |
| 5797 | | @panic("TODO implement dirReadHaiku"); |
| 5794 | const t: *Threaded = @ptrCast(@alignCast(userdata)); |
| 5795 | _ = t; |
| 5796 | var buffer_index: usize = 0; |
| 5797 | while (buffer.len - buffer_index != 0) { |
| 5798 | if (dr.end - dr.index == 0) { |
| 5799 | // Refill the buffer, unless we've already created references to |
| 5800 | // buffered data. |
| 5801 | if (buffer_index != 0) break; |
| 5802 | if (dr.state == .reset) { |
| 5803 | const syscall: Syscall = try .start(); |
| 5804 | while (true) { |
| 5805 | const rc = posix.system._kern_rewind_dir(dr.dir.handle); |
| 5806 | switch (@as(posix.E, @enumFromInt(@min(rc, 0)))) { |
| 5807 | .SUCCESS => { |
| 5808 | syscall.finish(); |
| 5809 | break; |
| 5810 | }, |
| 5811 | .INTR => { |
| 5812 | try syscall.checkCancel(); |
| 5813 | continue; |
| 5814 | }, |
| 5815 | else => |e| { |
| 5816 | syscall.finish(); |
| 5817 | switch (e) { |
| 5818 | else => |err| return posix.unexpectedErrno(err), |
| 5819 | } |
| 5820 | }, |
| 5821 | } |
| 5822 | } |
| 5823 | dr.state = .reading; |
| 5824 | } |
| 5825 | const syscall: Syscall = try .start(); |
| 5826 | const n: usize = while (true) { |
| 5827 | const rc = posix.system._kern_read_dir(dr.dir.handle, dr.buffer.ptr, dr.buffer.len, @truncate(dr.buffer.len / @sizeOf(posix.system.DirEnt))); |
| 5828 | switch (@as(posix.E, @enumFromInt(@min(rc, 0)))) { |
| 5829 | .SUCCESS => { |
| 5830 | syscall.finish(); |
| 5831 | break @intCast(rc); |
| 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 | if (n == 0) { |
| 5846 | dr.state = .finished; |
| 5847 | return 0; |
| 5848 | } |
| 5849 | dr.index = 0; |
| 5850 | // _kern_read_dir returns entry count, but Dir.Reader is designed for byte count |
| 5851 | dr.end = 0; |
| 5852 | var i: usize = 0; |
| 5853 | while (i < n) : (i += 1) { |
| 5854 | const entry = @as(*align(1) posix.system.DirEnt, @ptrCast(&dr.buffer[dr.end])); |
| 5855 | dr.end += entry.reclen; |
| 5856 | } |
| 5857 | } |
| 5858 | const entry = @as(*align(1) posix.system.DirEnt, @ptrCast(&dr.buffer[dr.index])); |
| 5859 | const next_index = dr.index + entry.reclen; |
| 5860 | dr.index = next_index; |
| 5861 | |
| 5862 | const name = std.mem.sliceTo(@as([*:0]u8, @ptrCast(&entry.name)), 0); |
| 5863 | if (std.mem.eql(u8, name, ".") or std.mem.eql(u8, name, "..") or entry.ino == 0) continue; |
| 5864 | |
| 5865 | // haiku dirent doesn't expose type, so we have to call stat to get it. |
| 5866 | var stat: std.c.Stat = undefined; |
| 5867 | { |
| 5868 | const syscall: Syscall = try .start(); |
| 5869 | while (true) { |
| 5870 | const rc = posix.system._kern_read_stat(dr.dir.handle, name, false, &stat, @sizeOf(std.c.Stat)); |
| 5871 | switch (@as(posix.E, @enumFromInt(@min(rc, 0)))) { |
| 5872 | .SUCCESS => { |
| 5873 | syscall.finish(); |
| 5874 | break; |
| 5875 | }, |
| 5876 | .INTR => { |
| 5877 | try syscall.checkCancel(); |
| 5878 | continue; |
| 5879 | }, |
| 5880 | else => |e| { |
| 5881 | syscall.finish(); |
| 5882 | switch (e) { |
| 5883 | else => |err| return posix.unexpectedErrno(err), |
| 5884 | } |
| 5885 | }, |
| 5886 | } |
| 5887 | } |
| 5888 | } |
| 5889 | |
| 5890 | const entry_kind: File.Kind = switch (stat.mode & posix.S.IFMT) { |
| 5891 | posix.S.IFBLK => .block_device, |
| 5892 | posix.S.IFCHR => .character_device, |
| 5893 | posix.S.IFDIR => .directory, |
| 5894 | posix.S.IFIFO => .named_pipe, |
| 5895 | posix.S.IFLNK => .sym_link, |
| 5896 | posix.S.IFREG => .file, |
| 5897 | else => .unknown, |
| 5898 | }; |
| 5899 | buffer[buffer_index] = .{ |
| 5900 | .name = name, |
| 5901 | .kind = entry_kind, |
| 5902 | .inode = entry.ino, |
| 5903 | }; |
| 5904 | buffer_index += 1; |
| 5905 | } |
| 5906 | return buffer_index; |
| 5798 | 5907 | } |
| 5799 | 5908 | |
| 5800 | 5909 | fn dirReadWindows(userdata: ?*anyopaque, dr: *Dir.Reader, buffer: []Dir.Entry) Dir.Reader.Error!usize { |
| ... | ... | @@ -9812,7 +9921,10 @@ fn fileReadPositionalPosix(file: File, data: []const []u8, offset: u64) File.Rea |
| 9812 | 9921 | if (have_preadv) { |
| 9813 | 9922 | const syscall: Syscall = try .start(); |
| 9814 | 9923 | while (true) { |
| 9815 | | const rc = preadv_sym(file.handle, dest.ptr, @intCast(dest.len), @bitCast(offset)); |
| 9924 | const rc = if (native_os == .haiku) |
| 9925 | posix.system.readv_pos(file.handle, @bitCast(offset), dest.ptr, @intCast(dest.len)) |
| 9926 | else |
| 9927 | preadv_sym(file.handle, dest.ptr, @intCast(dest.len), @bitCast(offset)); |
| 9816 | 9928 | switch (posix.errno(rc)) { |
| 9817 | 9929 | .SUCCESS => { |
| 9818 | 9930 | syscall.finish(); |
| ... | ... | @@ -9846,7 +9958,7 @@ fn fileReadPositionalPosix(file: File, data: []const []u8, offset: u64) File.Rea |
| 9846 | 9958 | |
| 9847 | 9959 | const syscall: Syscall = try .start(); |
| 9848 | 9960 | while (true) { |
| 9849 | | const rc = posix.pread(file.handle, dest[0].ptr, @intCast(dest[0].len), @bitCast(offset)); |
| 9961 | const rc = pread_sym(file.handle, dest[0].base, @intCast(dest[0].len), @bitCast(offset)); |
| 9850 | 9962 | switch (posix.errno(rc)) { |
| 9851 | 9963 | .SUCCESS => { |
| 9852 | 9964 | syscall.finish(); |
| ... | ... | @@ -10550,7 +10662,10 @@ fn fileWritePositional( |
| 10550 | 10662 | |
| 10551 | 10663 | const syscall: Syscall = try .start(); |
| 10552 | 10664 | while (true) { |
| 10553 | | const rc = pwritev_sym(file.handle, &iovecs, @intCast(iovlen), @bitCast(offset)); |
| 10665 | const rc = if (native_os == .haiku) |
| 10666 | posix.system.writev_pos(file.handle, @bitCast(offset), &iovecs, @intCast(iovlen)) |
| 10667 | else |
| 10668 | pwritev_sym(file.handle, &iovecs, @intCast(iovlen), @bitCast(offset)); |
| 10554 | 10669 | switch (posix.errno(rc)) { |
| 10555 | 10670 | .SUCCESS => { |
| 10556 | 10671 | syscall.finish(); |
| ... | ... | @@ -14063,7 +14178,7 @@ pub fn posixSocketModeProtocol(family: posix.sa_family_t, mode: net.Socket.Mode, |
| 14063 | 14178 | .dgram => posix.SOCK.DGRAM, |
| 14064 | 14179 | .seqpacket => posix.SOCK.SEQPACKET, |
| 14065 | 14180 | .raw => posix.SOCK.RAW, |
| 14066 | | .rdm => posix.SOCK.RDM, |
| 14181 | .rdm => if (@hasDecl(posix.SOCK, "RDM")) posix.SOCK.RDM else return error.OptionUnsupported, |
| 14067 | 14182 | }, |
| 14068 | 14183 | if (protocol) |p| @intFromEnum(p) else if (is_windows) switch (family) { |
| 14069 | 14184 | posix.AF.UNIX => switch (mode) { |