grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026-- tables of constants for NetBSD local require, error, assert, tonumber, tostring, setmetatable, pairs, ipairs, unpack, rawget, rawset, pcall, type, table, string, select = require, error, assert, tonumber, tostring, setmetatable, pairs, ipairs, unpack, rawget, rawset, pcall, type, table, string, select local abi = require "syscall.abi" local h = require "syscall.helpers" local bit = require "syscall.bit" local octal, multiflags, charflags, swapflags, strflag, atflag, modeflags = h.octal, h.multiflags, h.charflags, h.swapflags, h.strflag, h.atflag, h.modeflags local version = require "syscall.freebsd.version".version local ffi = require "ffi" local function charp(n) return ffi.cast("char *", n) end local c = {} c.errornames = require "syscall.freebsd.errors" c.STD = strflag { IN_FILENO = 0, OUT_FILENO = 1, ERR_FILENO = 2, IN = 0, OUT = 1, ERR = 2, } c.PATH_MAX = 1024 c.E = strflag { PERM = 1, NOENT = 2, SRCH = 3, INTR = 4, IO = 5, NXIO = 6, ["2BIG"] = 7, NOEXEC = 8, BADF = 9, CHILD = 10, DEADLK = 11, NOMEM = 12, ACCES = 13, FAULT = 14, NOTBLK = 15, BUSY = 16, EXIST = 17, XDEV = 18, NODEV = 19, NOTDIR = 20, ISDIR = 21, INVAL = 22, NFILE = 23, MFILE = 24, NOTTY = 25, TXTBSY = 26, FBIG = 27, NOSPC = 28, SPIPE = 29, ROFS = 30, MLINK = 31, PIPE = 32, DOM = 33, RANGE = 34, AGAIN = 35, INPROGRESS = 36, ALREADY = 37, NOTSOCK = 38, DESTADDRREQ = 39, MSGSIZE = 40, PROTOTYPE = 41, NOPROTOOPT = 42, PROTONOSUPPORT= 43, SOCKTNOSUPPORT= 44, OPNOTSUPP = 45, PFNOSUPPORT = 46, AFNOSUPPORT = 47, ADDRINUSE = 48, ADDRNOTAVAIL = 49, NETDOWN = 50, NETUNREACH = 51, NETRESET = 52, CONNABORTED = 53, CONNRESET = 54, NOBUFS = 55, ISCONN = 56, NOTCONN = 57, SHUTDOWN = 58, TOOMANYREFS = 59, TIMEDOUT = 60, CONNREFUSED = 61, LOOP = 62, NAMETOOLONG = 63, HOSTDOWN = 64, HOSTUNREACH = 65, NOTEMPTY = 66, PROCLIM = 67, USERS = 68, DQUOT = 69, STALE = 70, REMOTE = 71, BADRPC = 72, BADRPC = 72, RPCMISMATCH = 73, PROGUNAVAIL = 74, PROGMISMATCH = 75, PROCUNAVAIL = 76, NOLCK = 77, NOSYS = 78, FTYPE = 79, AUTH = 80, NEEDAUTH = 81, IDRM = 82, NOMSG = 83, OVERFLOW = 84, CANCELED = 85, ILSEQ = 86, NOATTR = 87, DOOFUS = 88, BADMSG = 89, MULTIHOP = 90, NOLINK = 91, PROTO = 92, NOTCAPABLE = 93, CAPMODE = 94, } if version >= 10 then c.E.NOTRECOVERABLE= 95 c.E.OWNERDEAD = 96 end -- alternate names c.EALIAS = { WOULDBLOCK = c.E.AGAIN, } c.AF = strflag { UNSPEC = 0, LOCAL = 1, INET = 2, IMPLINK = 3, PUP = 4, CHAOS = 5, NETBIOS = 6, ISO = 7, ECMA = 8, DATAKIT = 9, CCITT = 10, SNA = 11, DECNET = 12, DLI = 13, LAT = 14, HYLINK = 15, APPLETALK = 16, ROUTE = 17, LINK = 18, -- #define pseudo_AF_XTP 19 COIP = 20, CNT = 21, -- #define pseudo_AF_RTIP 22 IPX = 23, SIP = 24, -- pseudo_AF_PIP 25 ISDN = 26, -- pseudo_AF_KEY 27 INET6 = 28, NATM = 29, ATM = 30, -- pseudo_AF_HDRCMPLT 31 NETGRAPH = 32, SLOW = 33, SCLUSTER = 34, ARP = 35, BLUETOOTH = 36, IEEE80211 = 37, } c.AF.UNIX = c.AF.LOCAL c.AF.OSI = c.AF.ISO c.AF.E164 = c.AF.ISDN if version >= 10 then c.AF.INET_SDP = 40 c.AF.INET6_SDP = 42 end c.O = multiflags { RDONLY = 0x0000, WRONLY = 0x0001, RDWR = 0x0002, ACCMODE = 0x0003, NONBLOCK = 0x0004, APPEND = 0x0008, SHLOCK = 0x0010, EXLOCK = 0x0020, ASYNC = 0x0040, FSYNC = 0x0080, SYNC = 0x0080, NOFOLLOW = 0x0100, CREAT = 0x0200, TRUNC = 0x0400, EXCL = 0x0800, NOCTTY = 0x8000, DIRECT = 0x00010000, DIRECTORY = 0x00020000, EXEC = 0x00040000, TTY_INIT = 0x00080000, CLOEXEC = 0x00100000, } -- for pipe2, selected flags from c.O c.OPIPE = multiflags { NONBLOCK = 0x0004, CLOEXEC = 0x00100000, } -- sigaction, note renamed SIGACT from SIG_ c.SIGACT = strflag { ERR = -1, DFL = 0, IGN = 1, HOLD = 3, } c.SIGEV = strflag { NONE = 0, SIGNAL = 1, THREAD = 2, KEVENT = 3, THREAD_ID = 4, } c.SIG = strflag { HUP = 1, INT = 2, QUIT = 3, ILL = 4, TRAP = 5, ABRT = 6, EMT = 7, FPE = 8, KILL = 9, BUS = 10, SEGV = 11, SYS = 12, PIPE = 13, ALRM = 14, TERM = 15, URG = 16, STOP = 17, TSTP = 18, CONT = 19, CHLD = 20, TTIN = 21, TTOU = 22, IO = 23, XCPU = 24, XFSZ = 25, VTALRM = 26, PROF = 27, WINCH = 28, INFO = 29, USR1 = 30, USR2 = 31, THR = 32, } if version >=10 then c.SIG.LIBRT = 33 end c.SIG.LWP = c.SIG.THR c.EXIT = strflag { SUCCESS = 0, FAILURE = 1, } c.OK = charflags { F = 0, X = 0x01, W = 0x02, R = 0x04, } c.MODE = modeflags { SUID = octal('04000'), SGID = octal('02000'), STXT = octal('01000'), RWXU = octal('00700'), RUSR = octal('00400'), WUSR = octal('00200'), XUSR = octal('00100'), RWXG = octal('00070'), RGRP = octal('00040'), WGRP = octal('00020'), XGRP = octal('00010'), RWXO = octal('00007'), ROTH = octal('00004'), WOTH = octal('00002'), XOTH = octal('00001'), } c.SEEK = strflag { SET = 0, CUR = 1, END = 2, DATA = 3, HOLE = 4, } c.SOCK = multiflags { STREAM = 1, DGRAM = 2, RAW = 3, RDM = 4, SEQPACKET = 5, } if version >= 10 then c.SOCK.CLOEXEC = 0x10000000 c.SOCK.NONBLOCK = 0x20000000 end c.SOL = strflag { SOCKET = 0xffff, } c.POLL = multiflags { IN = 0x0001, PRI = 0x0002, OUT = 0x0004, RDNORM = 0x0040, RDBAND = 0x0080, WRBAND = 0x0100, INIGNEOF = 0x2000, ERR = 0x0008, HUP = 0x0010, NVAL = 0x0020, } c.POLL.WRNORM = c.POLL.OUT c.POLL.STANDARD = c.POLL["IN,PRI,OUT,RDNORM,RDBAND,WRBAND,ERR,HUP,NVAL"] c.AT_FDCWD = atflag { FDCWD = -100, } c.AT = multiflags { EACCESS = 0x100, SYMLINK_NOFOLLOW = 0x200, SYMLINK_FOLLOW = 0x400, REMOVEDIR = 0x800, } c.S_I = modeflags { FMT = octal('0170000'), FWHT = octal('0160000'), FSOCK = octal('0140000'), FLNK = octal('0120000'), FREG = octal('0100000'), FBLK = octal('0060000'), FDIR = octal('0040000'), FCHR = octal('0020000'), FIFO = octal('0010000'), SUID = octal('0004000'), SGID = octal('0002000'), SVTX = octal('0001000'), STXT = octal('0001000'), RWXU = octal('00700'), RUSR = octal('00400'), WUSR = octal('00200'), XUSR = octal('00100'), RWXG = octal('00070'), RGRP = octal('00040'), WGRP = octal('00020'), XGRP = octal('00010'), RWXO = octal('00007'), ROTH = octal('00004'), WOTH = octal('00002'), XOTH = octal('00001'), } c.S_I.READ = c.S_I.RUSR c.S_I.WRITE = c.S_I.WUSR c.S_I.EXEC = c.S_I.XUSR c.PROT = multiflags { NONE = 0x0, READ = 0x1, WRITE = 0x2, EXEC = 0x4, } c.MAP = multiflags { SHARED = 0x0001, PRIVATE = 0x0002, FILE = 0x0000, FIXED = 0x0010, RENAME = 0x0020, NORESERVE = 0x0040, RESERVED0080 = 0x0080, RESERVED0100 = 0x0100, HASSEMAPHORE = 0x0200, STACK = 0x0400, NOSYNC = 0x0800, ANON = 0x1000, NOCORE = 0x00020000, -- TODO add aligned maps in } if abi.abi64 and version >= 10 then c.MAP["32BIT"] = 0x00080000 end c.MCL = strflag { CURRENT = 0x01, FUTURE = 0x02, } -- flags to `msync'. - note was MS_ renamed to MSYNC_ c.MSYNC = multiflags { SYNC = 0x0000, ASYNC = 0x0001, INVALIDATE = 0x0002, } c.MADV = strflag { NORMAL = 0, RANDOM = 1, SEQUENTIAL = 2, WILLNEED = 3, DONTNEED = 4, FREE = 5, NOSYNC = 6, AUTOSYNC = 7, NOCORE = 8, CORE = 9, PROTECT = 10, } c.IPPROTO = strflag { IP = 0, HOPOPTS = 0, ICMP = 1, IGMP = 2, GGP = 3, IPV4 = 4, IPIP = 4, TCP = 6, ST = 7, EGP = 8, PIGP = 9, RCCMON = 10, NVPII = 11, PUP = 12, ARGUS = 13, EMCON = 14, XNET = 15, CHAOS = 16, UDP = 17, MUX = 18, MEAS = 19, HMP = 20, PRM = 21, IDP = 22, TRUNK1 = 23, TRUNK2 = 24, LEAF1 = 25, LEAF2 = 26, RDP = 27, IRTP = 28, TP = 29, BLT = 30, NSP = 31, INP = 32, SEP = 33, ["3PC"] = 34, IDPR = 35, XTP = 36, DDP = 37, CMTP = 38, TPXX = 39, IL = 40, IPV6 = 41, SDRP = 42, ROUTING = 43, FRAGMENT = 44, IDRP = 45, RSVP = 46, GRE = 47, MHRP = 48, BHA = 49, ESP = 50, AH = 51, INLSP = 52, SWIPE = 53, NHRP = 54, MOBILE = 55, TLSP = 56, SKIP = 57, ICMPV6 = 58, NONE = 59, DSTOPTS = 60, AHIP = 61, CFTP = 62, HELLO = 63, SATEXPAK = 64, KRYPTOLAN = 65, RVD = 66, IPPC = 67, ADFS = 68, SATMON = 69, VISA = 70, IPCV = 71, CPNX = 72, CPHB = 73, WSN = 74, PVP = 75, BRSATMON = 76, ND = 77, WBMON = 78, WBEXPAK = 79, EON = 80, VMTP = 81, SVMTP = 82, VINES = 83, TTP = 84, IGP = 85, DGP = 86, TCF = 87, IGRP = 88, OSPFIGP = 89, SRPC = 90, LARP = 91, MTP = 92, AX25 = 93, IPEIP = 94, MICP = 95, SCCSP = 96, ETHERIP = 97, ENCAP = 98, APES = 99, GMTP = 100, IPCOMP = 108, SCTP = 132, MH = 135, PIM = 103, CARP = 112, PGM = 113, MPLS = 137, PFSYNC = 240, RAW = 255, } c.SCM = multiflags { RIGHTS = 0x01, TIMESTAMP = 0x02, CREDS = 0x03, BINTIME = 0x04, } c.F = strflag { DUPFD = 0, GETFD = 1, SETFD = 2, GETFL = 3, SETFL = 4, GETOWN = 5, SETOWN = 6, OGETLK = 7, OSETLK = 8, OSETLKW = 9, DUP2FD = 10, GETLK = 11, SETLK = 12, SETLKW = 13, SETLK_REMOTE= 14, READAHEAD = 15, RDAHEAD = 16, DUPFD_CLOEXEC= 17, DUP2FD_CLOEXEC= 18, } c.FD = multiflags { CLOEXEC = 1, } -- note changed from F_ to FCNTL_LOCK c.FCNTL_LOCK = strflag { RDLCK = 1, UNLCK = 2, WRLCK = 3, UNLCKSYS = 4, CANCEL = 5, } -- lockf, changed from F_ to LOCKF_ c.LOCKF = strflag { ULOCK = 0, LOCK = 1, TLOCK = 2, TEST = 3, } -- for flock (2) c.LOCK = multiflags { SH = 0x01, EX = 0x02, NB = 0x04, UN = 0x08, } c.W = multiflags { NOHANG = 1, UNTRACED = 2, CONTINUED = 4, NOWAIT = 8, EXITED = 16, TRAPPED = 32, LINUXCLONE = 0x80000000, } c.W.STOPPED = c.W.UNTRACED -- waitpid and wait4 pid c.WAIT = strflag { ANY = -1, MYPGRP = 0, } c.MSG = multiflags { OOB = 0x1, PEEK = 0x2, DONTROUTE = 0x4, EOR = 0x8, TRUNC = 0x10, CTRUNC = 0x20, WAITALL = 0x40, DONTWAIT = 0x80, EOF = 0x100, NOTIFICATION = 0x2000, NBIO = 0x4000, COMPAT = 0x8000, NOSIGNAL = 0x20000, } if version >= 10 then c.MSG.CMSG_CLOEXEC = 0x40000 end c.PC = strflag { LINK_MAX = 1, MAX_CANON = 2, MAX_INPUT = 3, NAME_MAX = 4, PATH_MAX = 5, PIPE_BUF = 6, CHOWN_RESTRICTED = 7, NO_TRUNC = 8, VDISABLE = 9, ALLOC_SIZE_MIN = 10, FILESIZEBITS = 12, REC_INCR_XFER_SIZE= 14, REC_MAX_XFER_SIZE = 15, REC_MIN_XFER_SIZE = 16, REC_XFER_ALIGN = 17, SYMLINK_MAX = 18, MIN_HOLE_SIZE = 21, ASYNC_IO = 53, PRIO_IO = 54, SYNC_IO = 55, ACL_EXTENDED = 59, ACL_PATH_MAX = 60, CAP_PRESENT = 61, INF_PRESENT = 62, MAC_PRESENT = 63, ACL_NFS4 = 64, } -- getpriority, setpriority flags c.PRIO = strflag { PROCESS = 0, PGRP = 1, USER = 2, MIN = -20, -- TODO useful to have for other OSs MAX = 20, } c.RUSAGE = strflag { SELF = 0, CHILDREN = -1, THREAD = 1, } c.SOMAXCONN = 128 c.SO = strflag { DEBUG = 0x0001, ACCEPTCONN = 0x0002, REUSEADDR = 0x0004, KEEPALIVE = 0x0008, DONTROUTE = 0x0010, BROADCAST = 0x0020, USELOOPBACK = 0x0040, LINGER = 0x0080, OOBINLINE = 0x0100, REUSEPORT = 0x0200, TIMESTAMP = 0x0400, NOSIGPIPE = 0x0800, ACCEPTFILTER = 0x1000, BINTIME = 0x2000, NO_OFFLOAD = 0x4000, NO_DDP = 0x8000, SNDBUF = 0x1001, RCVBUF = 0x1002, SNDLOWAT = 0x1003, RCVLOWAT = 0x1004, SNDTIMEO = 0x1005, RCVTIMEO = 0x1006, ERROR = 0x1007, TYPE = 0x1008, LABEL = 0x1009, PEERLABEL = 0x1010, LISTENQLIMIT = 0x1011, LISTENQLEN = 0x1012, LISTENINCQLEN= 0x1013, SETFIB = 0x1014, USER_COOKIE = 0x1015, PROTOCOL = 0x1016, } c.SO.PROTOTYPE = c.SO.PROTOCOL c.DT = strflag { UNKNOWN = 0, FIFO = 1, CHR = 2, DIR = 4, BLK = 6, REG = 8, LNK = 10, SOCK = 12, WHT = 14, } c.IP = strflag { OPTIONS = 1, HDRINCL = 2, TOS = 3, TTL = 4, RECVOPTS = 5, RECVRETOPTS = 6, RECVDSTADDR = 7, RETOPTS = 8, MULTICAST_IF = 9, MULTICAST_TTL = 10, MULTICAST_LOOP = 11, ADD_MEMBERSHIP = 12, DROP_MEMBERSHIP = 13, MULTICAST_VIF = 14, RSVP_ON = 15, RSVP_OFF = 16, RSVP_VIF_ON = 17, RSVP_VIF_OFF = 18, PORTRANGE = 19, RECVIF = 20, IPSEC_POLICY = 21, FAITH = 22, ONESBCAST = 23, BINDANY = 24, FW_TABLE_ADD = 40, FW_TABLE_DEL = 41, FW_TABLE_FLUSH = 42, FW_TABLE_GETSIZE = 43, FW_TABLE_LIST = 44, FW3 = 48, DUMMYNET3 = 49, FW_ADD = 50, FW_DEL = 51, FW_FLUSH = 52, FW_ZERO = 53, FW_GET = 54, FW_RESETLOG = 55, FW_NAT_CFG = 56, FW_NAT_DEL = 57, FW_NAT_GET_CONFIG = 58, FW_NAT_GET_LOG = 59, DUMMYNET_CONFIGURE = 60, DUMMYNET_DEL = 61, DUMMYNET_FLUSH = 62, DUMMYNET_GET = 64, RECVTTL = 65, MINTTL = 66, DONTFRAG = 67, RECVTOS = 68, ADD_SOURCE_MEMBERSHIP = 70, DROP_SOURCE_MEMBERSHIP = 71, BLOCK_SOURCE = 72, UNBLOCK_SOURCE = 73, } c.IP.SENDSRCADDR = c.IP.RECVDSTADDR -- Baud rates just the identity function other than EXTA, EXTB c.B = strflag { EXTA = 19200, EXTB = 38400, } c.CC = strflag { VEOF = 0, VEOL = 1, VEOL2 = 2, VERASE = 3, VWERASE = 4, VKILL = 5, VREPRINT = 6, VINTR = 8, VQUIT = 9, VSUSP = 10, VDSUSP = 11, VSTART = 12, VSTOP = 13, VLNEXT = 14, VDISCARD = 15, VMIN = 16, VTIME = 17, VSTATUS = 18, } c.IFLAG = multiflags { IGNBRK = 0x00000001, BRKINT = 0x00000002, IGNPAR = 0x00000004, PARMRK = 0x00000008, INPCK = 0x00000010, ISTRIP = 0x00000020, INLCR = 0x00000040, IGNCR = 0x00000080, ICRNL = 0x00000100, IXON = 0x00000200, IXOFF = 0x00000400, IXANY = 0x00000800, IMAXBEL = 0x00002000, } c.OFLAG = multiflags { OPOST = 0x00000001, ONLCR = 0x00000002, OXTABS = 0x00000004, ONOEOT = 0x00000008, OCRNL = 0x00000010, ONOCR = 0x00000020, ONLRET = 0x00000040, } c.CFLAG = multiflags { CIGNORE = 0x00000001, CSIZE = 0x00000300, CS5 = 0x00000000, CS6 = 0x00000100, CS7 = 0x00000200, CS8 = 0x00000300, CSTOPB = 0x00000400, CREAD = 0x00000800, PARENB = 0x00001000, PARODD = 0x00002000, HUPCL = 0x00004000, CLOCAL = 0x00008000, CCTS_OFLOW = 0x00010000, CRTS_IFLOW = 0x00020000, CDTR_IFLOW = 0x00040000, CDSR_OFLOW = 0x00080000, CCAR_OFLOW = 0x00100000, } c.CFLAG.CRTSCTS = c.CFLAG.CCTS_OFLOW + c.CFLAG.CRTS_IFLOW c.LFLAG = multiflags { ECHOKE = 0x00000001, ECHOE = 0x00000002, ECHOK = 0x00000004, ECHO = 0x00000008, ECHONL = 0x00000010, ECHOPRT = 0x00000020, ECHOCTL = 0x00000040, ISIG = 0x00000080, ICANON = 0x00000100, ALTWERASE = 0x00000200, IEXTEN = 0x00000400, EXTPROC = 0x00000800, TOSTOP = 0x00400000, FLUSHO = 0x00800000, NOKERNINFO = 0x02000000, PENDIN = 0x20000000, NOFLSH = 0x80000000, } c.TCSA = multiflags { -- this is another odd one, where you can have one flag plus SOFT NOW = 0, DRAIN = 1, FLUSH = 2, SOFT = 0x10, } -- tcflush(), renamed from TC to TCFLUSH c.TCFLUSH = strflag { IFLUSH = 1, OFLUSH = 2, IOFLUSH = 3, } -- termios - tcflow() and TCXONC use these. renamed from TC to TCFLOW c.TCFLOW = strflag { OOFF = 1, OON = 2, IOFF = 3, ION = 4, } -- for chflags and stat. note these have no prefix c.CHFLAGS = multiflags { UF_NODUMP = 0x00000001, UF_IMMUTABLE = 0x00000002, UF_APPEND = 0x00000004, UF_OPAQUE = 0x00000008, UF_NOUNLINK = 0x00000010, SF_ARCHIVED = 0x00010000, SF_IMMUTABLE = 0x00020000, SF_APPEND = 0x00040000, SF_NOUNLINK = 0x00100000, SF_SNAPSHOT = 0x00200000, } c.CHFLAGS.IMMUTABLE = c.CHFLAGS.UF_IMMUTABLE + c.CHFLAGS.SF_IMMUTABLE c.CHFLAGS.APPEND = c.CHFLAGS.UF_APPEND + c.CHFLAGS.SF_APPEND c.CHFLAGS.OPAQUE = c.CHFLAGS.UF_OPAQUE c.CHFLAGS.NOUNLINK = c.CHFLAGS.UF_NOUNLINK + c.CHFLAGS.SF_NOUNLINK if version >=10 then c.CHFLAGS.UF_SYSTEM = 0x00000080 c.CHFLAGS.UF_SPARSE = 0x00000100 c.CHFLAGS.UF_OFFLINE = 0x00000200 c.CHFLAGS.UF_REPARSE = 0x00000400 c.CHFLAGS.UF_ARCHIVE = 0x00000800 c.CHFLAGS.UF_READONLY = 0x00001000 c.CHFLAGS.UF_HIDDEN = 0x00008000 end c.TCP = strflag { NODELAY = 1, MAXSEG = 2, NOPUSH = 4, NOOPT = 8, MD5SIG = 16, INFO = 32, CONGESTION = 64, KEEPINIT = 128, KEEPIDLE = 256, KEEPINTVL = 512, KEEPCNT = 1024, } c.RB = multiflags { AUTOBOOT = 0, ASKNAME = 0x001, SINGLE = 0x002, NOSYNC = 0x004, HALT = 0x008, INITNAME = 0x010, DFLTROOT = 0x020, KDB = 0x040, RDONLY = 0x080, DUMP = 0x100, MINIROOT = 0x200, VERBOSE = 0x800, SERIAL = 0x1000, CDROM = 0x2000, POWEROFF = 0x4000, GDB = 0x8000, MUTE = 0x10000, SELFTEST = 0x20000, RESERVED1 = 0x40000, RESERVED2 = 0x80000, PAUSE = 0x100000, MULTIPLE = 0x20000000, BOOTINFO = 0x80000000, } -- kqueue c.EV = multiflags { ADD = 0x0001, DELETE = 0x0002, ENABLE = 0x0004, DISABLE = 0x0008, ONESHOT = 0x0010, CLEAR = 0x0020, RECEIPT = 0x0040, DISPATCH = 0x0080, SYSFLAGS = 0xF000, FLAG1 = 0x2000, EOF = 0x8000, ERROR = 0x4000, } if version >= 10 then c.EV.DROP = 0x1000 end c.EVFILT = strflag { READ = -1, WRITE = -2, AIO = -3, VNODE = -4, PROC = -5, SIGNAL = -6, TIMER = -7, FS = -9, LIO = -10, USER = -11, SYSCOUNT = 11, } c.NOTE = multiflags { -- user FFNOP = 0x00000000, FFAND = 0x40000000, FFOR = 0x80000000, FFCOPY = 0xc0000000, FFCTRLMASK = 0xc0000000, FFLAGSMASK = 0x00ffffff, TRIGGER = 0x01000000, -- read and write LOWAT = 0x0001, -- vnode DELETE = 0x0001, WRITE = 0x0002, EXTEND = 0x0004, ATTRIB = 0x0008, LINK = 0x0010, RENAME = 0x0020, REVOKE = 0x0040, -- proc EXIT = 0x80000000, FORK = 0x40000000, EXEC = 0x20000000, PCTRLMASK = 0xf0000000, PDATAMASK = 0x000fffff, TRACK = 0x00000001, TRACKERR = 0x00000002, CHILD = 0x00000004, } c.SHM = strflag { ANON = charp(1), } c.PD = multiflags { DAEMON = 0x00000001, } c.ITIMER = strflag { REAL = 0, VIRTUAL = 1, PROF = 2, } c.SA = multiflags { ONSTACK = 0x0001, RESTART = 0x0002, RESETHAND = 0x0004, NOCLDSTOP = 0x0008, NODEFER = 0x0010, NOCLDWAIT = 0x0020, SIGINFO = 0x0040, } -- ipv6 sockopts c.IPV6 = strflag { SOCKOPT_RESERVED1 = 3, UNICAST_HOPS = 4, MULTICAST_IF = 9, MULTICAST_HOPS = 10, MULTICAST_LOOP = 11, JOIN_GROUP = 12, LEAVE_GROUP = 13, PORTRANGE = 14, --ICMP6_FILTER = 18, -- not namespaced as IPV6 CHECKSUM = 26, V6ONLY = 27, IPSEC_POLICY = 28, FAITH = 29, RTHDRDSTOPTS = 35, RECVPKTINFO = 36, RECVHOPLIMIT = 37, RECVRTHDR = 38, RECVHOPOPTS = 39, RECVDSTOPTS = 40, USE_MIN_MTU = 42, RECVPATHMTU = 43, PATHMTU = 44, PKTINFO = 46, HOPLIMIT = 47, NEXTHOP = 48, HOPOPTS = 49, DSTOPTS = 50, RTHDR = 51, RECVTCLASS = 57, TCLASS = 61, DONTFRAG = 62, } c.CLOCK = strflag { REALTIME = 0, VIRTUAL = 1, PROF = 2, MONOTONIC = 4, UPTIME = 5, UPTIME_PRECISE = 7, UPTIME_FAST = 8, REALTIME_PRECISE = 9, REALTIME_FAST = 10, MONOTONIC_PRECISE = 11, MONOTONIC_FAST = 12, SECOND = 13, THREAD_CPUTIME_ID = 14, PROCESS_CPUTIME_ID = 15, } c.EXTATTR_NAMESPACE = strflag { EMPTY = 0x00000000, USER = 0x00000001, SYSTEM = 0x00000002, } -- TODO mount flag is an int, so ULL is odd, but these are flags too... -- TODO many flags missing, plus FreeBSD has a lot more mount complexities c.MNT = strflag { RDONLY = 0x0000000000000001ULL, SYNCHRONOUS = 0x0000000000000002ULL, NOEXEC = 0x0000000000000004ULL, NOSUID = 0x0000000000000008ULL, NFS4ACLS = 0x0000000000000010ULL, UNION = 0x0000000000000020ULL, ASYNC = 0x0000000000000040ULL, SUIDDIR = 0x0000000000100000ULL, SOFTDEP = 0x0000000000200000ULL, NOSYMFOLLOW = 0x0000000000400000ULL, GJOURNAL = 0x0000000002000000ULL, MULTILABEL = 0x0000000004000000ULL, ACLS = 0x0000000008000000ULL, NOATIME = 0x0000000010000000ULL, NOCLUSTERR = 0x0000000040000000ULL, NOCLUSTERW = 0x0000000080000000ULL, SUJ = 0x0000000100000000ULL, FORCE = 0x0000000000080000ULL, } c.CTL = strflag { UNSPEC = 0, KERN = 1, VM = 2, VFS = 3, NET = 4, DEBUG = 5, HW = 6, MACHDEP = 7, USER = 8, P1003_1B = 9, MAXID = 10, } c.KERN = strflag { OSTYPE = 1, OSRELEASE = 2, OSREV = 3, VERSION = 4, MAXVNODES = 5, MAXPROC = 6, MAXFILES = 7, ARGMAX = 8, SECURELVL = 9, HOSTNAME = 10, HOSTID = 11, CLOCKRATE = 12, VNODE = 13, PROC = 14, FILE = 15, PROF = 16, POSIX1 = 17, NGROUPS = 18, JOB_CONTROL = 19, SAVED_IDS = 20, BOOTTIME = 21, NISDOMAINNAME = 22, UPDATEINTERVAL = 23, OSRELDATE = 24, NTP_PLL = 25, BOOTFILE = 26, MAXFILESPERPROC = 27, MAXPROCPERUID = 28, DUMPDEV = 29, IPC = 30, DUMMY = 31, PS_STRINGS = 32, USRSTACK = 33, LOGSIGEXIT = 34, IOV_MAX = 35, HOSTUUID = 36, ARND = 37, MAXID = 38, } if version >= 10 then -- not supporting on freebsd 9 as different ABI, recommend upgrade to use local function CAPRIGHT(idx, b) return bit.bor64(bit.lshift64(1, 57 + idx), b) end c.CAP = multiflags {} -- index 0 c.CAP.READ = CAPRIGHT(0, 0x0000000000000001ULL) c.CAP.WRITE = CAPRIGHT(0, 0x0000000000000002ULL) c.CAP.SEEK_TELL = CAPRIGHT(0, 0x0000000000000004ULL) c.CAP.SEEK = bit.bor64(c.CAP.SEEK_TELL, 0x0000000000000008ULL) c.CAP.PREAD = bit.bor64(c.CAP.SEEK, c.CAP.READ) c.CAP.PWRITE = bit.bor64(c.CAP.SEEK, c.CAP.WRITE) c.CAP.MMAP = CAPRIGHT(0, 0x0000000000000010ULL) c.CAP.MMAP_R = bit.bor64(c.CAP.MMAP, c.CAP.SEEK, c.CAP.READ) c.CAP.MMAP_W = bit.bor64(c.CAP.MMAP, c.CAP.SEEK, c.CAP.WRITE) c.CAP.MMAP_X = bit.bor64(c.CAP.MMAP, c.CAP.SEEK, 0x0000000000000020ULL) c.CAP.MMAP_RW = bit.bor64(c.CAP.MMAP_R, c.CAP.MMAP_W) c.CAP.MMAP_RX = bit.bor64(c.CAP.MMAP_R, c.CAP.MMAP_X) c.CAP.MMAP_WX = bit.bor64(c.CAP.MMAP_W, c.CAP.MMAP_X) c.CAP.MMAP_RWX = bit.bor64(c.CAP.MMAP_R, c.CAP.MMAP_W, c.CAP.MMAP_X) c.CAP.CREATE = CAPRIGHT(0, 0x0000000000000040ULL) c.CAP.FEXECVE = CAPRIGHT(0, 0x0000000000000080ULL) c.CAP.FSYNC = CAPRIGHT(0, 0x0000000000000100ULL) c.CAP.FTRUNCATE = CAPRIGHT(0, 0x0000000000000200ULL) c.CAP.LOOKUP = CAPRIGHT(0, 0x0000000000000400ULL) c.CAP.FCHDIR = CAPRIGHT(0, 0x0000000000000800ULL) c.CAP.FCHFLAGS = CAPRIGHT(0, 0x0000000000001000ULL) c.CAP.CHFLAGSAT = bit.bor64(c.CAP.FCHFLAGS, c.CAP.LOOKUP) c.CAP.FCHMOD = CAPRIGHT(0, 0x0000000000002000ULL) c.CAP.FCHMODAT = bit.bor64(c.CAP.FCHMOD, c.CAP.LOOKUP) c.CAP.FCHOWN = CAPRIGHT(0, 0x0000000000004000ULL) c.CAP.FCHOWNAT = bit.bor64(c.CAP.FCHOWN, c.CAP.LOOKUP) c.CAP.FCNTL = CAPRIGHT(0, 0x0000000000008000ULL) c.CAP.FLOCK = CAPRIGHT(0, 0x0000000000010000ULL) c.CAP.FPATHCONF = CAPRIGHT(0, 0x0000000000020000ULL) c.CAP.FSCK = CAPRIGHT(0, 0x0000000000040000ULL) c.CAP.FSTAT = CAPRIGHT(0, 0x0000000000080000ULL) c.CAP.FSTATAT = bit.bor64(c.CAP.FSTAT, c.CAP.LOOKUP) c.CAP.FSTATFS = CAPRIGHT(0, 0x0000000000100000ULL) c.CAP.FUTIMES = CAPRIGHT(0, 0x0000000000200000ULL) c.CAP.FUTIMESAT = bit.bor64(c.CAP.FUTIMES, c.CAP.LOOKUP) c.CAP.LINKAT = bit.bor64(c.CAP.LOOKUP, 0x0000000000400000ULL) c.CAP.MKDIRAT = bit.bor64(c.CAP.LOOKUP, 0x0000000000800000ULL) c.CAP.MKFIFOAT = bit.bor64(c.CAP.LOOKUP, 0x0000000001000000ULL) c.CAP.MKNODAT = bit.bor64(c.CAP.LOOKUP, 0x0000000002000000ULL) c.CAP.RENAMEAT = bit.bor64(c.CAP.LOOKUP, 0x0000000004000000ULL) c.CAP.SYMLINKAT = bit.bor64(c.CAP.LOOKUP, 0x0000000008000000ULL) c.CAP.UNLINKAT = bit.bor64(c.CAP.LOOKUP, 0x0000000010000000ULL) c.CAP.ACCEPT = CAPRIGHT(0, 0x0000000020000000ULL) c.CAP.BIND = CAPRIGHT(0, 0x0000000040000000ULL) c.CAP.CONNECT = CAPRIGHT(0, 0x0000000080000000ULL) c.CAP.GETPEERNAME = CAPRIGHT(0, 0x0000000100000000ULL) c.CAP.GETSOCKNAME = CAPRIGHT(0, 0x0000000200000000ULL) c.CAP.GETSOCKOPT = CAPRIGHT(0, 0x0000000400000000ULL) c.CAP.LISTEN = CAPRIGHT(0, 0x0000000800000000ULL) c.CAP.PEELOFF = CAPRIGHT(0, 0x0000001000000000ULL) c.CAP.RECV = c.CAP.READ c.CAP.SEND = c.CAP.WRITE c.CAP.SETSOCKOPT = CAPRIGHT(0, 0x0000002000000000ULL) c.CAP.SHUTDOWN = CAPRIGHT(0, 0x0000004000000000ULL) c.CAP.BINDAT = bit.bor64(c.CAP.LOOKUP, 0x0000008000000000ULL) c.CAP.CONNECTAT = bit.bor64(c.CAP.LOOKUP, 0x0000010000000000ULL) c.CAP.SOCK_CLIENT = bit.bor64(c.CAP.CONNECT, c.CAP.GETPEERNAME, c.CAP.GETSOCKNAME, c.CAP.GETSOCKOPT, c.CAP.PEELOFF, c.CAP.RECV, c.CAP.SEND, c.CAP.SETSOCKOPT, c.CAP.SHUTDOWN) c.CAP.SOCK_SERVER = bit.bor64(c.CAP.ACCEPT, c.CAP.BIND, c.CAP.GETPEERNAME, c.CAP.GETSOCKNAME, c.CAP.GETSOCKOPT, c.CAP.LISTEN, c.CAP.PEELOFF, c.CAP.RECV, c.CAP.SEND, c.CAP.SETSOCKOPT, c.CAP.SHUTDOWN) c.CAP.ALL0 = CAPRIGHT(0, 0x0000007FFFFFFFFFULL) c.CAP.UNUSED0_40 = CAPRIGHT(0, 0x0000008000000000ULL) c.CAP_UNUSED0_57 = CAPRIGHT(0, 0x0100000000000000ULL) -- index 1 c.CAP.MAC_GET = CAPRIGHT(1, 0x0000000000000001ULL) c.CAP.MAC_SET = CAPRIGHT(1, 0x0000000000000002ULL) c.CAP.SEM_GETVALUE = CAPRIGHT(1, 0x0000000000000004ULL) c.CAP.SEM_POST = CAPRIGHT(1, 0x0000000000000008ULL) c.CAP.SEM_WAIT = CAPRIGHT(1, 0x0000000000000010ULL) c.CAP.EVENT = CAPRIGHT(1, 0x0000000000000020ULL) c.CAP.KQUEUE_EVENT = CAPRIGHT(1, 0x0000000000000040ULL) c.CAP.IOCTL = CAPRIGHT(1, 0x0000000000000080ULL) c.CAP.TTYHOOK = CAPRIGHT(1, 0x0000000000000100ULL) c.CAP.PDGETPID = CAPRIGHT(1, 0x0000000000000200ULL) c.CAP.PDWAIT = CAPRIGHT(1, 0x0000000000000400ULL) c.CAP.PDKILL = CAPRIGHT(1, 0x0000000000000800ULL) c.CAP.EXTATTR_DELETE = CAPRIGHT(1, 0x0000000000001000ULL) c.CAP.EXTATTR_GET = CAPRIGHT(1, 0x0000000000002000ULL) c.CAP.EXTATTR_LIST = CAPRIGHT(1, 0x0000000000004000ULL) c.CAP.EXTATTR_SET = CAPRIGHT(1, 0x0000000000008000ULL) c.CAP_ACL_CHECK = CAPRIGHT(1, 0x0000000000010000ULL) c.CAP_ACL_DELETE = CAPRIGHT(1, 0x0000000000020000ULL) c.CAP_ACL_GET = CAPRIGHT(1, 0x0000000000040000ULL) c.CAP_ACL_SET = CAPRIGHT(1, 0x0000000000080000ULL) c.CAP_KQUEUE_CHANGE = CAPRIGHT(1, 0x0000000000100000ULL) c.CAP_KQUEUE = bit.bor64(c.CAP.KQUEUE_EVENT, c.CAP.KQUEUE_CHANGE) c.CAP_ALL1 = CAPRIGHT(1, 0x00000000001FFFFFULL) c.CAP_UNUSED1_22 = CAPRIGHT(1, 0x0000000000200000ULL) c.CAP_UNUSED1_57 = CAPRIGHT(1, 0x0100000000000000ULL) c.CAP_FCNTL = multiflags { GETFL = bit.lshift(1, c.F.GETFL), SETFL = bit.lshift(1, c.F.SETFL), GETOWN = bit.lshift(1, c.F.GETOWN), SETOWN = bit.lshift(1, c.F.SETOWN), } c.CAP_FCNTL.ALL = bit.bor(c.CAP_FCNTL.GETFL, c.CAP_FCNTL.SETFL, c.CAP_FCNTL.GETOWN, c.CAP_FCNTL.SETOWN) c.CAP_IOCTLS = multiflags { ALL = h.longmax, } c.CAP_RIGHTS_VERSION = 0 -- we do not understand others end -- freebsd >= 10 if version >= 11 then -- for utimensat c.UTIME = strflag { NOW = -1, OMIT = -2, } end return c