const builtin = @import("builtin"); const std = @import("../std.zig"); const assert = std.debug.assert; const PATH_MAX = std.c.PATH_MAX; const blkcnt_t = std.c.blkcnt_t; const blksize_t = std.c.blksize_t; const dev_t = std.c.dev_t; const fd_t = std.c.fd_t; const gid_t = std.c.gid_t; const ino_t = std.c.ino_t; const iovec_const = std.posix.iovec_const; const mode_t = std.c.mode_t; const nlink_t = std.c.nlink_t; const off_t = std.c.off_t; const pid_t = std.c.pid_t; const sockaddr = std.c.sockaddr; const time_t = std.c.time_t; const timespec = std.c.timespec; const uid_t = std.c.uid_t; const sf_hdtr = std.c.sf_hdtr; const clockid_t = std.c.clockid_t; comptime { assert(builtin.os.tag == .freebsd); // Prevent access of std.c symbols on wrong OS. } pub extern "c" fn kinfo_getfile(pid: pid_t, cntp: *c_int) ?[*]kinfo_file; pub extern "c" fn copy_file_range(fd_in: fd_t, off_in: ?*off_t, fd_out: fd_t, off_out: ?*off_t, len: usize, flags: u32) usize; pub extern "c" fn sendfile( in_fd: fd_t, out_fd: fd_t, offset: off_t, nbytes: usize, sf_hdtr: ?*sf_hdtr, sbytes: ?*off_t, flags: u32, ) c_int; pub const UMTX_OP = enum(c_int) { LOCK = 0, UNLOCK = 1, WAIT = 2, WAKE = 3, MUTEX_TRYLOCK = 4, MUTEX_LOCK = 5, MUTEX_UNLOCK = 6, SET_CEILING = 7, CV_WAIT = 8, CV_SIGNAL = 9, CV_BROADCAST = 10, WAIT_UINT = 11, RW_RDLOCK = 12, RW_WRLOCK = 13, RW_UNLOCK = 14, WAIT_UINT_PRIVATE = 15, WAKE_PRIVATE = 16, MUTEX_WAIT = 17, MUTEX_WAKE = 18, // deprecated SEM_WAIT = 19, // deprecated SEM_WAKE = 20, // deprecated NWAKE_PRIVATE = 31, MUTEX_WAKE2 = 22, SEM2_WAIT = 23, SEM2_WAKE = 24, SHM = 25, ROBUST_LISTS = 26, }; pub const UMTX_ABSTIME = 0x01; pub const _umtx_time = extern struct { timeout: timespec, flags: u32, clockid: clockid_t, }; pub extern "c" fn _umtx_op(obj: usize, op: c_int, val: c_ulong, uaddr: usize, uaddr2: usize) c_int; pub const fflags_t = u32; pub const Stat = extern struct { /// The inode's device. dev: dev_t, /// The inode's number. ino: ino_t, /// Number of hard links. nlink: nlink_t, /// Inode protection mode. mode: mode_t, __pad0: i16, /// User ID of the file's owner. uid: uid_t, /// Group ID of the file's group. gid: gid_t, __pad1: i32, /// Device type. rdev: dev_t, /// Time of last access. atim: timespec, /// Time of last data modification. mtim: timespec, /// Time of last file status change. ctim: timespec, /// Time of file creation. birthtim: timespec, /// File size, in bytes. size: off_t, /// Blocks allocated for file. blocks: blkcnt_t, /// Optimal blocksize for I/O. blksize: blksize_t, /// User defined flags for file. flags: fflags_t, /// File generation number. gen: u64, __spare: [10]u64, 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.birthtim; } }; pub const fsblkcnt_t = u64; pub const fsfilcnt_t = u64; pub const CAP_RIGHTS_VERSION = 0; pub const cap_rights = extern struct { rights: [CAP_RIGHTS_VERSION + 2]u64, }; pub const kinfo_file = extern struct { /// Size of this record. /// A zero value is for the sentinel record at the end of an array. structsize: c_int, /// Descriptor type. type: c_int, /// Array index. fd: fd_t, /// Reference count. ref_count: c_int, /// Flags. flags: c_int, // 64bit padding. _pad0: c_int, /// Seek location. offset: i64, un: extern union { socket: extern struct { /// Sendq size. sendq: u32, /// Socket domain. domain: c_int, /// Socket type. type: c_int, /// Socket protocol. protocol: c_int, /// Socket address. address: sockaddr.storage, /// Peer address. peer: sockaddr.storage, /// Address of so_pcb. pcb: u64, /// Address of inp_ppcb. inpcb: u64, /// Address of unp_conn. unpconn: u64, /// Send buffer state. snd_sb_state: u16, /// Receive buffer state. rcv_sb_state: u16, /// Recvq size. recvq: u32, }, file: extern struct { /// Vnode type. type: i32, // Reserved for future use _spare1: [3]i32, _spare2: [30]u64, /// Vnode filesystem id. fsid: u64, /// File device. rdev: u64, /// Global file id. fileid: u64, /// File size. size: u64, /// fsid compat for FreeBSD 11. fsid_freebsd11: u32, /// rdev compat for FreeBSD 11. rdev_freebsd11: u32, /// File mode. mode: u16, // 64bit padding. _pad0: u16, _pad1: u32, }, sem: extern struct { _spare0: [4]u32, _spare1: [32]u64, /// Semaphore value. value: u32, /// Semaphore mode. mode: u16, }, pipe: extern struct { _spare1: [4]u32, _spare2: [32]u64, addr: u64, peer: u64, buffer_cnt: u32, // 64bit padding. kf_pipe_pad0: [3]u32, }, proc: extern struct { _spare1: [4]u32, _spare2: [32]u64, pid: pid_t, }, eventfd: extern struct { value: u64, flags: u32, }, }, /// Status flags. status: u16, // 32-bit alignment padding. _pad1: u16, // Reserved for future use. _spare: c_int, /// Capability rights. cap_rights: cap_rights, /// Reserved for future cap_rights _cap_spare: u64, /// Path to file, if any. path: [PATH_MAX - 1:0]u8, comptime { assert(@sizeOf(@This()) == KINFO_FILE_SIZE); assert(@alignOf(@This()) == @sizeOf(u64)); } }; pub const KINFO_FILE_SIZE = 1392; pub const MFD = struct { pub const CLOEXEC = 0x0001; pub const ALLOW_SEALING = 0x0002; }; pub const E = enum(u16) { /// No error occurred. SUCCESS = 0, PERM = 1, // Operation not permitted NOENT = 2, // No such file or directory SRCH = 3, // No such process INTR = 4, // Interrupted system call IO = 5, // Input/output error NXIO = 6, // Device not configured @"2BIG" = 7, // Argument list too long NOEXEC = 8, // Exec format error BADF = 9, // Bad file descriptor CHILD = 10, // No child processes DEADLK = 11, // Resource deadlock avoided // 11 was AGAIN NOMEM = 12, // Cannot allocate memory ACCES = 13, // Permission denied FAULT = 14, // Bad address NOTBLK = 15, // Block device required BUSY = 16, // Device busy EXIST = 17, // File exists XDEV = 18, // Cross-device link NODEV = 19, // Operation not supported by device NOTDIR = 20, // Not a directory ISDIR = 21, // Is a directory INVAL = 22, // Invalid argument NFILE = 23, // Too many open files in system MFILE = 24, // Too many open files NOTTY = 25, // Inappropriate ioctl for device TXTBSY = 26, // Text file busy FBIG = 27, // File too large NOSPC = 28, // No space left on device SPIPE = 29, // Illegal seek ROFS = 30, // Read-only filesystem MLINK = 31, // Too many links PIPE = 32, // Broken pipe // math software DOM = 33, // Numerical argument out of domain RANGE = 34, // Result too large // non-blocking and interrupt i/o /// Resource temporarily unavailable /// This code is also used for `WOULDBLOCK`: operation would block. AGAIN = 35, INPROGRESS = 36, // Operation now in progress ALREADY = 37, // Operation already in progress // ipc/network software -- argument errors NOTSOCK = 38, // Socket operation on non-socket DESTADDRREQ = 39, // Destination address required MSGSIZE = 40, // Message too long PROTOTYPE = 41, // Protocol wrong type for socket NOPROTOOPT = 42, // Protocol not available PROTONOSUPPORT = 43, // Protocol not supported SOCKTNOSUPPORT = 44, // Socket type not supported /// Operation not supported /// This code is also used for `NOTSUP`. OPNOTSUPP = 45, PFNOSUPPORT = 46, // Protocol family not supported AFNOSUPPORT = 47, // Address family not supported by protocol family ADDRINUSE = 48, // Address already in use ADDRNOTAVAIL = 49, // Can't assign requested address // ipc/network software -- operational errors NETDOWN = 50, // Network is down NETUNREACH = 51, // Network is unreachable NETRESET = 52, // Network dropped connection on reset CONNABORTED = 53, // Software caused connection abort CONNRESET = 54, // Connection reset by peer NOBUFS = 55, // No buffer space available ISCONN = 56, // Socket is already connected NOTCONN = 57, // Socket is not connected SHUTDOWN = 58, // Can't send after socket shutdown TOOMANYREFS = 59, // Too many references: can't splice TIMEDOUT = 60, // Operation timed out CONNREFUSED = 61, // Connection refused LOOP = 62, // Too many levels of symbolic links NAMETOOLONG = 63, // File name too long // should be rearranged HOSTDOWN = 64, // Host is down HOSTUNREACH = 65, // No route to host NOTEMPTY = 66, // Directory not empty // quotas & mush PROCLIM = 67, // Too many processes USERS = 68, // Too many users DQUOT = 69, // Disc quota exceeded // Network File System STALE = 70, // Stale NFS file handle REMOTE = 71, // Too many levels of remote in path BADRPC = 72, // RPC struct is bad RPCMISMATCH = 73, // RPC version wrong PROGUNAVAIL = 74, // RPC prog. not avail PROGMISMATCH = 75, // Program version wrong PROCUNAVAIL = 76, // Bad procedure for program NOLCK = 77, // No locks available NOSYS = 78, // Function not implemented FTYPE = 79, // Inappropriate file type or format AUTH = 80, // Authentication error NEEDAUTH = 81, // Need authenticator IDRM = 82, // Identifier removed NOMSG = 83, // No message of desired type OVERFLOW = 84, // Value too large to be stored in data type CANCELED = 85, // Operation canceled ILSEQ = 86, // Illegal byte sequence NOATTR = 87, // Attribute not found DOOFUS = 88, // Programming error BADMSG = 89, // Bad message MULTIHOP = 90, // Multihop attempted NOLINK = 91, // Link has been severed PROTO = 92, // Protocol error NOTCAPABLE = 93, // Capabilities insufficient CAPMODE = 94, // Not permitted in capability mode NOTRECOVERABLE = 95, // State not recoverable OWNERDEAD = 96, // Previous owner died INTEGRITY = 97, // Integrity check failed _, };