master
  1const std = @import("std");
  2const builtin = @import("builtin");
  3const wasi = std.os.wasi;
  4const linux = std.os.linux;
  5const iovec = std.posix.iovec;
  6const iovec_const = std.posix.iovec_const;
  7const c = std.c;
  8
  9// TODO: go through this file and delete all the bits that are identical to linux because they can
 10// be merged in the std.c namespace.
 11
 12pub const FILE = c.FILE;
 13
 14var __stack_chk_guard: usize = 0;
 15fn __stack_chk_fail() callconv(.c) void {
 16    std.debug.print("stack smashing detected: terminated\n", .{});
 17    emscripten_force_exit(127);
 18}
 19
 20comptime {
 21    if (builtin.os.tag == .emscripten) {
 22        if (builtin.mode == .Debug or builtin.mode == .ReleaseSafe) {
 23            // Emscripten does not provide these symbols, so we must export our own
 24            @export(&__stack_chk_guard, .{ .name = "__stack_chk_guard", .linkage = .strong });
 25            @export(&__stack_chk_fail, .{ .name = "__stack_chk_fail", .linkage = .strong });
 26        }
 27    }
 28}
 29
 30pub const PF = linux.PF;
 31pub const AF = linux.AF;
 32pub const CLOCK = linux.CLOCK;
 33
 34pub const CPU_SETSIZE = 128;
 35pub const cpu_set_t = [CPU_SETSIZE / @sizeOf(usize)]usize;
 36pub const cpu_count_t = std.meta.Int(.unsigned, std.math.log2(CPU_SETSIZE * 8));
 37
 38pub fn CPU_COUNT(set: cpu_set_t) cpu_count_t {
 39    var sum: cpu_count_t = 0;
 40    for (set) |x| {
 41        sum += @popCount(x);
 42    }
 43    return sum;
 44}
 45
 46pub const E = enum(u16) {
 47    SUCCESS = @intFromEnum(wasi.errno_t.SUCCESS),
 48    @"2BIG" = @intFromEnum(wasi.errno_t.@"2BIG"),
 49    ACCES = @intFromEnum(wasi.errno_t.ACCES),
 50    ADDRINUSE = @intFromEnum(wasi.errno_t.ADDRINUSE),
 51    ADDRNOTAVAIL = @intFromEnum(wasi.errno_t.ADDRNOTAVAIL),
 52    AFNOSUPPORT = @intFromEnum(wasi.errno_t.AFNOSUPPORT),
 53    /// This is also the error code used for `WOULDBLOCK`.
 54    AGAIN = @intFromEnum(wasi.errno_t.AGAIN),
 55    ALREADY = @intFromEnum(wasi.errno_t.ALREADY),
 56    BADF = @intFromEnum(wasi.errno_t.BADF),
 57    BADMSG = @intFromEnum(wasi.errno_t.BADMSG),
 58    BUSY = @intFromEnum(wasi.errno_t.BUSY),
 59    CANCELED = @intFromEnum(wasi.errno_t.CANCELED),
 60    CHILD = @intFromEnum(wasi.errno_t.CHILD),
 61    CONNABORTED = @intFromEnum(wasi.errno_t.CONNABORTED),
 62    CONNREFUSED = @intFromEnum(wasi.errno_t.CONNREFUSED),
 63    CONNRESET = @intFromEnum(wasi.errno_t.CONNRESET),
 64    DEADLK = @intFromEnum(wasi.errno_t.DEADLK),
 65    DESTADDRREQ = @intFromEnum(wasi.errno_t.DESTADDRREQ),
 66    DOM = @intFromEnum(wasi.errno_t.DOM),
 67    DQUOT = @intFromEnum(wasi.errno_t.DQUOT),
 68    EXIST = @intFromEnum(wasi.errno_t.EXIST),
 69    FAULT = @intFromEnum(wasi.errno_t.FAULT),
 70    FBIG = @intFromEnum(wasi.errno_t.FBIG),
 71    HOSTUNREACH = @intFromEnum(wasi.errno_t.HOSTUNREACH),
 72    IDRM = @intFromEnum(wasi.errno_t.IDRM),
 73    ILSEQ = @intFromEnum(wasi.errno_t.ILSEQ),
 74    INPROGRESS = @intFromEnum(wasi.errno_t.INPROGRESS),
 75    INTR = @intFromEnum(wasi.errno_t.INTR),
 76    INVAL = @intFromEnum(wasi.errno_t.INVAL),
 77    IO = @intFromEnum(wasi.errno_t.IO),
 78    ISCONN = @intFromEnum(wasi.errno_t.ISCONN),
 79    ISDIR = @intFromEnum(wasi.errno_t.ISDIR),
 80    LOOP = @intFromEnum(wasi.errno_t.LOOP),
 81    MFILE = @intFromEnum(wasi.errno_t.MFILE),
 82    MLINK = @intFromEnum(wasi.errno_t.MLINK),
 83    MSGSIZE = @intFromEnum(wasi.errno_t.MSGSIZE),
 84    MULTIHOP = @intFromEnum(wasi.errno_t.MULTIHOP),
 85    NAMETOOLONG = @intFromEnum(wasi.errno_t.NAMETOOLONG),
 86    NETDOWN = @intFromEnum(wasi.errno_t.NETDOWN),
 87    NETRESET = @intFromEnum(wasi.errno_t.NETRESET),
 88    NETUNREACH = @intFromEnum(wasi.errno_t.NETUNREACH),
 89    NFILE = @intFromEnum(wasi.errno_t.NFILE),
 90    NOBUFS = @intFromEnum(wasi.errno_t.NOBUFS),
 91    NODEV = @intFromEnum(wasi.errno_t.NODEV),
 92    NOENT = @intFromEnum(wasi.errno_t.NOENT),
 93    NOEXEC = @intFromEnum(wasi.errno_t.NOEXEC),
 94    NOLCK = @intFromEnum(wasi.errno_t.NOLCK),
 95    NOLINK = @intFromEnum(wasi.errno_t.NOLINK),
 96    NOMEM = @intFromEnum(wasi.errno_t.NOMEM),
 97    NOMSG = @intFromEnum(wasi.errno_t.NOMSG),
 98    NOPROTOOPT = @intFromEnum(wasi.errno_t.NOPROTOOPT),
 99    NOSPC = @intFromEnum(wasi.errno_t.NOSPC),
100    NOSYS = @intFromEnum(wasi.errno_t.NOSYS),
101    NOTCONN = @intFromEnum(wasi.errno_t.NOTCONN),
102    NOTDIR = @intFromEnum(wasi.errno_t.NOTDIR),
103    NOTEMPTY = @intFromEnum(wasi.errno_t.NOTEMPTY),
104    NOTRECOVERABLE = @intFromEnum(wasi.errno_t.NOTRECOVERABLE),
105    NOTSOCK = @intFromEnum(wasi.errno_t.NOTSOCK),
106    /// This is also the code used for `NOTSUP`.
107    OPNOTSUPP = @intFromEnum(wasi.errno_t.OPNOTSUPP),
108    NOTTY = @intFromEnum(wasi.errno_t.NOTTY),
109    NXIO = @intFromEnum(wasi.errno_t.NXIO),
110    OVERFLOW = @intFromEnum(wasi.errno_t.OVERFLOW),
111    OWNERDEAD = @intFromEnum(wasi.errno_t.OWNERDEAD),
112    PERM = @intFromEnum(wasi.errno_t.PERM),
113    PIPE = @intFromEnum(wasi.errno_t.PIPE),
114    PROTO = @intFromEnum(wasi.errno_t.PROTO),
115    PROTONOSUPPORT = @intFromEnum(wasi.errno_t.PROTONOSUPPORT),
116    PROTOTYPE = @intFromEnum(wasi.errno_t.PROTOTYPE),
117    RANGE = @intFromEnum(wasi.errno_t.RANGE),
118    ROFS = @intFromEnum(wasi.errno_t.ROFS),
119    SPIPE = @intFromEnum(wasi.errno_t.SPIPE),
120    SRCH = @intFromEnum(wasi.errno_t.SRCH),
121    STALE = @intFromEnum(wasi.errno_t.STALE),
122    TIMEDOUT = @intFromEnum(wasi.errno_t.TIMEDOUT),
123    TXTBSY = @intFromEnum(wasi.errno_t.TXTBSY),
124    XDEV = @intFromEnum(wasi.errno_t.XDEV),
125    NOTCAPABLE = @intFromEnum(wasi.errno_t.NOTCAPABLE),
126
127    ENOSTR = 100,
128    EBFONT = 101,
129    EBADSLT = 102,
130    EBADRQC = 103,
131    ENOANO = 104,
132    ENOTBLK = 105,
133    ECHRNG = 106,
134    EL3HLT = 107,
135    EL3RST = 108,
136    ELNRNG = 109,
137    EUNATCH = 110,
138    ENOCSI = 111,
139    EL2HLT = 112,
140    EBADE = 113,
141    EBADR = 114,
142    EXFULL = 115,
143    ENODATA = 116,
144    ETIME = 117,
145    ENOSR = 118,
146    ENONET = 119,
147    ENOPKG = 120,
148    EREMOTE = 121,
149    EADV = 122,
150    ESRMNT = 123,
151    ECOMM = 124,
152    EDOTDOT = 125,
153    ENOTUNIQ = 126,
154    EBADFD = 127,
155    EREMCHG = 128,
156    ELIBACC = 129,
157    ELIBBAD = 130,
158    ELIBSCN = 131,
159    ELIBMAX = 132,
160    ELIBEXEC = 133,
161    ERESTART = 134,
162    ESTRPIPE = 135,
163    EUSERS = 136,
164    ESOCKTNOSUPPORT = 137,
165    EOPNOTSUPP = 138,
166    EPFNOSUPPORT = 139,
167    ESHUTDOWN = 140,
168    ETOOMANYREFS = 141,
169    EHOSTDOWN = 142,
170    EUCLEAN = 143,
171    ENOTNAM = 144,
172    ENAVAIL = 145,
173    EISNAM = 146,
174    EREMOTEIO = 147,
175    ENOMEDIUM = 148,
176    EMEDIUMTYPE = 149,
177    ENOKEY = 150,
178    EKEYEXPIRED = 151,
179    EKEYREVOKED = 152,
180    EKEYREJECTED = 153,
181    ERFKILL = 154,
182    EHWPOISON = 155,
183    EL2NSYNC = 156,
184    _,
185};
186
187pub const F = struct {
188    pub const DUPFD = 0;
189    pub const GETFD = 1;
190    pub const SETFD = 2;
191    pub const GETFL = 3;
192    pub const SETFL = 4;
193    pub const SETOWN = 8;
194    pub const GETOWN = 9;
195    pub const SETSIG = 10;
196    pub const GETSIG = 11;
197    pub const GETLK = 12;
198    pub const SETLK = 13;
199    pub const SETLKW = 14;
200    pub const SETOWN_EX = 15;
201    pub const GETOWN_EX = 16;
202    pub const GETOWNER_UIDS = 17;
203
204    pub const RDLCK = 0;
205    pub const WRLCK = 1;
206    pub const UNLCK = 2;
207};
208
209pub const FD_CLOEXEC = 1;
210
211pub const F_OK = 0;
212pub const X_OK = 1;
213pub const W_OK = 2;
214pub const R_OK = 4;
215
216pub const W = struct {
217    pub const NOHANG = 1;
218    pub const UNTRACED = 2;
219    pub const STOPPED = 2;
220    pub const EXITED = 4;
221    pub const CONTINUED = 8;
222    pub const NOWAIT = 0x1000000;
223
224    pub fn EXITSTATUS(s: u32) u8 {
225        return @as(u8, @intCast((s & 0xff00) >> 8));
226    }
227    pub fn TERMSIG(s: u32) u32 {
228        return s & 0x7f;
229    }
230    pub fn STOPSIG(s: u32) u32 {
231        return EXITSTATUS(s);
232    }
233    pub fn IFEXITED(s: u32) bool {
234        return TERMSIG(s) == 0;
235    }
236    pub fn IFSTOPPED(s: u32) bool {
237        return @as(u16, @truncate(((s & 0xffff) *% 0x10001) >> 8)) > 0x7f00;
238    }
239    pub fn IFSIGNALED(s: u32) bool {
240        return (s & 0xffff) -% 1 < 0xff;
241    }
242};
243
244pub const Flock = extern struct {
245    type: i16,
246    whence: i16,
247    start: off_t,
248    len: off_t,
249    pid: pid_t,
250};
251
252pub const IFNAMESIZE = 16;
253
254pub const NAME_MAX = 255;
255pub const PATH_MAX = 4096;
256pub const IOV_MAX = 1024;
257
258pub const IPPORT_RESERVED = 1024;
259
260pub const IPPROTO = linux.IPPROTO;
261
262pub const LOCK = struct {
263    pub const SH = 1;
264    pub const EX = 2;
265    pub const NB = 4;
266    pub const UN = 8;
267};
268
269pub const MADV = struct {
270    pub const NORMAL = 0;
271    pub const RANDOM = 1;
272    pub const SEQUENTIAL = 2;
273    pub const WILLNEED = 3;
274    pub const DONTNEED = 4;
275    pub const FREE = 8;
276    pub const REMOVE = 9;
277    pub const DONTFORK = 10;
278    pub const DOFORK = 11;
279    pub const MERGEABLE = 12;
280    pub const UNMERGEABLE = 13;
281    pub const HUGEPAGE = 14;
282    pub const NOHUGEPAGE = 15;
283    pub const DONTDUMP = 16;
284    pub const DODUMP = 17;
285    pub const WIPEONFORK = 18;
286    pub const KEEPONFORK = 19;
287    pub const COLD = 20;
288    pub const PAGEOUT = 21;
289    pub const HWPOISON = 100;
290    pub const SOFT_OFFLINE = 101;
291};
292
293pub const MSF = struct {
294    pub const ASYNC = 1;
295    pub const INVALIDATE = 2;
296    pub const SYNC = 4;
297};
298
299pub const MSG = struct {
300    pub const OOB = 0x0001;
301    pub const PEEK = 0x0002;
302    pub const DONTROUTE = 0x0004;
303    pub const CTRUNC = 0x0008;
304    pub const PROXY = 0x0010;
305    pub const TRUNC = 0x0020;
306    pub const DONTWAIT = 0x0040;
307    pub const EOR = 0x0080;
308    pub const WAITALL = 0x0100;
309    pub const FIN = 0x0200;
310    pub const SYN = 0x0400;
311    pub const CONFIRM = 0x0800;
312    pub const RST = 0x1000;
313    pub const ERRQUEUE = 0x2000;
314    pub const NOSIGNAL = 0x4000;
315    pub const MORE = 0x8000;
316    pub const WAITFORONE = 0x10000;
317    pub const BATCH = 0x40000;
318    pub const ZEROCOPY = 0x4000000;
319    pub const FASTOPEN = 0x20000000;
320    pub const CMSG_CLOEXEC = 0x40000000;
321};
322
323pub const POLL = struct {
324    pub const IN = 0x001;
325    pub const PRI = 0x002;
326    pub const OUT = 0x004;
327    pub const ERR = 0x008;
328    pub const HUP = 0x010;
329    pub const NVAL = 0x020;
330    pub const RDNORM = 0x040;
331    pub const RDBAND = 0x080;
332};
333
334pub const PROT = struct {
335    pub const NONE = 0x0;
336    pub const READ = 0x1;
337    pub const WRITE = 0x2;
338    pub const EXEC = 0x4;
339    pub const GROWSDOWN = 0x01000000;
340    pub const GROWSUP = 0x02000000;
341};
342
343pub const rlim_t = u64;
344
345pub const RLIM = struct {
346    pub const INFINITY = ~@as(rlim_t, 0);
347
348    pub const SAVED_MAX = INFINITY;
349    pub const SAVED_CUR = INFINITY;
350};
351
352pub const rlimit = c.rlimit;
353
354pub const rlimit_resource = enum(c_int) {
355    CPU,
356    FSIZE,
357    DATA,
358    STACK,
359    CORE,
360    RSS,
361    NPROC,
362    NOFILE,
363    MEMLOCK,
364    AS,
365    LOCKS,
366    SIGPENDING,
367    MSGQUEUE,
368    NICE,
369    RTPRIO,
370    RTTIME,
371    _,
372};
373
374pub const rusage = extern struct {
375    utime: timeval,
376    stime: timeval,
377    maxrss: isize,
378    ixrss: isize,
379    idrss: isize,
380    isrss: isize,
381    minflt: isize,
382    majflt: isize,
383    nswap: isize,
384    inblock: isize,
385    oublock: isize,
386    msgsnd: isize,
387    msgrcv: isize,
388    nsignals: isize,
389    nvcsw: isize,
390    nivcsw: isize,
391    __reserved: [16]isize = [1]isize{0} ** 16,
392
393    pub const SELF = 0;
394    pub const CHILDREN = -1;
395    pub const THREAD = 1;
396};
397
398pub const timeval = extern struct {
399    sec: i64,
400    usec: i32,
401};
402
403pub const S = struct {
404    pub const IFMT = 0o170000;
405
406    pub const IFDIR = 0o040000;
407    pub const IFCHR = 0o020000;
408    pub const IFBLK = 0o060000;
409    pub const IFREG = 0o100000;
410    pub const IFIFO = 0o010000;
411    pub const IFLNK = 0o120000;
412    pub const IFSOCK = 0o140000;
413
414    pub const ISUID = 0o4000;
415    pub const ISGID = 0o2000;
416    pub const ISVTX = 0o1000;
417    pub const IRUSR = 0o400;
418    pub const IWUSR = 0o200;
419    pub const IXUSR = 0o100;
420    pub const IRWXU = 0o700;
421    pub const IRGRP = 0o040;
422    pub const IWGRP = 0o020;
423    pub const IXGRP = 0o010;
424    pub const IRWXG = 0o070;
425    pub const IROTH = 0o004;
426    pub const IWOTH = 0o002;
427    pub const IXOTH = 0o001;
428    pub const IRWXO = 0o007;
429
430    pub fn ISREG(m: mode_t) bool {
431        return m & IFMT == IFREG;
432    }
433
434    pub fn ISDIR(m: mode_t) bool {
435        return m & IFMT == IFDIR;
436    }
437
438    pub fn ISCHR(m: mode_t) bool {
439        return m & IFMT == IFCHR;
440    }
441
442    pub fn ISBLK(m: mode_t) bool {
443        return m & IFMT == IFBLK;
444    }
445
446    pub fn ISFIFO(m: mode_t) bool {
447        return m & IFMT == IFIFO;
448    }
449
450    pub fn ISLNK(m: mode_t) bool {
451        return m & IFMT == IFLNK;
452    }
453
454    pub fn ISSOCK(m: mode_t) bool {
455        return m & IFMT == IFSOCK;
456    }
457};
458
459pub const SA = struct {
460    pub const NOCLDSTOP = 1;
461    pub const NOCLDWAIT = 2;
462    pub const SIGINFO = 4;
463    pub const RESTART = 0x10000000;
464    pub const RESETHAND = 0x80000000;
465    pub const ONSTACK = 0x08000000;
466    pub const NODEFER = 0x40000000;
467    pub const RESTORER = 0x04000000;
468};
469
470pub const SEEK = struct {
471    pub const SET = 0;
472    pub const CUR = 1;
473    pub const END = 2;
474};
475
476pub const SHUT = struct {
477    pub const RD = 0;
478    pub const WR = 1;
479    pub const RDWR = 2;
480};
481
482pub const SIG = linux.SIG;
483
484pub const Sigaction = extern struct {
485    pub const handler_fn = *align(1) const fn (i32) callconv(.c) void;
486    pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.c) void;
487
488    handler: extern union {
489        handler: ?handler_fn,
490        sigaction: ?sigaction_fn,
491    },
492    mask: sigset_t,
493    flags: c_uint,
494    restorer: ?*const fn () callconv(.c) void = null,
495};
496
497pub const sigset_t = [1024 / 32]u32;
498pub fn sigemptyset() sigset_t {
499    return [_]u32{0} ** @typeInfo(sigset_t).array.len;
500}
501pub const siginfo_t = extern struct {
502    signo: i32,
503    errno: i32,
504    code: i32,
505    fields: siginfo_fields_union,
506};
507const siginfo_fields_union = extern union {
508    pad: [128 - 2 * @sizeOf(c_int) - @sizeOf(c_long)]u8,
509    common: extern struct {
510        first: extern union {
511            piduid: extern struct {
512                pid: pid_t,
513                uid: uid_t,
514            },
515            timer: extern struct {
516                timerid: i32,
517                overrun: i32,
518            },
519        },
520        second: extern union {
521            value: sigval,
522            sigchld: extern struct {
523                status: i32,
524                utime: clock_t,
525                stime: clock_t,
526            },
527        },
528    },
529    sigfault: extern struct {
530        addr: *allowzero anyopaque,
531        addr_lsb: i16,
532        first: extern union {
533            addr_bnd: extern struct {
534                lower: *anyopaque,
535                upper: *anyopaque,
536            },
537            pkey: u32,
538        },
539    },
540    sigpoll: extern struct {
541        band: isize,
542        fd: i32,
543    },
544    sigsys: extern struct {
545        call_addr: *anyopaque,
546        syscall: i32,
547        native_arch: u32,
548    },
549};
550pub const sigval = extern union {
551    int: i32,
552    ptr: *anyopaque,
553};
554
555pub const SIOCGIFINDEX = 0x8933;
556
557pub const SO = struct {
558    pub const DEBUG = 1;
559    pub const REUSEADDR = 2;
560    pub const TYPE = 3;
561    pub const ERROR = 4;
562    pub const DONTROUTE = 5;
563    pub const BROADCAST = 6;
564    pub const SNDBUF = 7;
565    pub const RCVBUF = 8;
566    pub const KEEPALIVE = 9;
567    pub const OOBINLINE = 10;
568    pub const NO_CHECK = 11;
569    pub const PRIORITY = 12;
570    pub const LINGER = 13;
571    pub const BSDCOMPAT = 14;
572    pub const REUSEPORT = 15;
573    pub const PASSCRED = 16;
574    pub const PEERCRED = 17;
575    pub const RCVLOWAT = 18;
576    pub const SNDLOWAT = 19;
577    pub const RCVTIMEO = 20;
578    pub const SNDTIMEO = 21;
579    pub const ACCEPTCONN = 30;
580    pub const PEERSEC = 31;
581    pub const SNDBUFFORCE = 32;
582    pub const RCVBUFFORCE = 33;
583    pub const PROTOCOL = 38;
584    pub const DOMAIN = 39;
585    pub const SECURITY_AUTHENTICATION = 22;
586    pub const SECURITY_ENCRYPTION_TRANSPORT = 23;
587    pub const SECURITY_ENCRYPTION_NETWORK = 24;
588    pub const BINDTODEVICE = 25;
589    pub const ATTACH_FILTER = 26;
590    pub const DETACH_FILTER = 27;
591    pub const GET_FILTER = ATTACH_FILTER;
592    pub const PEERNAME = 28;
593    pub const TIMESTAMP_OLD = 29;
594    pub const PASSSEC = 34;
595    pub const TIMESTAMPNS_OLD = 35;
596    pub const MARK = 36;
597    pub const TIMESTAMPING_OLD = 37;
598    pub const RXQ_OVFL = 40;
599    pub const WIFI_STATUS = 41;
600    pub const PEEK_OFF = 42;
601    pub const NOFCS = 43;
602    pub const LOCK_FILTER = 44;
603    pub const SELECT_ERR_QUEUE = 45;
604    pub const BUSY_POLL = 46;
605    pub const MAX_PACING_RATE = 47;
606    pub const BPF_EXTENSIONS = 48;
607    pub const INCOMING_CPU = 49;
608    pub const ATTACH_BPF = 50;
609    pub const DETACH_BPF = DETACH_FILTER;
610    pub const ATTACH_REUSEPORT_CBPF = 51;
611    pub const ATTACH_REUSEPORT_EBPF = 52;
612    pub const CNX_ADVICE = 53;
613    pub const MEMINFO = 55;
614    pub const INCOMING_NAPI_ID = 56;
615    pub const COOKIE = 57;
616    pub const PEERGROUPS = 59;
617    pub const ZEROCOPY = 60;
618    pub const TXTIME = 61;
619    pub const BINDTOIFINDEX = 62;
620    pub const TIMESTAMP_NEW = 63;
621    pub const TIMESTAMPNS_NEW = 64;
622    pub const TIMESTAMPING_NEW = 65;
623    pub const RCVTIMEO_NEW = 66;
624    pub const SNDTIMEO_NEW = 67;
625    pub const DETACH_REUSEPORT_BPF = 68;
626};
627
628pub const SOCK = struct {
629    pub const STREAM = 1;
630    pub const DGRAM = 2;
631    pub const RAW = 3;
632    pub const RDM = 4;
633    pub const SEQPACKET = 5;
634    pub const DCCP = 6;
635    pub const PACKET = 10;
636    pub const CLOEXEC = 0o2000000;
637    pub const NONBLOCK = 0o4000;
638};
639
640pub const SOL = struct {
641    pub const SOCKET = 1;
642
643    pub const IP = 0;
644    pub const IPV6 = 41;
645    pub const ICMPV6 = 58;
646
647    pub const RAW = 255;
648    pub const DECNET = 261;
649    pub const X25 = 262;
650    pub const PACKET = 263;
651    pub const ATM = 264;
652    pub const AAL = 265;
653    pub const IRDA = 266;
654    pub const NETBEUI = 267;
655    pub const LLC = 268;
656    pub const DCCP = 269;
657    pub const NETLINK = 270;
658    pub const TIPC = 271;
659    pub const RXRPC = 272;
660    pub const PPPOL2TP = 273;
661    pub const BLUETOOTH = 274;
662    pub const PNPIPE = 275;
663    pub const RDS = 276;
664    pub const IUCV = 277;
665    pub const CAIF = 278;
666    pub const ALG = 279;
667    pub const NFC = 280;
668    pub const KCM = 281;
669    pub const TLS = 282;
670    pub const XDP = 283;
671};
672
673pub const STDIN_FILENO = 0;
674pub const STDOUT_FILENO = 1;
675pub const STDERR_FILENO = 2;
676
677pub const TCP = struct {
678    pub const NODELAY = 1;
679    pub const MAXSEG = 2;
680    pub const CORK = 3;
681    pub const KEEPIDLE = 4;
682    pub const KEEPINTVL = 5;
683    pub const KEEPCNT = 6;
684    pub const SYNCNT = 7;
685    pub const LINGER2 = 8;
686    pub const DEFER_ACCEPT = 9;
687    pub const WINDOW_CLAMP = 10;
688    pub const INFO = 11;
689    pub const QUICKACK = 12;
690    pub const CONGESTION = 13;
691    pub const MD5SIG = 14;
692    pub const THIN_LINEAR_TIMEOUTS = 16;
693    pub const THIN_DUPACK = 17;
694    pub const USER_TIMEOUT = 18;
695    pub const REPAIR = 19;
696    pub const REPAIR_QUEUE = 20;
697    pub const QUEUE_SEQ = 21;
698    pub const REPAIR_OPTIONS = 22;
699    pub const FASTOPEN = 23;
700    pub const TIMESTAMP = 24;
701    pub const NOTSENT_LOWAT = 25;
702    pub const CC_INFO = 26;
703    pub const SAVE_SYN = 27;
704    pub const SAVED_SYN = 28;
705    pub const REPAIR_WINDOW = 29;
706    pub const FASTOPEN_CONNECT = 30;
707    pub const ULP = 31;
708    pub const MD5SIG_EXT = 32;
709    pub const FASTOPEN_KEY = 33;
710    pub const FASTOPEN_NO_COOKIE = 34;
711    pub const ZEROCOPY_RECEIVE = 35;
712    pub const INQ = 36;
713    pub const CM_INQ = INQ;
714    pub const TX_DELAY = 37;
715
716    pub const REPAIR_ON = 1;
717    pub const REPAIR_OFF = 0;
718    pub const REPAIR_OFF_NO_WP = -1;
719};
720
721pub const TCSA = std.posix.TCSA;
722pub const addrinfo = c.addrinfo;
723
724pub const in_port_t = c.in_port_t;
725pub const sa_family_t = c.sa_family_t;
726pub const socklen_t = c.socklen_t;
727pub const sockaddr = c.sockaddr;
728
729pub const blksize_t = i32;
730pub const nlink_t = u32;
731pub const time_t = i64;
732pub const mode_t = u32;
733pub const off_t = i64;
734pub const ino_t = u64;
735pub const dev_t = u32;
736pub const blkcnt_t = i32;
737
738pub const pid_t = i32;
739pub const fd_t = c.fd_t;
740pub const uid_t = u32;
741pub const gid_t = u32;
742pub const clock_t = i32;
743
744pub const dl_phdr_info = extern struct {
745    addr: usize,
746    name: ?[*:0]const u8,
747    phdr: [*]std.elf.Phdr,
748    phnum: u16,
749};
750
751pub const msghdr = std.c.msghdr;
752pub const msghdr_const = std.c.msghdr;
753
754pub const nfds_t = usize;
755pub const pollfd = extern struct {
756    fd: fd_t,
757    events: i16,
758    revents: i16,
759};
760
761pub const stack_t = extern struct {
762    sp: [*]u8,
763    flags: i32,
764    size: usize,
765};
766
767pub const timespec = extern struct {
768    sec: time_t,
769    nsec: isize,
770};
771
772pub const timezone = extern struct {
773    minuteswest: i32,
774    dsttime: i32,
775};
776
777pub const utsname = extern struct {
778    sysname: [64:0]u8,
779    nodename: [64:0]u8,
780    release: [64:0]u8,
781    version: [64:0]u8,
782    machine: [64:0]u8,
783    domainname: [64:0]u8,
784};
785
786pub const Stat = extern struct {
787    dev: dev_t,
788    mode: mode_t,
789    nlink: nlink_t,
790    uid: uid_t,
791    gid: gid_t,
792    rdev: dev_t,
793    size: off_t,
794    blksize: blksize_t,
795    blocks: blkcnt_t,
796    atim: timespec,
797    mtim: timespec,
798    ctim: timespec,
799    ino: ino_t,
800
801    pub fn atime(self: @This()) timespec {
802        return self.atim;
803    }
804
805    pub fn mtime(self: @This()) timespec {
806        return self.mtim;
807    }
808
809    pub fn ctime(self: @This()) timespec {
810        return self.ctim;
811    }
812};
813
814pub const TIMING = struct {
815    pub const SETTIMEOUT = 0;
816    pub const RAF = 1;
817    pub const SETIMMEDIATE = 2;
818};
819
820pub const LOG = struct {
821    pub const CONSOLE = 1;
822    pub const WARN = 2;
823    pub const ERROR = 4;
824    pub const C_STACK = 8;
825    pub const JS_STACK = 16;
826    pub const DEMANGLE = 32;
827    pub const NO_PATHS = 64;
828    pub const FUNC_PARAMS = 128;
829    pub const DEBUG = 256;
830    pub const INFO = 512;
831};
832
833pub const em_callback_func = ?*const fn () callconv(.c) void;
834pub const em_arg_callback_func = ?*const fn (?*anyopaque) callconv(.c) void;
835pub const em_str_callback_func = ?*const fn ([*:0]const u8) callconv(.c) void;
836
837pub extern "c" fn emscripten_async_wget(url: [*:0]const u8, file: [*:0]const u8, onload: em_str_callback_func, onerror: em_str_callback_func) void;
838
839pub const em_async_wget_onload_func = ?*const fn (?*anyopaque, ?*anyopaque, c_int) callconv(.c) void;
840pub extern "c" fn emscripten_async_wget_data(url: [*:0]const u8, arg: ?*anyopaque, onload: em_async_wget_onload_func, onerror: em_arg_callback_func) void;
841
842pub const em_async_wget2_onload_func = ?*const fn (c_uint, ?*anyopaque, [*:0]const u8) callconv(.c) void;
843pub const em_async_wget2_onstatus_func = ?*const fn (c_uint, ?*anyopaque, c_int) callconv(.c) void;
844
845pub extern "c" fn emscripten_async_wget2(url: [*:0]const u8, file: [*:0]const u8, requesttype: [*:0]const u8, param: [*:0]const u8, arg: ?*anyopaque, onload: em_async_wget2_onload_func, onerror: em_async_wget2_onstatus_func, onprogress: em_async_wget2_onstatus_func) c_int;
846
847pub const em_async_wget2_data_onload_func = ?*const fn (c_uint, ?*anyopaque, ?*anyopaque, c_uint) callconv(.c) void;
848pub const em_async_wget2_data_onerror_func = ?*const fn (c_uint, ?*anyopaque, c_int, [*:0]const u8) callconv(.c) void;
849pub const em_async_wget2_data_onprogress_func = ?*const fn (c_uint, ?*anyopaque, c_int, c_int) callconv(.c) void;
850
851pub extern "c" fn emscripten_async_wget2_data(url: [*:0]const u8, requesttype: [*:0]const u8, param: [*:0]const u8, arg: ?*anyopaque, free: c_int, onload: em_async_wget2_data_onload_func, onerror: em_async_wget2_data_onerror_func, onprogress: em_async_wget2_data_onprogress_func) c_int;
852pub extern "c" fn emscripten_async_wget2_abort(handle: c_int) void;
853pub extern "c" fn emscripten_wget(url: [*:0]const u8, file: [*:0]const u8) c_int;
854pub extern "c" fn emscripten_wget_data(url: [*:0]const u8, pbuffer: *(?*anyopaque), pnum: *c_int, perror: *c_int) void;
855pub extern "c" fn emscripten_run_script(script: [*:0]const u8) void;
856pub extern "c" fn emscripten_run_script_int(script: [*:0]const u8) c_int;
857pub extern "c" fn emscripten_run_script_string(script: [*:0]const u8) [*:0]u8;
858pub extern "c" fn emscripten_async_run_script(script: [*:0]const u8, millis: c_int) void;
859pub extern "c" fn emscripten_async_load_script(script: [*:0]const u8, onload: em_callback_func, onerror: em_callback_func) void;
860pub extern "c" fn emscripten_set_main_loop(func: em_callback_func, fps: c_int, simulate_infinite_loop: c_int) void;
861pub extern "c" fn emscripten_set_main_loop_timing(mode: c_int, value: c_int) c_int;
862pub extern "c" fn emscripten_get_main_loop_timing(mode: *c_int, value: *c_int) void;
863pub extern "c" fn emscripten_set_main_loop_arg(func: em_arg_callback_func, arg: ?*anyopaque, fps: c_int, simulate_infinite_loop: c_int) void;
864pub extern "c" fn emscripten_pause_main_loop() void;
865pub extern "c" fn emscripten_resume_main_loop() void;
866pub extern "c" fn emscripten_cancel_main_loop() void;
867
868pub const em_socket_callback = ?*const fn (c_int, ?*anyopaque) callconv(.c) void;
869pub const em_socket_error_callback = ?*const fn (c_int, c_int, [*:0]const u8, ?*anyopaque) callconv(.c) void;
870
871pub extern "c" fn emscripten_set_socket_error_callback(userData: ?*anyopaque, callback: em_socket_error_callback) void;
872pub extern "c" fn emscripten_set_socket_open_callback(userData: ?*anyopaque, callback: em_socket_callback) void;
873pub extern "c" fn emscripten_set_socket_listen_callback(userData: ?*anyopaque, callback: em_socket_callback) void;
874pub extern "c" fn emscripten_set_socket_connection_callback(userData: ?*anyopaque, callback: em_socket_callback) void;
875pub extern "c" fn emscripten_set_socket_message_callback(userData: ?*anyopaque, callback: em_socket_callback) void;
876pub extern "c" fn emscripten_set_socket_close_callback(userData: ?*anyopaque, callback: em_socket_callback) void;
877pub extern "c" fn _emscripten_push_main_loop_blocker(func: em_arg_callback_func, arg: ?*anyopaque, name: [*:0]const u8) void;
878pub extern "c" fn _emscripten_push_uncounted_main_loop_blocker(func: em_arg_callback_func, arg: ?*anyopaque, name: [*:0]const u8) void;
879pub extern "c" fn emscripten_set_main_loop_expected_blockers(num: c_int) void;
880pub extern "c" fn emscripten_async_call(func: em_arg_callback_func, arg: ?*anyopaque, millis: c_int) void;
881pub extern "c" fn emscripten_exit_with_live_runtime() noreturn;
882pub extern "c" fn emscripten_force_exit(status: c_int) noreturn;
883pub extern "c" fn emscripten_get_device_pixel_ratio() f64;
884pub extern "c" fn emscripten_get_window_title() [*:0]u8;
885pub extern "c" fn emscripten_set_window_title([*:0]const u8) void;
886pub extern "c" fn emscripten_get_screen_size(width: *c_int, height: *c_int) void;
887pub extern "c" fn emscripten_hide_mouse() void;
888pub extern "c" fn emscripten_set_canvas_size(width: c_int, height: c_int) void;
889pub extern "c" fn emscripten_get_canvas_size(width: *c_int, height: *c_int, isFullscreen: *c_int) void;
890pub extern "c" fn emscripten_get_now() f64;
891pub extern "c" fn emscripten_random() f32;
892pub const em_idb_onload_func = ?*const fn (?*anyopaque, ?*anyopaque, c_int) callconv(.c) void;
893pub extern "c" fn emscripten_idb_async_load(db_name: [*:0]const u8, file_id: [*:0]const u8, arg: ?*anyopaque, onload: em_idb_onload_func, onerror: em_arg_callback_func) void;
894pub extern "c" fn emscripten_idb_async_store(db_name: [*:0]const u8, file_id: [*:0]const u8, ptr: ?*anyopaque, num: c_int, arg: ?*anyopaque, onstore: em_arg_callback_func, onerror: em_arg_callback_func) void;
895pub extern "c" fn emscripten_idb_async_delete(db_name: [*:0]const u8, file_id: [*:0]const u8, arg: ?*anyopaque, ondelete: em_arg_callback_func, onerror: em_arg_callback_func) void;
896pub const em_idb_exists_func = ?*const fn (?*anyopaque, c_int) callconv(.c) void;
897pub extern "c" fn emscripten_idb_async_exists(db_name: [*:0]const u8, file_id: [*:0]const u8, arg: ?*anyopaque, oncheck: em_idb_exists_func, onerror: em_arg_callback_func) void;
898pub extern "c" fn emscripten_idb_load(db_name: [*:0]const u8, file_id: [*:0]const u8, pbuffer: *?*anyopaque, pnum: *c_int, perror: *c_int) void;
899pub extern "c" fn emscripten_idb_store(db_name: [*:0]const u8, file_id: [*:0]const u8, buffer: *anyopaque, num: c_int, perror: *c_int) void;
900pub extern "c" fn emscripten_idb_delete(db_name: [*:0]const u8, file_id: [*:0]const u8, perror: *c_int) void;
901pub extern "c" fn emscripten_idb_exists(db_name: [*:0]const u8, file_id: [*:0]const u8, pexists: *c_int, perror: *c_int) void;
902pub extern "c" fn emscripten_idb_load_blob(db_name: [*:0]const u8, file_id: [*:0]const u8, pblob: *c_int, perror: *c_int) void;
903pub extern "c" fn emscripten_idb_store_blob(db_name: [*:0]const u8, file_id: [*:0]const u8, buffer: *anyopaque, num: c_int, perror: *c_int) void;
904pub extern "c" fn emscripten_idb_read_from_blob(blob: c_int, start: c_int, num: c_int, buffer: ?*anyopaque) void;
905pub extern "c" fn emscripten_idb_free_blob(blob: c_int) void;
906pub extern "c" fn emscripten_run_preload_plugins(file: [*:0]const u8, onload: em_str_callback_func, onerror: em_str_callback_func) c_int;
907pub const em_run_preload_plugins_data_onload_func = ?*const fn (?*anyopaque, [*:0]const u8) callconv(.c) void;
908pub extern "c" fn emscripten_run_preload_plugins_data(data: [*]u8, size: c_int, suffix: [*:0]const u8, arg: ?*anyopaque, onload: em_run_preload_plugins_data_onload_func, onerror: em_arg_callback_func) void;
909pub extern "c" fn emscripten_lazy_load_code() void;
910pub const worker_handle = c_int;
911pub extern "c" fn emscripten_create_worker(url: [*:0]const u8) worker_handle;
912pub extern "c" fn emscripten_destroy_worker(worker: worker_handle) void;
913pub const em_worker_callback_func = ?*const fn ([*]u8, c_int, ?*anyopaque) callconv(.c) void;
914pub extern "c" fn emscripten_call_worker(worker: worker_handle, funcname: [*:0]const u8, data: [*]u8, size: c_int, callback: em_worker_callback_func, arg: ?*anyopaque) void;
915pub extern "c" fn emscripten_worker_respond(data: [*]u8, size: c_int) void;
916pub extern "c" fn emscripten_worker_respond_provisionally(data: [*]u8, size: c_int) void;
917pub extern "c" fn emscripten_get_worker_queue_size(worker: worker_handle) c_int;
918pub extern "c" fn emscripten_get_compiler_setting(name: [*:0]const u8) c_long;
919pub extern "c" fn emscripten_has_asyncify() c_int;
920pub extern "c" fn emscripten_debugger() void;
921
922pub extern "c" fn emscripten_get_preloaded_image_data(path: [*:0]const u8, w: *c_int, h: *c_int) ?[*]u8;
923pub extern "c" fn emscripten_get_preloaded_image_data_from_FILE(file: *FILE, w: *c_int, h: *c_int) ?[*]u8;
924pub extern "c" fn emscripten_log(flags: c_int, format: [*:0]const u8, ...) void;
925pub extern "c" fn emscripten_get_callstack(flags: c_int, out: ?[*]u8, maxbytes: c_int) c_int;
926pub extern "c" fn emscripten_print_double(x: f64, to: ?[*]u8, max: c_int) c_int;
927pub const em_scan_func = ?*const fn (?*anyopaque, ?*anyopaque) callconv(.c) void;
928pub extern "c" fn emscripten_scan_registers(func: em_scan_func) void;
929pub extern "c" fn emscripten_scan_stack(func: em_scan_func) void;
930pub const em_dlopen_callback = ?*const fn (?*anyopaque, ?*anyopaque) callconv(.c) void;
931pub extern "c" fn emscripten_dlopen(filename: [*:0]const u8, flags: c_int, user_data: ?*anyopaque, onsuccess: em_dlopen_callback, onerror: em_arg_callback_func) void;
932pub extern "c" fn emscripten_dlopen_promise(filename: [*:0]const u8, flags: c_int) em_promise_t;
933pub extern "c" fn emscripten_throw_number(number: f64) void;
934pub extern "c" fn emscripten_throw_string(utf8String: [*:0]const u8) void;
935pub extern "c" fn emscripten_sleep(ms: c_uint) void;
936
937pub const PROMISE = struct {
938    pub const FULFILL = 0;
939    pub const MATCH = 1;
940    pub const MATCH_RELEASE = 2;
941    pub const REJECT = 3;
942};
943
944pub const struct__em_promise = opaque {};
945pub const em_promise_t = ?*struct__em_promise;
946pub const enum_em_promise_result_t = c_uint;
947pub const em_promise_result_t = enum_em_promise_result_t;
948pub const em_promise_callback_t = ?*const fn (?*?*anyopaque, ?*anyopaque, ?*anyopaque) callconv(.c) em_promise_result_t;
949
950pub extern "c" fn emscripten_promise_create() em_promise_t;
951pub extern "c" fn emscripten_promise_destroy(promise: em_promise_t) void;
952pub extern "c" fn emscripten_promise_resolve(promise: em_promise_t, result: em_promise_result_t, value: ?*anyopaque) void;
953pub extern "c" fn emscripten_promise_then(promise: em_promise_t, on_fulfilled: em_promise_callback_t, on_rejected: em_promise_callback_t, data: ?*anyopaque) em_promise_t;
954pub extern "c" fn emscripten_promise_all(promises: [*]em_promise_t, results: ?[*]?*anyopaque, num_promises: usize) em_promise_t;
955
956pub const struct_em_settled_result_t = extern struct {
957    result: em_promise_result_t,
958    value: ?*anyopaque,
959};
960pub const em_settled_result_t = struct_em_settled_result_t;