diff --git a/lib/std/Thread.zig b/lib/std/Thread.zig index 625255d411..13dc708dfc 100644 --- a/lib/std/Thread.zig +++ b/lib/std/Thread.zig @@ -577,11 +577,12 @@ const PosixThreadImpl = struct { }; }, .haiku => { - var count: u32 = undefined; - var system_info: os.system_info = undefined; - _ = os.system.get_system_info(&system_info); // always returns B_OK - count = system_info.cpu_count; - return @intCast(usize, count); + var system_info: os.system.system_info = undefined; + const rc = os.system.get_system_info(&system_info); // always returns B_OK + return switch (os.errno(rc)) { + .SUCCESS => @intCast(usize, system_info.cpu_count), + else => |err| os.unexpectedErrno(err), + }; }, else => { var count: c_int = undefined; diff --git a/lib/std/c/haiku.zig b/lib/std/c/haiku.zig index dcebeea95e..e68abeaef1 100644 --- a/lib/std/c/haiku.zig +++ b/lib/std/c/haiku.zig @@ -14,8 +14,12 @@ pub extern "c" fn find_thread(thread_name: ?*c_void) i32; pub extern "c" fn get_system_info(system_info: *system_info) usize; +pub extern "c" fn _get_team_info(team: c_int, team_info: *team_info, size: usize) i32; + +pub extern "c" fn _get_next_area_info(team: c_int, cookie: *i64, area_info: *area_info, size: usize) i32; + // TODO revisit if abi changes or better option becomes apparent -pub extern "c" fn _get_next_image_info(team: c_int, cookie: *i32, image_info: *image_info) usize; +pub extern "c" fn _get_next_image_info(team: c_int, cookie: *i32, image_info: *image_info, size: usize) i32; pub extern "c" fn _kern_read_dir(fd: c_int, buf_ptr: [*]u8, nbytes: usize, maxcount: u32) usize; @@ -112,6 +116,12 @@ pub const EAI = enum(c_int) { pub const EAI_MAX = 15; +pub const AI = struct { + pub const NUMERICSERV = 0x00000008; +}; + +pub const AI_NUMERICSERV = AI.NUMERICSERV; + pub const fd_t = c_int; pub const pid_t = c_int; pub const uid_t = u32; @@ -282,15 +292,29 @@ pub const dirent = extern struct { } }; +pub const area_info = extern struct { + area: u32, + name: [32]u8, + size: usize, + lock: u32, + protection: u32, + team_id: i32, + ram_size: u32, + copy_count: u32, + in_count: u32, + out_count: u32, + address: *c_void, +}; + pub const image_info = extern struct { id: u32, - type: u32, + image_type: u32, sequence: i32, init_order: i32, init_routine: *c_void, term_routine: *c_void, device: i32, - node: i32, + node: i64, name: [1024]u8, text: *c_void, data: *c_void, @@ -328,6 +352,19 @@ pub const system_info = extern struct { abi: u32, }; +pub const team_info = extern struct { + team_id: i32, + thread_count: i32, + image_count: i32, + area_count: i32, + debugger_nub_thread: i32, + debugger_nub_port: i32, + argc: i32, + args: [64]u8, + uid: uid_t, + gid: gid_t, +}; + pub const in_port_t = u16; pub const sa_family_t = u8; @@ -374,8 +411,11 @@ pub const CTL = struct { pub const KERN = struct { pub const PROC = 14; // struct: process entries pub const PROC_PATHNAME = 12; // path to executable + pub const IOV_MAX = 1024; }; +pub const IOV_MAX = KERN.IOV_MAX; + pub const PATH_MAX = 1024; pub const STDIN_FILENO = 0; @@ -400,18 +440,13 @@ pub const MAP = struct { pub const FAILED = @intToPtr(*c_void, maxInt(usize)); pub const SHARED = 0x0001; pub const PRIVATE = 0x0002; - pub const FIXED = 0x0010; + pub const FIXED = 0x0004; pub const STACK = 0x0400; pub const NOSYNC = 0x0800; - pub const ANON = 0x1000; + pub const ANON = 0x0008; pub const ANONYMOUS = ANON; pub const FILE = 0; - pub const GUARD = 0x00002000; - pub const EXCL = 0x00004000; - pub const NOCORE = 0x00020000; - pub const PREFAULT_READ = 0x00040000; - pub const @"32BIT" = 0x00080000; }; pub const W = struct { @@ -535,8 +570,6 @@ pub const O = struct { pub const RDWR = 0x0002; pub const ACCMODE = 0x0003; - pub const SHLOCK = 0x0010; - pub const EXLOCK = 0x0020; pub const CREAT = 0x0200; pub const EXCL = 0x0800; @@ -549,7 +582,7 @@ pub const O = struct { pub const RSYNC = 0o4010000; pub const DIRECTORY = 0x20000; pub const NOFOLLOW = 0x0100; - pub const CLOEXEC = 0x00100000; + pub const CLOEXEC = 0x00000040; pub const ASYNC = 0x0040; pub const DIRECT = 0x00010000; @@ -1405,3 +1438,6 @@ pub const termios = extern struct { c_ospeed: speed_t, cc_t: [NCCS]cc_t, }; + +pub const MSG_NOSIGNAL = 0x0800; + diff --git a/lib/std/fs.zig b/lib/std/fs.zig index fca5304bf2..bcd1762366 100644 --- a/lib/std/fs.zig +++ b/lib/std/fs.zig @@ -527,13 +527,23 @@ pub const Dir = struct { } var stat_info: os.Stat = undefined; - _ = os.system._kern_read_stat( + const rc = os.system._kern_read_stat( self.dir.fd, &haiku_entry.d_name, false, &stat_info, 0, ); + if (rc != 0) { + switch (os.errno(rc)) { + .SUCCESS => {}, + .BADF => unreachable, // Dir is invalid or was opened without iteration ability + .FAULT => unreachable, + .NOTDIR => unreachable, + .INVAL => unreachable, + else => |err| return os.unexpectedErrno(err), + } + } const statmode = stat_info.mode & os.S.IFMT; const entry_kind = switch (statmode) {