diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2024-04-06 17:47:54 -0400 |
|---|---|---|
| committer | Jacob Young <jacobly0@users.noreply.github.com> | 2024-04-08 13:20:14 -0400 |
| commit | 0c83fa2fd03fec86c4e36075978646f202deec32 (patch) | |
| tree | cda13cb2e89e04e24bcc707cefbd0ea73d199a15 /lib/std | |
| parent | 23ee39116c783908420d7d9e58a9344042c823fa (diff) | |
| download | zig-0c83fa2fd03fec86c4e36075978646f202deec32.tar.gz zig-0c83fa2fd03fec86c4e36075978646f202deec32.zip | |
haiku: fix directory iteration
Diffstat (limited to 'lib/std')
| -rw-r--r-- | lib/std/c/haiku.zig | 1305 | ||||
| -rw-r--r-- | lib/std/fs/Dir.zig | 103 |
2 files changed, 788 insertions, 620 deletions
diff --git a/lib/std/c/haiku.zig b/lib/std/c/haiku.zig index d75dd3bf00..cd2e4bc296 100644 --- a/lib/std/c/haiku.zig +++ b/lib/std/c/haiku.zig @@ -5,28 +5,18 @@ const maxInt = std.math.maxInt; const iovec = std.posix.iovec; const iovec_const = std.posix.iovec_const; -extern "c" fn _errnop() *c_int; +pub extern "root" fn find_directory(which: directory_which, volume: i32, createIt: bool, path_ptr: [*]u8, length: i32) u64; -pub const _errno = _errnop; - -pub extern "c" fn find_directory(which: directory_which, volume: i32, createIt: bool, path_ptr: [*]u8, length: i32) u64; - -pub extern "c" fn find_thread(thread_name: ?*anyopaque) i32; +pub extern "root" fn find_thread(thread_name: ?*anyopaque) i32; -pub extern "c" fn get_system_info(system_info: *system_info) usize; +pub extern "root" 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 "root" fn _get_team_info(team: i32, 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; +pub extern "root" fn _get_next_area_info(team: i32, 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, size: usize) i32; - -pub extern "c" fn _kern_read_dir(fd: c_int, buf_ptr: [*]u8, nbytes: usize, maxcount: u32) usize; - -pub extern "c" fn _kern_read_stat(fd: c_int, path_ptr: [*]u8, traverse_link: bool, st: *Stat, stat_size: i32) usize; - -pub extern "c" fn _kern_get_current_team() i32; +pub extern "root" fn _get_next_image_info(team: i32, cookie: *i32, image_info: *image_info, size: usize) i32; pub const sem_t = extern struct { type: i32, @@ -45,7 +35,7 @@ pub const pthread_attr_t = extern struct { __stack_address: ?*anyopaque, }; -pub const EAI = enum(c_int) { +pub const EAI = enum(i32) { /// address family for hostname not supported ADDRFAMILY = 1, @@ -99,11 +89,7 @@ pub const AI = struct { pub const AI_NUMERICSERV = AI.NUMERICSERV; -pub const fd_t = c_int; -pub const pid_t = c_int; -pub const uid_t = u32; -pub const gid_t = u32; -pub const mode_t = c_uint; +pub const fd_t = i32; pub const socklen_t = u32; @@ -129,8 +115,8 @@ pub const dl_phdr_info = extern struct { }; pub const Flock = extern struct { - type: c_short, - whence: c_short, + type: i16, + whence: i16, start: off_t, len: off_t, pid: pid_t, @@ -159,54 +145,6 @@ pub const msghdr = extern struct { msg_flags: i32, }; -pub const off_t = i64; -pub const ino_t = u64; - -pub const Stat = extern struct { - dev: i32, - ino: u64, - mode: u32, - nlink: i32, - uid: i32, - gid: i32, - size: i64, - rdev: i32, - blksize: i32, - atim: timespec, - mtim: timespec, - ctim: timespec, - crtim: timespec, - st_type: u32, - blocks: i64, - - pub fn atime(self: @This()) timespec { - return self.atim; - } - pub fn mtime(self: @This()) timespec { - return self.mtim; - } - pub fn ctime(self: @This()) timespec { - return self.ctim; - } - pub fn birthtime(self: @This()) timespec { - return self.crtim; - } -}; - -pub const timespec = extern struct { - tv_sec: isize, - tv_nsec: isize, -}; - -pub const dirent = extern struct { - dev: i32, - pdev: i32, - ino: i64, - pino: i64, - reclen: u16, - name: [256]u8, -}; - pub const B_OS_NAME_LENGTH = 32; // OS.h pub const area_info = extern struct { @@ -354,17 +292,6 @@ pub const PROT = struct { pub const NONE = 0x00; }; -pub const CLOCK = struct { - /// system-wide monotonic clock (aka system time) - pub const MONOTONIC = 0; - /// system-wide real time clock - pub const REALTIME = -1; - /// clock measuring the used CPU time of the current process - pub const PROCESS_CPUTIME_ID = -2; - /// clock measuring the used CPU time of the current thread - pub const THREAD_CPUTIME_ID = -3; -}; - pub const MSF = struct { pub const ASYNC = 1; pub const INVALIDATE = 2; @@ -404,159 +331,526 @@ pub const W = struct { } }; -// /system/develop/headers/posix/poll.h +// access function +pub const F_OK = 0; // test for existence of file +pub const X_OK = 1; // test for execute or search permission +pub const W_OK = 2; // test for write permission +pub const R_OK = 4; // test for read permission -pub const nfds_t = usize; +pub const F = struct { + pub const DUPFD = 0x0001; + pub const GETFD = 0x0002; + pub const SETFD = 0x0004; + pub const GETFL = 0x0008; + pub const SETFL = 0x0010; -pub const pollfd = extern struct { - fd: i32, - events: i16, - revents: i16, -}; + pub const GETLK = 0x0020; + pub const SETLK = 0x0080; + pub const SETLKW = 0x0100; + pub const DUPFD_CLOEXEC = 0x0200; -pub const POLL = struct { - /// any readable data available - pub const IN = 0x0001; - /// file descriptor is writeable - pub const OUT = 0x0002; - pub const RDNORM = IN; - pub const WRNORM = OUT; - /// priority readable data - pub const RDBAND = 0x0008; - /// priority data can be written - pub const WRBAND = 0x0010; - /// high priority readable data - pub const PRI = 0x0020; + pub const RDLCK = 0x0040; + pub const UNLCK = 0x0200; + pub const WRLCK = 0x0400; +}; - /// errors pending - pub const ERR = 0x0004; - /// disconnected - pub const HUP = 0x0080; - /// invalid file descriptor - pub const NVAL = 0x1000; +pub const LOCK = struct { + pub const SH = 0x01; + pub const EX = 0x02; + pub const NB = 0x04; + pub const UN = 0x08; }; -// /system/develop/headers/posix/signal.h +pub const FD_CLOEXEC = 1; -pub const sigset_t = u64; -pub const empty_sigset: sigset_t = 0; -pub const filled_sigset = ~@as(sigset_t, 0); +pub const SEEK = struct { + pub const SET = 0; + pub const CUR = 1; + pub const END = 2; +}; -pub const SIG = struct { - pub const DFL: ?Sigaction.handler_fn = @ptrFromInt(0); - pub const IGN: ?Sigaction.handler_fn = @ptrFromInt(1); - pub const ERR: ?Sigaction.handler_fn = @ptrFromInt(maxInt(usize)); +pub const SOCK = struct { + pub const STREAM = 1; + pub const DGRAM = 2; + pub const RAW = 3; + pub const SEQPACKET = 5; - pub const HOLD: ?Sigaction.handler_fn = @ptrFromInt(3); + /// WARNING: this flag is not supported by windows socket functions directly, + /// it is only supported by std.os.socket. Be sure that this value does + /// not share any bits with any of the `SOCK` values. + pub const CLOEXEC = 0x10000; + /// WARNING: this flag is not supported by windows socket functions directly, + /// it is only supported by std.os.socket. Be sure that this value does + /// not share any bits with any of the `SOCK` values. + pub const NONBLOCK = 0x20000; +}; - pub const HUP = 1; - pub const INT = 2; - pub const QUIT = 3; - pub const ILL = 4; - pub const CHLD = 5; - pub const ABRT = 6; - pub const IOT = ABRT; - pub const PIPE = 7; - pub const FPE = 8; - pub const KILL = 9; - pub const STOP = 10; - pub const SEGV = 11; - pub const CONT = 12; - pub const TSTP = 13; - pub const ALRM = 14; - pub const TERM = 15; - pub const TTIN = 16; - pub const TTOU = 17; - pub const USR1 = 18; - pub const USR2 = 19; - pub const WINCH = 20; - pub const KILLTHR = 21; - pub const TRAP = 22; - pub const POLL = 23; - pub const PROF = 24; - pub const SYS = 25; - pub const URG = 26; - pub const VTALRM = 27; - pub const XCPU = 28; - pub const XFSZ = 29; - pub const BUS = 30; - pub const RESERVED1 = 31; - pub const RESERVED2 = 32; +pub const SO = struct { + pub const ACCEPTCONN = 0x00000001; + pub const BROADCAST = 0x00000002; + pub const DEBUG = 0x00000004; + pub const DONTROUTE = 0x00000008; + pub const KEEPALIVE = 0x00000010; + pub const OOBINLINE = 0x00000020; + pub const REUSEADDR = 0x00000040; + pub const REUSEPORT = 0x00000080; + pub const USELOOPBACK = 0x00000100; + pub const LINGER = 0x00000200; - pub const BLOCK = 1; - pub const UNBLOCK = 2; - pub const SETMASK = 3; + pub const SNDBUF = 0x40000001; + pub const SNDLOWAT = 0x40000002; + pub const SNDTIMEO = 0x40000003; + pub const RCVBUF = 0x40000004; + pub const RCVLOWAT = 0x40000005; + pub const RCVTIMEO = 0x40000006; + pub const ERROR = 0x40000007; + pub const TYPE = 0x40000008; + pub const NONBLOCK = 0x40000009; + pub const BINDTODEVICE = 0x4000000a; + pub const PEERCRED = 0x4000000b; }; -pub const siginfo_t = extern struct { - signo: c_int, - code: c_int, - errno: c_int, +pub const SOL = struct { + pub const SOCKET = -1; +}; - pid: pid_t, - uid: uid_t, - addr: *allowzero anyopaque, +pub const PF = struct { + pub const UNSPEC = AF.UNSPEC; + pub const INET = AF.INET; + pub const ROUTE = AF.ROUTE; + pub const LINK = AF.LINK; + pub const INET6 = AF.INET6; + pub const LOCAL = AF.LOCAL; + pub const UNIX = AF.UNIX; + pub const BLUETOOTH = AF.BLUETOOTH; }; -/// Renamed from `sigaction` to `Sigaction` to avoid conflict with the syscall. -pub const Sigaction = extern struct { - pub const handler_fn = *align(1) const fn (i32) callconv(.C) void; - pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.C) void; +pub const AF = struct { + pub const UNSPEC = 0; + pub const INET = 1; + pub const APPLETALK = 2; + pub const ROUTE = 3; + pub const LINK = 4; + pub const INET6 = 5; + pub const DLI = 6; + pub const IPX = 7; + pub const NOTIFY = 8; + pub const LOCAL = 9; + pub const UNIX = LOCAL; + pub const BLUETOOTH = 10; + pub const MAX = 11; +}; - /// signal handler - handler: extern union { - handler: handler_fn, - sigaction: sigaction_fn, - }, +pub const DT = struct {}; - /// signal mask to apply - mask: sigset_t, +/// add event to kq (implies enable) +pub const EV_ADD = 0x0001; - /// see signal options - flags: c_int, +/// delete event from kq +pub const EV_DELETE = 0x0002; - /// will be passed to the signal handler, BeOS extension - userdata: *allowzero anyopaque = undefined, +/// enable event +pub const EV_ENABLE = 0x0004; + +/// disable event (not reported) +pub const EV_DISABLE = 0x0008; + +/// only report one occurrence +pub const EV_ONESHOT = 0x0010; + +/// clear event state after reporting +pub const EV_CLEAR = 0x0020; + +/// force immediate event output +/// ... with or without EV_ERROR +/// ... use KEVENT_FLAG_ERROR_EVENTS +/// on syscalls supporting flags +pub const EV_RECEIPT = 0x0040; + +/// disable event after reporting +pub const EV_DISPATCH = 0x0080; + +pub const EVFILT_READ = -1; +pub const EVFILT_WRITE = -2; + +/// attached to aio requests +pub const EVFILT_AIO = -3; + +/// attached to vnodes +pub const EVFILT_VNODE = -4; + +/// attached to struct proc +pub const EVFILT_PROC = -5; + +/// attached to struct proc +pub const EVFILT_SIGNAL = -6; + +/// timers +pub const EVFILT_TIMER = -7; + +/// Process descriptors +pub const EVFILT_PROCDESC = -8; + +/// Filesystem events +pub const EVFILT_FS = -9; + +pub const EVFILT_LIO = -10; + +/// User events +pub const EVFILT_USER = -11; + +/// Sendfile events +pub const EVFILT_SENDFILE = -12; + +pub const EVFILT_EMPTY = -13; + +pub const T = struct { + pub const CGETA = 0x8000; + pub const CSETA = 0x8001; + pub const CSETAF = 0x8002; + pub const CSETAW = 0x8003; + pub const CWAITEVENT = 0x8004; + pub const CSBRK = 0x8005; + pub const CFLSH = 0x8006; + pub const CXONC = 0x8007; + pub const CQUERYCONNECTED = 0x8008; + pub const CGETBITS = 0x8009; + pub const CSETDTR = 0x8010; + pub const CSETRTS = 0x8011; + pub const IOCGWINSZ = 0x8012; + pub const IOCSWINSZ = 0x8013; + pub const CVTIME = 0x8014; + pub const IOCGPGRP = 0x8015; + pub const IOCSPGRP = 0x8016; + pub const IOCSCTTY = 0x8017; + pub const IOCMGET = 0x8018; + pub const IOCMSET = 0x8019; + pub const IOCSBRK = 0x8020; + pub const IOCCBRK = 0x8021; + pub const IOCMBIS = 0x8022; + pub const IOCMBIC = 0x8023; + pub const IOCGSID = 0x8024; + + pub const FIONREAD = 0xbe000001; + pub const FIONBIO = 0xbe000000; }; -pub const SA = struct { - pub const NOCLDSTOP = 0x01; - pub const NOCLDWAIT = 0x02; - pub const RESETHAND = 0x04; - pub const NODEFER = 0x08; - pub const RESTART = 0x10; - pub const ONSTACK = 0x20; - pub const SIGINFO = 0x40; - pub const NOMASK = NODEFER; - pub const STACK = ONSTACK; - pub const ONESHOT = RESETHAND; +pub const winsize = extern struct { + ws_row: u16, + ws_col: u16, + ws_xpixel: u16, + ws_ypixel: u16, }; -pub const SS = struct { - pub const ONSTACK = 0x1; - pub const DISABLE = 0x2; +pub const S = struct { + pub const IFMT = 0o170000; + pub const IFSOCK = 0o140000; + pub const IFLNK = 0o120000; + pub const IFREG = 0o100000; + pub const IFBLK = 0o060000; + pub const IFDIR = 0o040000; + pub const IFCHR = 0o020000; + pub const IFIFO = 0o010000; + pub const INDEX_DIR = 0o4000000000; + + pub const IUMSK = 0o7777; + pub const ISUID = 0o4000; + pub const ISGID = 0o2000; + pub const ISVTX = 0o1000; + pub const IRWXU = 0o700; + pub const IRUSR = 0o400; + pub const IWUSR = 0o200; + pub const IXUSR = 0o100; + pub const IRWXG = 0o070; + pub const IRGRP = 0o040; + pub const IWGRP = 0o020; + pub const IXGRP = 0o010; + pub const IRWXO = 0o007; + pub const IROTH = 0o004; + pub const IWOTH = 0o002; + pub const IXOTH = 0o001; + + pub fn ISREG(m: u32) bool { + return m & IFMT == IFREG; + } + + pub fn ISLNK(m: u32) bool { + return m & IFMT == IFLNK; + } + + pub fn ISBLK(m: u32) bool { + return m & IFMT == IFBLK; + } + + pub fn ISDIR(m: u32) bool { + return m & IFMT == IFDIR; + } + + pub fn ISCHR(m: u32) bool { + return m & IFMT == IFCHR; + } + + pub fn ISFIFO(m: u32) bool { + return m & IFMT == IFIFO; + } + + pub fn ISSOCK(m: u32) bool { + return m & IFMT == IFSOCK; + } + + pub fn ISINDEX(m: u32) bool { + return m & INDEX_DIR == INDEX_DIR; + } }; -pub const MINSIGSTKSZ = 8192; -pub const SIGSTKSZ = 16384; +pub const HOST_NAME_MAX = 255; -pub const stack_t = extern struct { - sp: [*]u8, - size: isize, +pub const addrinfo = extern struct { flags: i32, + family: i32, + socktype: i32, + protocol: i32, + addrlen: socklen_t, + canonname: ?[*:0]u8, + addr: ?*sockaddr, + next: ?*addrinfo, }; -pub const NSIG = 65; +pub const IPPROTO = struct { + pub const IP = 0; + pub const HOPOPTS = 0; + pub const ICMP = 1; + pub const IGMP = 2; + pub const TCP = 6; + pub const UDP = 17; + pub const IPV6 = 41; + pub const ROUTING = 43; + pub const FRAGMENT = 44; + pub const ESP = 50; + pub const AH = 51; + pub const ICMPV6 = 58; + pub const NONE = 59; + pub const DSTOPTS = 60; + pub const ETHERIP = 97; + pub const RAW = 255; + pub const MAX = 256; +}; -pub const mcontext_t = vregs; +pub const rlimit_resource = enum(i32) { + CORE = 0, + CPU = 1, + DATA = 2, + FSIZE = 3, + NOFILE = 4, + STACK = 5, + AS = 6, + NOVMON = 7, + _, +}; -pub const ucontext_t = extern struct { - link: ?*ucontext_t, - sigmask: sigset_t, - stack: stack_t, - mcontext: mcontext_t, +pub const rlim_t = i64; + +pub const RLIM = struct { + /// No limit + pub const INFINITY: rlim_t = (1 << 63) - 1; + + pub const SAVED_MAX = INFINITY; + pub const SAVED_CUR = INFINITY; +}; + +pub const rlimit = extern struct { + /// Soft limit + cur: rlim_t, + /// Hard limit + max: rlim_t, +}; + +pub const SHUT = struct { + pub const RD = 0; + pub const WR = 1; + pub const RDWR = 2; +}; + +// TODO fill out if needed +pub const directory_which = enum(i32) { + B_USER_SETTINGS_DIRECTORY = 0xbbe, + + _, +}; + +pub const MSG_NOSIGNAL = 0x0800; + +// /system/develop/headers/os/kernel/OS.h + +pub const area_id = i32; +pub const port_id = i32; +pub const sem_id = i32; +pub const team_id = i32; +pub const thread_id = i32; + +// /system/develop/headers/os/support/Errors.h + +pub const E = enum(i32) { + pub const B_GENERAL_ERROR_BASE: i32 = std.math.minInt(i32); + pub const B_OS_ERROR_BASE = B_GENERAL_ERROR_BASE + 0x1000; + pub const B_APP_ERROR_BASE = B_GENERAL_ERROR_BASE + 0x2000; + pub const B_INTERFACE_ERROR_BASE = B_GENERAL_ERROR_BASE + 0x3000; + pub const B_MEDIA_ERROR_BASE = B_GENERAL_ERROR_BASE + 0x4000; + pub const B_TRANSLATION_ERROR_BASE = B_GENERAL_ERROR_BASE + 0x4800; + pub const B_MIDI_ERROR_BASE = B_GENERAL_ERROR_BASE + 0x5000; + pub const B_STORAGE_ERROR_BASE = B_GENERAL_ERROR_BASE + 0x6000; + pub const B_POSIX_ERROR_BASE = B_GENERAL_ERROR_BASE + 0x7000; + pub const B_MAIL_ERROR_BASE = B_GENERAL_ERROR_BASE + 0x8000; + pub const B_PRINT_ERROR_BASE = B_GENERAL_ERROR_BASE + 0x9000; + pub const B_DEVICE_ERROR_BASE = B_GENERAL_ERROR_BASE + 0xa000; + + pub const B_ERRORS_END = B_GENERAL_ERROR_BASE + 0xffff; + + pub const B_NO_MEMORY = B_GENERAL_ERROR_BASE + 0; + pub const B_IO_ERROR = B_GENERAL_ERROR_BASE + 1; + pub const B_PERMISSION_DENIED = B_GENERAL_ERROR_BASE + 2; + pub const B_BAD_INDEX = B_GENERAL_ERROR_BASE + 3; + pub const B_BAD_TYPE = B_GENERAL_ERROR_BASE + 4; + pub const B_BAD_VALUE = B_GENERAL_ERROR_BASE + 5; + pub const B_MISMATCHED_VALUES = B_GENERAL_ERROR_BASE + 6; + pub const B_NAME_NOT_FOUND = B_GENERAL_ERROR_BASE + 7; + pub const B_NAME_IN_USE = B_GENERAL_ERROR_BASE + 8; + pub const B_TIMED_OUT = B_GENERAL_ERROR_BASE + 9; + pub const B_INTERRUPTED = B_GENERAL_ERROR_BASE + 10; + pub const B_WOULD_BLOCK = B_GENERAL_ERROR_BASE + 11; + pub const B_CANCELED = B_GENERAL_ERROR_BASE + 12; + pub const B_NO_INIT = B_GENERAL_ERROR_BASE + 13; + pub const B_NOT_INITIALIZED = B_GENERAL_ERROR_BASE + 13; + pub const B_BUSY = B_GENERAL_ERROR_BASE + 14; + pub const B_NOT_ALLOWED = B_GENERAL_ERROR_BASE + 15; + pub const B_BAD_DATA = B_GENERAL_ERROR_BASE + 16; + pub const B_DONT_DO_THAT = B_GENERAL_ERROR_BASE + 17; + + pub const B_BAD_IMAGE_ID = B_OS_ERROR_BASE + 0x300; + pub const B_BAD_ADDRESS = B_OS_ERROR_BASE + 0x301; + pub const B_NOT_AN_EXECUTABLE = B_OS_ERROR_BASE + 0x302; + pub const B_MISSING_LIBRARY = B_OS_ERROR_BASE + 0x303; + pub const B_MISSING_SYMBOL = B_OS_ERROR_BASE + 0x304; + pub const B_UNKNOWN_EXECUTABLE = B_OS_ERROR_BASE + 0x305; + pub const B_LEGACY_EXECUTABLE = B_OS_ERROR_BASE + 0x306; + + pub const B_FILE_ERROR = B_STORAGE_ERROR_BASE + 0; + pub const B_FILE_EXISTS = B_STORAGE_ERROR_BASE + 2; + pub const B_ENTRY_NOT_FOUND = B_STORAGE_ERROR_BASE + 3; + pub const B_NAME_TOO_LONG = B_STORAGE_ERROR_BASE + 4; + pub const B_NOT_A_DIRECTORY = B_STORAGE_ERROR_BASE + 5; + pub const B_DIRECTORY_NOT_EMPTY = B_STORAGE_ERROR_BASE + 6; + pub const B_DEVICE_FULL = B_STORAGE_ERROR_BASE + 7; + pub const B_READ_ONLY_DEVICE = B_STORAGE_ERROR_BASE + 8; + pub const B_IS_A_DIRECTORY = B_STORAGE_ERROR_BASE + 9; + pub const B_NO_MORE_FDS = B_STORAGE_ERROR_BASE + 10; + pub const B_CROSS_DEVICE_LINK = B_STORAGE_ERROR_BASE + 11; + pub const B_LINK_LIMIT = B_STORAGE_ERROR_BASE + 12; + pub const B_BUSTED_PIPE = B_STORAGE_ERROR_BASE + 13; + pub const B_UNSUPPORTED = B_STORAGE_ERROR_BASE + 14; + pub const B_PARTITION_TOO_SMALL = B_STORAGE_ERROR_BASE + 15; + pub const B_PARTIAL_READ = B_STORAGE_ERROR_BASE + 16; + pub const B_PARTIAL_WRITE = B_STORAGE_ERROR_BASE + 17; + + SUCCESS = 0, + + @"2BIG" = B_POSIX_ERROR_BASE + 1, + CHILD = B_POSIX_ERROR_BASE + 2, + DEADLK = B_POSIX_ERROR_BASE + 3, + FBIG = B_POSIX_ERROR_BASE + 4, + MLINK = B_POSIX_ERROR_BASE + 5, + NFILE = B_POSIX_ERROR_BASE + 6, + NODEV = B_POSIX_ERROR_BASE + 7, + NOLCK = B_POSIX_ERROR_BASE + 8, + NOSYS = B_POSIX_ERROR_BASE + 9, + NOTTY = B_POSIX_ERROR_BASE + 10, + NXIO = B_POSIX_ERROR_BASE + 11, + SPIPE = B_POSIX_ERROR_BASE + 12, + SRCH = B_POSIX_ERROR_BASE + 13, + FPOS = B_POSIX_ERROR_BASE + 14, + SIGPARM = B_POSIX_ERROR_BASE + 15, + DOM = B_POSIX_ERROR_BASE + 16, + RANGE = B_POSIX_ERROR_BASE + 17, + PROTOTYPE = B_POSIX_ERROR_BASE + 18, + PROTONOSUPPORT = B_POSIX_ERROR_BASE + 19, + PFNOSUPPORT = B_POSIX_ERROR_BASE + 20, + AFNOSUPPORT = B_POSIX_ERROR_BASE + 21, + ADDRINUSE = B_POSIX_ERROR_BASE + 22, + ADDRNOTAVAIL = B_POSIX_ERROR_BASE + 23, + NETDOWN = B_POSIX_ERROR_BASE + 24, + NETUNREACH = B_POSIX_ERROR_BASE + 25, + NETRESET = B_POSIX_ERROR_BASE + 26, + CONNABORTED = B_POSIX_ERROR_BASE + 27, + CONNRESET = B_POSIX_ERROR_BASE + 28, + ISCONN = B_POSIX_ERROR_BASE + 29, + NOTCONN = B_POSIX_ERROR_BASE + 30, + SHUTDOWN = B_POSIX_ERROR_BASE + 31, + CONNREFUSED = B_POSIX_ERROR_BASE + 32, + HOSTUNREACH = B_POSIX_ERROR_BASE + 33, + NOPROTOOPT = B_POSIX_ERROR_BASE + 34, + NOBUFS = B_POSIX_ERROR_BASE + 35, + INPROGRESS = B_POSIX_ERROR_BASE + 36, + ALREADY = B_POSIX_ERROR_BASE + 37, + ILSEQ = B_POSIX_ERROR_BASE + 38, + NOMSG = B_POSIX_ERROR_BASE + 39, + STALE = B_POSIX_ERROR_BASE + 40, + OVERFLOW = B_POSIX_ERROR_BASE + 41, + MSGSIZE = B_POSIX_ERROR_BASE + 42, + OPNOTSUPP = B_POSIX_ERROR_BASE + 43, + NOTSOCK = B_POSIX_ERROR_BASE + 44, + HOSTDOWN = B_POSIX_ERROR_BASE + 45, + BADMSG = B_POSIX_ERROR_BASE + 46, + CANCELED = B_POSIX_ERROR_BASE + 47, + DESTADDRREQ = B_POSIX_ERROR_BASE + 48, + DQUOT = B_POSIX_ERROR_BASE + 49, + IDRM = B_POSIX_ERROR_BASE + 50, + MULTIHOP = B_POSIX_ERROR_BASE + 51, + NODATA = B_POSIX_ERROR_BASE + 52, + NOLINK = B_POSIX_ERROR_BASE + 53, + NOSR = B_POSIX_ERROR_BASE + 54, + NOSTR = B_POSIX_ERROR_BASE + 55, + NOTSUP = B_POSIX_ERROR_BASE + 56, + PROTO = B_POSIX_ERROR_BASE + 57, + TIME = B_POSIX_ERROR_BASE + 58, + TXTBSY = B_POSIX_ERROR_BASE + 59, + NOATTR = B_POSIX_ERROR_BASE + 60, + NOTRECOVERABLE = B_POSIX_ERROR_BASE + 61, + OWNERDEAD = B_POSIX_ERROR_BASE + 62, + + NOMEM = B_NO_MEMORY, + + ACCES = B_PERMISSION_DENIED, + INTR = B_INTERRUPTED, + IO = B_IO_ERROR, + BUSY = B_BUSY, + FAULT = B_BAD_ADDRESS, + TIMEDOUT = B_TIMED_OUT, + /// Also used for WOULDBLOCK + AGAIN = B_WOULD_BLOCK, + BADF = B_FILE_ERROR, + EXIST = B_FILE_EXISTS, + INVAL = B_BAD_VALUE, + NAMETOOLONG = B_NAME_TOO_LONG, + NOENT = B_ENTRY_NOT_FOUND, + PERM = B_NOT_ALLOWED, + NOTDIR = B_NOT_A_DIRECTORY, + ISDIR = B_IS_A_DIRECTORY, + NOTEMPTY = B_DIRECTORY_NOT_EMPTY, + NOSPC = B_DEVICE_FULL, + ROFS = B_READ_ONLY_DEVICE, + MFILE = B_NO_MORE_FDS, + XDEV = B_CROSS_DEVICE_LINK, + LOOP = B_LINK_LIMIT, + NOEXEC = B_NOT_AN_EXECUTABLE, + PIPE = B_BUSTED_PIPE, + + _, }; +// /system/develop/headers/os/support/SupportDefs.h + +pub const status_t = i32; + // /system/develop/headers/posix/arch/*/signal.h pub const vregs = switch (builtin.cpu.arch) { @@ -822,445 +1116,278 @@ pub const vregs = switch (builtin.cpu.arch) { else => void, }; -// access function -pub const F_OK = 0; // test for existence of file -pub const X_OK = 1; // test for execute or search permission -pub const W_OK = 2; // test for write permission -pub const R_OK = 4; // test for read permission - -pub const F = struct { - pub const DUPFD = 0x0001; - pub const GETFD = 0x0002; - pub const SETFD = 0x0004; - pub const GETFL = 0x0008; - pub const SETFL = 0x0010; - - pub const GETLK = 0x0020; - pub const SETLK = 0x0080; - pub const SETLKW = 0x0100; - pub const DUPFD_CLOEXEC = 0x0200; - - pub const RDLCK = 0x0040; - pub const UNLCK = 0x0200; - pub const WRLCK = 0x0400; -}; - -pub const LOCK = struct { - pub const SH = 0x01; - pub const EX = 0x02; - pub const NB = 0x04; - pub const UN = 0x08; -}; - -pub const FD_CLOEXEC = 1; - -pub const SEEK = struct { - pub const SET = 0; - pub const CUR = 1; - pub const END = 2; +// /system/develop/headers/posix/dirent.h + +pub const DirEnt = extern struct { + /// device + dev: dev_t, + /// parent device (only for queries) + pdev: dev_t, + /// inode number + ino: ino_t, + /// parent inode (only for queries) + pino: ino_t, + /// length of this record, not the name + reclen: u16, + /// name of the entry (null byte terminated) + name: [0]u8, + pub fn getName(dirent: *const DirEnt) [*:0]const u8 { + return @ptrCast(&dirent.name); + } }; -pub const SOCK = struct { - pub const STREAM = 1; - pub const DGRAM = 2; - pub const RAW = 3; - pub const SEQPACKET = 5; +// /system/develop/headers/posix/errno.h - /// WARNING: this flag is not supported by windows socket functions directly, - /// it is only supported by std.os.socket. Be sure that this value does - /// not share any bits with any of the `SOCK` values. - pub const CLOEXEC = 0x10000; - /// WARNING: this flag is not supported by windows socket functions directly, - /// it is only supported by std.os.socket. Be sure that this value does - /// not share any bits with any of the `SOCK` values. - pub const NONBLOCK = 0x20000; -}; +extern "root" fn _errnop() *i32; +pub const _errno = _errnop; -pub const SO = struct { - pub const ACCEPTCONN = 0x00000001; - pub const BROADCAST = 0x00000002; - pub const DEBUG = 0x00000004; - pub const DONTROUTE = 0x00000008; - pub const KEEPALIVE = 0x00000010; - pub const OOBINLINE = 0x00000020; - pub const REUSEADDR = 0x00000040; - pub const REUSEPORT = 0x00000080; - pub const USELOOPBACK = 0x00000100; - pub const LINGER = 0x00000200; +// /system/develop/headers/posix/poll.h - pub const SNDBUF = 0x40000001; - pub const SNDLOWAT = 0x40000002; - pub const SNDTIMEO = 0x40000003; - pub const RCVBUF = 0x40000004; - pub const RCVLOWAT = 0x40000005; - pub const RCVTIMEO = 0x40000006; - pub const ERROR = 0x40000007; - pub const TYPE = 0x40000008; - pub const NONBLOCK = 0x40000009; - pub const BINDTODEVICE = 0x4000000a; - pub const PEERCRED = 0x4000000b; -}; +pub const nfds_t = usize; -pub const SOL = struct { - pub const SOCKET = -1; +pub const pollfd = extern struct { + fd: i32, + events: i16, + revents: i16, }; -pub const PF = struct { - pub const UNSPEC = AF.UNSPEC; - pub const INET = AF.INET; - pub const ROUTE = AF.ROUTE; - pub const LINK = AF.LINK; - pub const INET6 = AF.INET6; - pub const LOCAL = AF.LOCAL; - pub const UNIX = AF.UNIX; - pub const BLUETOOTH = AF.BLUETOOTH; -}; +pub const POLL = struct { + /// any readable data available + pub const IN = 0x0001; + /// file descriptor is writeable + pub const OUT = 0x0002; + pub const RDNORM = IN; + pub const WRNORM = OUT; + /// priority readable data + pub const RDBAND = 0x0008; + /// priority data can be written + pub const WRBAND = 0x0010; + /// high priority readable data + pub const PRI = 0x0020; -pub const AF = struct { - pub const UNSPEC = 0; - pub const INET = 1; - pub const APPLETALK = 2; - pub const ROUTE = 3; - pub const LINK = 4; - pub const INET6 = 5; - pub const DLI = 6; - pub const IPX = 7; - pub const NOTIFY = 8; - pub const LOCAL = 9; - pub const UNIX = LOCAL; - pub const BLUETOOTH = 10; - pub const MAX = 11; + /// errors pending + pub const ERR = 0x0004; + /// disconnected + pub const HUP = 0x0080; + /// invalid file descriptor + pub const NVAL = 0x1000; }; -pub const DT = struct {}; - -/// add event to kq (implies enable) -pub const EV_ADD = 0x0001; - -/// delete event from kq -pub const EV_DELETE = 0x0002; - -/// enable event -pub const EV_ENABLE = 0x0004; - -/// disable event (not reported) -pub const EV_DISABLE = 0x0008; - -/// only report one occurrence -pub const EV_ONESHOT = 0x0010; - -/// clear event state after reporting -pub const EV_CLEAR = 0x0020; - -/// force immediate event output -/// ... with or without EV_ERROR -/// ... use KEVENT_FLAG_ERROR_EVENTS -/// on syscalls supporting flags -pub const EV_RECEIPT = 0x0040; - -/// disable event after reporting -pub const EV_DISPATCH = 0x0080; - -pub const EVFILT_READ = -1; -pub const EVFILT_WRITE = -2; - -/// attached to aio requests -pub const EVFILT_AIO = -3; +// /system/develop/headers/posix/signal.h -/// attached to vnodes -pub const EVFILT_VNODE = -4; +pub const sigset_t = u64; +pub const empty_sigset: sigset_t = 0; +pub const filled_sigset = ~@as(sigset_t, 0); -/// attached to struct proc -pub const EVFILT_PROC = -5; +pub const SIG = struct { + pub const DFL: ?Sigaction.handler_fn = @ptrFromInt(0); + pub const IGN: ?Sigaction.handler_fn = @ptrFromInt(1); + pub const ERR: ?Sigaction.handler_fn = @ptrFromInt(maxInt(usize)); -/// attached to struct proc -pub const EVFILT_SIGNAL = -6; + pub const HOLD: ?Sigaction.handler_fn = @ptrFromInt(3); -/// timers -pub const EVFILT_TIMER = -7; + pub const HUP = 1; + pub const INT = 2; + pub const QUIT = 3; + pub const ILL = 4; + pub const CHLD = 5; + pub const ABRT = 6; + pub const IOT = ABRT; + pub const PIPE = 7; + pub const FPE = 8; + pub const KILL = 9; + pub const STOP = 10; + pub const SEGV = 11; + pub const CONT = 12; + pub const TSTP = 13; + pub const ALRM = 14; + pub const TERM = 15; + pub const TTIN = 16; + pub const TTOU = 17; + pub const USR1 = 18; + pub const USR2 = 19; + pub const WINCH = 20; + pub const KILLTHR = 21; + pub const TRAP = 22; + pub const POLL = 23; + pub const PROF = 24; + pub const SYS = 25; + pub const URG = 26; + pub const VTALRM = 27; + pub const XCPU = 28; + pub const XFSZ = 29; + pub const BUS = 30; + pub const RESERVED1 = 31; + pub const RESERVED2 = 32; -/// Process descriptors -pub const EVFILT_PROCDESC = -8; + pub const BLOCK = 1; + pub const UNBLOCK = 2; + pub const SETMASK = 3; +}; -/// Filesystem events -pub const EVFILT_FS = -9; +pub const siginfo_t = extern struct { + signo: i32, + code: i32, + errno: i32, -pub const EVFILT_LIO = -10; + pid: pid_t, + uid: uid_t, + addr: *allowzero anyopaque, +}; -/// User events -pub const EVFILT_USER = -11; +/// Renamed from `sigaction` to `Sigaction` to avoid conflict with the syscall. +pub const Sigaction = extern struct { + pub const handler_fn = *align(1) const fn (i32) callconv(.C) void; + pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.C) void; -/// Sendfile events -pub const EVFILT_SENDFILE = -12; + /// signal handler + handler: extern union { + handler: handler_fn, + sigaction: sigaction_fn, + }, -pub const EVFILT_EMPTY = -13; + /// signal mask to apply + mask: sigset_t, -pub const T = struct { - pub const CGETA = 0x8000; - pub const CSETA = 0x8001; - pub const CSETAF = 0x8002; - pub const CSETAW = 0x8003; - pub const CWAITEVENT = 0x8004; - pub const CSBRK = 0x8005; - pub const CFLSH = 0x8006; - pub const CXONC = 0x8007; - pub const CQUERYCONNECTED = 0x8008; - pub const CGETBITS = 0x8009; - pub const CSETDTR = 0x8010; - pub const CSETRTS = 0x8011; - pub const IOCGWINSZ = 0x8012; - pub const IOCSWINSZ = 0x8013; - pub const CVTIME = 0x8014; - pub const IOCGPGRP = 0x8015; - pub const IOCSPGRP = 0x8016; - pub const IOCSCTTY = 0x8017; - pub const IOCMGET = 0x8018; - pub const IOCMSET = 0x8019; - pub const IOCSBRK = 0x8020; - pub const IOCCBRK = 0x8021; - pub const IOCMBIS = 0x8022; - pub const IOCMBIC = 0x8023; - pub const IOCGSID = 0x8024; + /// see signal options + flags: i32, - pub const FIONREAD = 0xbe000001; - pub const FIONBIO = 0xbe000000; + /// will be passed to the signal handler, BeOS extension + userdata: *allowzero anyopaque = undefined, }; -pub const winsize = extern struct { - ws_row: u16, - ws_col: u16, - ws_xpixel: u16, - ws_ypixel: u16, +pub const SA = struct { + pub const NOCLDSTOP = 0x01; + pub const NOCLDWAIT = 0x02; + pub const RESETHAND = 0x04; + pub const NODEFER = 0x08; + pub const RESTART = 0x10; + pub const ONSTACK = 0x20; + pub const SIGINFO = 0x40; + pub const NOMASK = NODEFER; + pub const STACK = ONSTACK; + pub const ONESHOT = RESETHAND; }; -const B_POSIX_ERROR_BASE = -2147454976; +pub const SS = struct { + pub const ONSTACK = 0x1; + pub const DISABLE = 0x2; +}; -pub const E = enum(i32) { - @"2BIG" = B_POSIX_ERROR_BASE + 1, - CHILD = B_POSIX_ERROR_BASE + 2, - DEADLK = B_POSIX_ERROR_BASE + 3, - FBIG = B_POSIX_ERROR_BASE + 4, - MLINK = B_POSIX_ERROR_BASE + 5, - NFILE = B_POSIX_ERROR_BASE + 6, - NODEV = B_POSIX_ERROR_BASE + 7, - NOLCK = B_POSIX_ERROR_BASE + 8, - NOSYS = B_POSIX_ERROR_BASE + 9, - NOTTY = B_POSIX_ERROR_BASE + 10, - NXIO = B_POSIX_ERROR_BASE + 11, - SPIPE = B_POSIX_ERROR_BASE + 12, - SRCH = B_POSIX_ERROR_BASE + 13, - FPOS = B_POSIX_ERROR_BASE + 14, - SIGPARM = B_POSIX_ERROR_BASE + 15, - DOM = B_POSIX_ERROR_BASE + 16, - RANGE = B_POSIX_ERROR_BASE + 17, - PROTOTYPE = B_POSIX_ERROR_BASE + 18, - PROTONOSUPPORT = B_POSIX_ERROR_BASE + 19, - PFNOSUPPORT = B_POSIX_ERROR_BASE + 20, - AFNOSUPPORT = B_POSIX_ERROR_BASE + 21, - ADDRINUSE = B_POSIX_ERROR_BASE + 22, - ADDRNOTAVAIL = B_POSIX_ERROR_BASE + 23, - NETDOWN = B_POSIX_ERROR_BASE + 24, - NETUNREACH = B_POSIX_ERROR_BASE + 25, - NETRESET = B_POSIX_ERROR_BASE + 26, - CONNABORTED = B_POSIX_ERROR_BASE + 27, - CONNRESET = B_POSIX_ERROR_BASE + 28, - ISCONN = B_POSIX_ERROR_BASE + 29, - NOTCONN = B_POSIX_ERROR_BASE + 30, - SHUTDOWN = B_POSIX_ERROR_BASE + 31, - CONNREFUSED = B_POSIX_ERROR_BASE + 32, - HOSTUNREACH = B_POSIX_ERROR_BASE + 33, - NOPROTOOPT = B_POSIX_ERROR_BASE + 34, - NOBUFS = B_POSIX_ERROR_BASE + 35, - INPROGRESS = B_POSIX_ERROR_BASE + 36, - ALREADY = B_POSIX_ERROR_BASE + 37, - ILSEQ = B_POSIX_ERROR_BASE + 38, - NOMSG = B_POSIX_ERROR_BASE + 39, - STALE = B_POSIX_ERROR_BASE + 40, - OVERFLOW = B_POSIX_ERROR_BASE + 41, - MSGSIZE = B_POSIX_ERROR_BASE + 42, - OPNOTSUPP = B_POSIX_ERROR_BASE + 43, - NOTSOCK = B_POSIX_ERROR_BASE + 44, - HOSTDOWN = B_POSIX_ERROR_BASE + 45, - BADMSG = B_POSIX_ERROR_BASE + 46, - CANCELED = B_POSIX_ERROR_BASE + 47, - DESTADDRREQ = B_POSIX_ERROR_BASE + 48, - DQUOT = B_POSIX_ERROR_BASE + 49, - IDRM = B_POSIX_ERROR_BASE + 50, - MULTIHOP = B_POSIX_ERROR_BASE + 51, - NODATA = B_POSIX_ERROR_BASE + 52, - NOLINK = B_POSIX_ERROR_BASE + 53, - NOSR = B_POSIX_ERROR_BASE + 54, - NOSTR = B_POSIX_ERROR_BASE + 55, - NOTSUP = B_POSIX_ERROR_BASE + 56, - PROTO = B_POSIX_ERROR_BASE + 57, - TIME = B_POSIX_ERROR_BASE + 58, - TXTBSY = B_POSIX_ERROR_BASE + 59, - NOATTR = B_POSIX_ERROR_BASE + 60, - NOTRECOVERABLE = B_POSIX_ERROR_BASE + 61, - OWNERDEAD = B_POSIX_ERROR_BASE + 62, +pub const MINSIGSTKSZ = 8192; +pub const SIGSTKSZ = 16384; - ACCES = -0x7ffffffe, // Permission denied - INTR = -0x7ffffff6, // Interrupted system call - IO = -0x7fffffff, // Input/output error - BUSY = -0x7ffffff2, // Device busy - FAULT = -0x7fffecff, // Bad address - TIMEDOUT = -2147483639, // Operation timed out - AGAIN = -0x7ffffff5, - BADF = -0x7fffa000, // Bad file descriptor - EXIST = -0x7fff9ffe, // File exists - INVAL = -0x7ffffffb, // Invalid argument - NAMETOOLONG = -2147459068, // File name too long - NOENT = -0x7fff9ffd, // No such file or directory - PERM = -0x7ffffff1, // Operation not permitted - NOTDIR = -0x7fff9ffb, // Not a directory - ISDIR = -0x7fff9ff7, // Is a directory - NOTEMPTY = -2147459066, // Directory not empty - NOSPC = -0x7fff9ff9, // No space left on device - ROFS = -0x7fff9ff8, // Read-only filesystem - MFILE = -0x7fff9ff6, // Too many open files - XDEV = -0x7fff9ff5, // Cross-device link - NOEXEC = -0x7fffecfe, // Exec format error - PIPE = -0x7fff9ff3, // Broken pipe - NOMEM = -0x80000000, // Cannot allocate memory - LOOP = -2147459060, // Too many levels of symbolic links - SUCCESS = 0, - _, +pub const stack_t = extern struct { + sp: [*]u8, + size: isize, + flags: i32, }; -pub const S = struct { - pub const IFMT = 0o170000; - pub const IFSOCK = 0o140000; - pub const IFLNK = 0o120000; - pub const IFREG = 0o100000; - pub const IFBLK = 0o060000; - pub const IFDIR = 0o040000; - pub const IFCHR = 0o020000; - pub const IFIFO = 0o010000; - pub const INDEX_DIR = 0o4000000000; - - pub const IUMSK = 0o7777; - pub const ISUID = 0o4000; - pub const ISGID = 0o2000; - pub const ISVTX = 0o1000; - pub const IRWXU = 0o700; - pub const IRUSR = 0o400; - pub const IWUSR = 0o200; - pub const IXUSR = 0o100; - pub const IRWXG = 0o070; - pub const IRGRP = 0o040; - pub const IWGRP = 0o020; - pub const IXGRP = 0o010; - pub const IRWXO = 0o007; - pub const IROTH = 0o004; - pub const IWOTH = 0o002; - pub const IXOTH = 0o001; +pub const NSIG = 65; - pub fn ISREG(m: u32) bool { - return m & IFMT == IFREG; - } +pub const mcontext_t = vregs; - pub fn ISLNK(m: u32) bool { - return m & IFMT == IFLNK; - } +pub const ucontext_t = extern struct { + link: ?*ucontext_t, + sigmask: sigset_t, + stack: stack_t, + mcontext: mcontext_t, +}; - pub fn ISBLK(m: u32) bool { - return m & IFMT == IFBLK; - } +// /system/develop/headers/posix/sys/stat.h - pub fn ISDIR(m: u32) bool { - return m & IFMT == IFDIR; - } +pub const Stat = extern struct { + dev: dev_t, + ino: ino_t, + mode: mode_t, + nlink: nlink_t, + uid: uid_t, + gid: gid_t, + size: off_t, + rdev: dev_t, + blksize: blksize_t, + atim: timespec, + mtim: timespec, + ctim: timespec, + crtim: timespec, + type: u32, + blocks: blkcnt_t, - pub fn ISCHR(m: u32) bool { - return m & IFMT == IFCHR; + pub fn atime(self: @This()) timespec { + return self.atim; } - - pub fn ISFIFO(m: u32) bool { - return m & IFMT == IFIFO; + pub fn mtime(self: @This()) timespec { + return self.mtim; } - - pub fn ISSOCK(m: u32) bool { - return m & IFMT == IFSOCK; + pub fn ctime(self: @This()) timespec { + return self.ctim; } - - pub fn ISINDEX(m: u32) bool { - return m & INDEX_DIR == INDEX_DIR; + pub fn birthtime(self: @This()) timespec { + return self.crtim; } }; -pub const HOST_NAME_MAX = 255; +// /system/develop/headers/posix/sys/types.h -pub const addrinfo = extern struct { - flags: i32, - family: i32, - socktype: i32, - protocol: i32, - addrlen: socklen_t, - canonname: ?[*:0]u8, - addr: ?*sockaddr, - next: ?*addrinfo, -}; +pub const blkcnt_t = i64; +pub const blksize_t = i32; +pub const fsblkcnt_t = i64; +pub const fsfilcnt_t = i64; +pub const off_t = i64; +pub const ino_t = i64; +pub const cnt_t = i32; +pub const dev_t = i32; +pub const pid_t = i32; +pub const id_t = i32; -pub const IPPROTO = struct { - pub const IP = 0; - pub const HOPOPTS = 0; - pub const ICMP = 1; - pub const IGMP = 2; - pub const TCP = 6; - pub const UDP = 17; - pub const IPV6 = 41; - pub const ROUTING = 43; - pub const FRAGMENT = 44; - pub const ESP = 50; - pub const AH = 51; - pub const ICMPV6 = 58; - pub const NONE = 59; - pub const DSTOPTS = 60; - pub const ETHERIP = 97; - pub const RAW = 255; - pub const MAX = 256; -}; +pub const uid_t = u32; +pub const gid_t = u32; +pub const mode_t = u32; +pub const umode_t = u32; +pub const nlink_t = i32; -pub const rlimit_resource = enum(c_int) { - CORE = 0, - CPU = 1, - DATA = 2, - FSIZE = 3, - NOFILE = 4, - STACK = 5, - AS = 6, - NOVMON = 7, - _, -}; +pub const clockid_t = i32; +pub const timer_t = *opaque {}; -pub const rlim_t = i64; +// /system/develop/headers/posix/time.h -pub const RLIM = struct { - /// No limit - pub const INFINITY: rlim_t = (1 << 63) - 1; +pub const clock_t = i32; +pub const suseconds_t = i32; +pub const useconds_t = u32; - pub const SAVED_MAX = INFINITY; - pub const SAVED_CUR = INFINITY; -}; +pub const time_t = isize; -pub const rlimit = extern struct { - /// Soft limit - cur: rlim_t, - /// Hard limit - max: rlim_t, -}; +pub const CLOCKS_PER_SEC = 1_000_000; +pub const CLK_TCK = CLOCKS_PER_SEC; +pub const TIME_UTC = 1; -pub const SHUT = struct { - pub const RD = 0; - pub const WR = 1; - pub const RDWR = 2; +pub const CLOCK = struct { + /// system-wide monotonic clock (aka system time) + pub const MONOTONIC: clockid_t = 0; + /// system-wide real time clock + pub const REALTIME: clockid_t = -1; + /// clock measuring the used CPU time of the current process + pub const PROCESS_CPUTIME_ID: clockid_t = -2; + /// clock measuring the used CPU time of the current thread + pub const THREAD_CPUTIME_ID: clockid_t = -3; }; -// TODO fill out if needed -pub const directory_which = enum(c_int) { - B_USER_SETTINGS_DIRECTORY = 0xbbe, +pub const timespec = extern struct { + /// seconds + tv_sec: time_t, + /// and nanoseconds + tv_nsec: isize, +}; - _, +pub const itimerspec = extern struct { + interval: timespec, + value: timespec, }; -pub const MSG_NOSIGNAL = 0x0800; +// /system/develop/headers/private/system/syscalls.h + +pub extern "root" fn _kern_get_current_team() team_id; +pub extern "root" fn _kern_open_dir(fd: fd_t, path: [*:0]const u8) fd_t; +pub extern "root" fn _kern_read_dir(fd: fd_t, buffer: [*]u8, bufferSize: usize, maxCount: u32) isize; +pub extern "root" fn _kern_rewind_dir(fd: fd_t) status_t; +pub extern "root" fn _kern_read_stat(fd: fd_t, path: [*:0]const u8, traverseLink: bool, stat: *Stat, statSize: usize) status_t; diff --git a/lib/std/fs/Dir.zig b/lib/std/fs/Dir.zig index 74d91239f8..785e9541e2 100644 --- a/lib/std/fs/Dir.zig +++ b/lib/std/fs/Dir.zig @@ -220,71 +220,83 @@ pub const Iterator = switch (native_os) { }, .haiku => struct { dir: Dir, - buf: [1024]u8, // TODO align(@alignOf(posix.dirent64)), + buf: [@sizeOf(DirEnt) + posix.PATH_MAX]u8 align(@alignOf(DirEnt)), + offset: usize, index: usize, end_index: usize, first_iter: bool, const Self = @This(); + const DirEnt = posix.system.DirEnt; pub const Error = IteratorError; /// Memory such as file names referenced in this returned entry becomes invalid /// with subsequent calls to `next`, as well as when this `Dir` is deinitialized. pub fn next(self: *Self) Error!?Entry { - start_over: while (true) { - // TODO: find a better max - const HAIKU_MAX_COUNT = 10000; + while (true) { if (self.index >= self.end_index) { if (self.first_iter) { - posix.lseek_SET(self.dir.fd, 0) catch unreachable; // EBADF here likely means that the Dir was not opened with iteration permissions + switch (@as(posix.E, @enumFromInt(posix.system._kern_rewind_dir(self.dir.fd)))) { + .SUCCESS => {}, + .BADF => unreachable, // Dir is invalid + .FAULT => unreachable, + .NOTDIR => unreachable, + .INVAL => unreachable, + .ACCES => return error.AccessDenied, + .PERM => return error.AccessDenied, + else => |err| return posix.unexpectedErrno(err), + } self.first_iter = false; } const rc = posix.system._kern_read_dir( self.dir.fd, &self.buf, self.buf.len, - HAIKU_MAX_COUNT, + self.buf.len / @sizeOf(DirEnt), ); if (rc == 0) return null; if (rc < 0) { - switch (posix.errno(rc)) { - .BADF => unreachable, // Dir is invalid or was opened without iteration ability + switch (@as(posix.E, @enumFromInt(rc))) { + .BADF => unreachable, // Dir is invalid .FAULT => unreachable, .NOTDIR => unreachable, .INVAL => unreachable, + .OVERFLOW => unreachable, + .ACCES => return error.AccessDenied, + .PERM => return error.AccessDenied, else => |err| return posix.unexpectedErrno(err), } } + self.offset = 0; self.index = 0; - self.end_index = @as(usize, @intCast(rc)); - } - const haiku_entry = @as(*align(1) posix.system.dirent, @ptrCast(&self.buf[self.index])); - const next_index = self.index + haiku_entry.reclen; - self.index = next_index; - const name = mem.sliceTo(@as([*:0]u8, @ptrCast(&haiku_entry.name)), 0); - - if (mem.eql(u8, name, ".") or mem.eql(u8, name, "..") or (haiku_entry.ino == 0)) { - continue :start_over; + self.end_index = @intCast(rc); } + const dirent: *DirEnt = @ptrCast(@alignCast(&self.buf[self.offset])); + self.offset += dirent.reclen; + self.index += 1; + const name = mem.span(dirent.getName()); + if (mem.eql(u8, name, ".") or mem.eql(u8, name, "..") or dirent.ino == 0) continue; var stat_info: posix.Stat = undefined; - const rc = posix.system._kern_read_stat( + switch (@as(posix.E, @enumFromInt(posix.system._kern_read_stat( self.dir.fd, - &haiku_entry.name, + name, false, &stat_info, 0, - ); - if (rc != 0) { - switch (posix.errno(rc)) { - .SUCCESS => {}, - .BADF => unreachable, // Dir is invalid or was opened without iteration ability - .FAULT => unreachable, - .NOTDIR => unreachable, - .INVAL => unreachable, - else => |err| return posix.unexpectedErrno(err), - } + )))) { + .SUCCESS => {}, + .INVAL => unreachable, + .BADF => unreachable, // Dir is invalid + .NOMEM => return error.SystemResources, + .ACCES => return error.AccessDenied, + .PERM => return error.AccessDenied, + .FAULT => unreachable, + .NAMETOOLONG => unreachable, + .LOOP => unreachable, + .NOENT => continue, + else => |err| return posix.unexpectedErrno(err), } const statmode = stat_info.mode & posix.S.IFMT; @@ -315,7 +327,7 @@ pub const Iterator = switch (native_os) { dir: Dir, // The if guard is solely there to prevent compile errors from missing `linux.dirent64` // definition when compiling for other OSes. It doesn't do anything when compiling for Linux. - buf: [1024]u8 align(if (native_os != .linux) 1 else @alignOf(linux.dirent64)), + buf: [1024]u8 align(@alignOf(linux.dirent64)), index: usize, end_index: usize, first_iter: bool, @@ -599,13 +611,21 @@ fn iterateImpl(self: Dir, first_iter_start_value: bool) Iterator { .buf = undefined, .first_iter = first_iter_start_value, }, - .linux, .haiku => return Iterator{ + .linux => return Iterator{ .dir = self, .index = 0, .end_index = 0, .buf = undefined, .first_iter = first_iter_start_value, }, + .haiku => return Iterator{ + .dir = self, + .offset = 0, + .index = 0, + .end_index = 0, + .buf = undefined, + .first_iter = first_iter_start_value, + }, .windows => return Iterator{ .dir = self, .index = 0, @@ -1429,6 +1449,27 @@ pub fn openDirZ(self: Dir, sub_path_c: [*:0]const u8, args: OpenDirOptions) Open .wasi => { return openDir(self, mem.sliceTo(sub_path_c, 0), args); }, + .haiku => { + const rc = posix.system._kern_open_dir(self.fd, sub_path_c); + if (rc >= 0) return .{ .fd = rc }; + switch (@as(posix.E, @enumFromInt(rc))) { + .FAULT => unreachable, + .INVAL => unreachable, + .BADF => unreachable, + .ACCES => return error.AccessDenied, + .LOOP => return error.SymLinkLoop, + .MFILE => return error.ProcessFdQuotaExceeded, + .NAMETOOLONG => return error.NameTooLong, + .NFILE => return error.SystemFdQuotaExceeded, + .NODEV => return error.NoDevice, + .NOENT => return error.FileNotFound, + .NOMEM => return error.SystemResources, + .NOTDIR => return error.NotDir, + .PERM => return error.AccessDenied, + .BUSY => return error.DeviceBusy, + else => |err| return posix.unexpectedErrno(err), + } + }, else => { var symlink_flags: posix.O = .{ .ACCMODE = .RDONLY, |
