    //! wasi_snapshot_preview1 spec available (in witx format) here:
    //! * typenames -- https://github.com/WebAssembly/WASI/blob/main/legacy/preview1/witx/typenames.witx
    //! * module -- https://github.com/WebAssembly/WASI/blob/main/legacy/preview1/witx/wasi_snapshot_preview1.witx
    //! Note that libc API does *not* go in this file. wasi libc API goes into std/c/wasi.zig instead.
    const builtin = @import("builtin");
    const std = @import("std");
    const assert = std.debug.assert;

    comptime {
        assert(@alignOf(i8) == 1);
        assert(@alignOf(u8) == 1);
        assert(@alignOf(i16) == 2);
        assert(@alignOf(u16) == 2);
        assert(@alignOf(i32) == 4);
        assert(@alignOf(u32) == 4);
        // assert(@alignOf(i64) == 8);

        // assert(@alignOf(u64) == 8);

    }

    pub const iovec_t = std.os.iovec;
    pub const ciovec_t = std.os.iovec_const;

    pub extern "wasi_snapshot_preview1" fn args_get(argv: [*][*:0]u8, argv_buf: [*]u8) errno_t;
    pub extern "wasi_snapshot_preview1" fn args_sizes_get(argc: *usize, argv_buf_size: *usize) errno_t;

    pub extern "wasi_snapshot_preview1" fn clock_res_get(clock_id: clockid_t, resolution: *timestamp_t) errno_t;
    pub extern "wasi_snapshot_preview1" fn clock_time_get(clock_id: clockid_t, precision: timestamp_t, timestamp: *timestamp_t) errno_t;

    pub extern "wasi_snapshot_preview1" fn environ_get(environ: [*][*:0]u8, environ_buf: [*]u8) errno_t;
    pub extern "wasi_snapshot_preview1" fn environ_sizes_get(environ_count: *usize, environ_buf_size: *usize) errno_t;

    pub extern "wasi_snapshot_preview1" fn fd_advise(fd: fd_t, offset: filesize_t, len: filesize_t, advice: advice_t) errno_t;
    pub extern "wasi_snapshot_preview1" fn fd_allocate(fd: fd_t, offset: filesize_t, len: filesize_t) errno_t;
    pub extern "wasi_snapshot_preview1" fn fd_close(fd: fd_t) errno_t;
    pub extern "wasi_snapshot_preview1" fn fd_datasync(fd: fd_t) errno_t;
    pub extern "wasi_snapshot_preview1" fn fd_pread(fd: fd_t, iovs: [*]const iovec_t, iovs_len: usize, offset: filesize_t, nread: *usize) errno_t;
    pub extern "wasi_snapshot_preview1" fn fd_pwrite(fd: fd_t, iovs: [*]const ciovec_t, iovs_len: usize, offset: filesize_t, nwritten: *usize) errno_t;
    pub extern "wasi_snapshot_preview1" fn fd_read(fd: fd_t, iovs: [*]const iovec_t, iovs_len: usize, nread: *usize) errno_t;
    pub extern "wasi_snapshot_preview1" fn fd_readdir(fd: fd_t, buf: [*]u8, buf_len: usize, cookie: dircookie_t, bufused: *usize) errno_t;
    pub extern "wasi_snapshot_preview1" fn fd_renumber(from: fd_t, to: fd_t) errno_t;
    pub extern "wasi_snapshot_preview1" fn fd_seek(fd: fd_t, offset: filedelta_t, whence: whence_t, newoffset: *filesize_t) errno_t;
    pub extern "wasi_snapshot_preview1" fn fd_sync(fd: fd_t) errno_t;
    pub extern "wasi_snapshot_preview1" fn fd_tell(fd: fd_t, newoffset: *filesize_t) errno_t;
    pub extern "wasi_snapshot_preview1" fn fd_write(fd: fd_t, iovs: [*]const ciovec_t, iovs_len: usize, nwritten: *usize) errno_t;

    pub extern "wasi_snapshot_preview1" fn fd_fdstat_get(fd: fd_t, buf: *fdstat_t) errno_t;
    pub extern "wasi_snapshot_preview1" fn fd_fdstat_set_flags(fd: fd_t, flags: fdflags_t) errno_t;
    pub extern "wasi_snapshot_preview1" fn fd_fdstat_set_rights(fd: fd_t, fs_rights_base: rights_t, fs_rights_inheriting: rights_t) errno_t;

    pub extern "wasi_snapshot_preview1" fn fd_filestat_get(fd: fd_t, buf: *filestat_t) errno_t;
    pub extern "wasi_snapshot_preview1" fn fd_filestat_set_size(fd: fd_t, st_size: filesize_t) errno_t;
    pub extern "wasi_snapshot_preview1" fn fd_filestat_set_times(fd: fd_t, st_atim: timestamp_t, st_mtim: timestamp_t, fstflags: fstflags_t) errno_t;

    pub extern "wasi_snapshot_preview1" fn fd_prestat_get(fd: fd_t, buf: *prestat_t) errno_t;
    pub extern "wasi_snapshot_preview1" fn fd_prestat_dir_name(fd: fd_t, path: [*]u8, path_len: usize) errno_t;

    pub extern "wasi_snapshot_preview1" fn path_create_directory(fd: fd_t, path: [*]const u8, path_len: usize) errno_t;
    pub extern "wasi_snapshot_preview1" fn path_filestat_get(fd: fd_t, flags: lookupflags_t, path: [*]const u8, path_len: usize, buf: *filestat_t) errno_t;
    pub extern "wasi_snapshot_preview1" fn path_filestat_set_times(fd: fd_t, flags: lookupflags_t, path: [*]const u8, path_len: usize, st_atim: timestamp_t, st_mtim: timestamp_t, fstflags: fstflags_t) errno_t;
    pub extern "wasi_snapshot_preview1" fn path_link(old_fd: fd_t, old_flags: lookupflags_t, old_path: [*]const u8, old_path_len: usize, new_fd: fd_t, new_path: [*]const u8, new_path_len: usize) errno_t;
    pub extern "wasi_snapshot_preview1" fn path_open(dirfd: fd_t, dirflags: lookupflags_t, path: [*]const u8, path_len: usize, oflags: oflags_t, fs_rights_base: rights_t, fs_rights_inheriting: rights_t, fs_flags: fdflags_t, fd: *fd_t) errno_t;
    pub extern "wasi_snapshot_preview1" fn path_readlink(fd: fd_t, path: [*]const u8, path_len: usize, buf: [*]u8, buf_len: usize, bufused: *usize) errno_t;
    pub extern "wasi_snapshot_preview1" fn path_remove_directory(fd: fd_t, path: [*]const u8, path_len: usize) errno_t;
    pub extern "wasi_snapshot_preview1" fn path_rename(old_fd: fd_t, old_path: [*]const u8, old_path_len: usize, new_fd: fd_t, new_path: [*]const u8, new_path_len: usize) errno_t;
    pub extern "wasi_snapshot_preview1" fn path_symlink(old_path: [*]const u8, old_path_len: usize, fd: fd_t, new_path: [*]const u8, new_path_len: usize) errno_t;
    pub extern "wasi_snapshot_preview1" fn path_unlink_file(fd: fd_t, path: [*]const u8, path_len: usize) errno_t;

    pub extern "wasi_snapshot_preview1" fn poll_oneoff(in: *const subscription_t, out: *event_t, nsubscriptions: usize, nevents: *usize) errno_t;

    pub extern "wasi_snapshot_preview1" fn proc_exit(rval: exitcode_t) noreturn;

    pub extern "wasi_snapshot_preview1" fn random_get(buf: [*]u8, buf_len: usize) errno_t;

    pub extern "wasi_snapshot_preview1" fn sched_yield() errno_t;

    pub extern "wasi_snapshot_preview1" fn sock_accept(sock: fd_t, flags: fdflags_t, result_fd: *fd_t) errno_t;
    pub extern "wasi_snapshot_preview1" fn sock_recv(sock: fd_t, ri_data: [*]iovec_t, ri_data_len: usize, ri_flags: riflags_t, ro_datalen: *usize, ro_flags: *roflags_t) errno_t;
    pub extern "wasi_snapshot_preview1" fn sock_send(sock: fd_t, si_data: [*]const ciovec_t, si_data_len: usize, si_flags: siflags_t, so_datalen: *usize) errno_t;
    pub extern "wasi_snapshot_preview1" fn sock_shutdown(sock: fd_t, how: sdflags_t) errno_t;

    // As defined in the wasi_snapshot_preview1 spec file:

    // https://github.com/WebAssembly/WASI/blob/master/phases/snapshot/witx/typenames.witx

    pub const advice_t = enum(u8) {
        NORMAL = 0,
        SEQUENTIAL = 1,
        RANDOM = 2,
        WILLNEED = 3,
        DONTNEED = 4,
        NOREUSE = 5,
    };

    pub const clockid_t = enum(u32) {
        REALTIME = 0,
        MONOTONIC = 1,
        PROCESS_CPUTIME_ID = 2,
        THREAD_CPUTIME_ID = 3,
    };

    pub const device_t = u64;

    pub const dircookie_t = u64;
    pub const DIRCOOKIE_START: dircookie_t = 0;

    pub const dirnamlen_t = u32;

    pub const dirent_t = extern struct {
        next: dircookie_t,
        ino: inode_t,
        namlen: dirnamlen_t,
        type: filetype_t,
    };

    pub const errno_t = enum(u16) {
        SUCCESS = 0,
        @"2BIG" = 1,
        ACCES = 2,
        ADDRINUSE = 3,
        ADDRNOTAVAIL = 4,
        AFNOSUPPORT = 5,
        /// This is also the error code used for `WOULDBLOCK`.
        AGAIN = 6,
        ALREADY = 7,
        BADF = 8,
        BADMSG = 9,
        BUSY = 10,
        CANCELED = 11,
        CHILD = 12,
        CONNABORTED = 13,
        CONNREFUSED = 14,
        CONNRESET = 15,
        DEADLK = 16,
        DESTADDRREQ = 17,
        DOM = 18,
        DQUOT = 19,
        EXIST = 20,
        FAULT = 21,
        FBIG = 22,
        HOSTUNREACH = 23,
        IDRM = 24,
        ILSEQ = 25,
        INPROGRESS = 26,
        INTR = 27,
        INVAL = 28,
        IO = 29,
        ISCONN = 30,
        ISDIR = 31,
        LOOP = 32,
        MFILE = 33,
        MLINK = 34,
        MSGSIZE = 35,
        MULTIHOP = 36,
        NAMETOOLONG = 37,
        NETDOWN = 38,
        NETRESET = 39,
        NETUNREACH = 40,
        NFILE = 41,
        NOBUFS = 42,
        NODEV = 43,
        NOENT = 44,
        NOEXEC = 45,
        NOLCK = 46,
        NOLINK = 47,
        NOMEM = 48,
        NOMSG = 49,
        NOPROTOOPT = 50,
        NOSPC = 51,
        NOSYS = 52,
        NOTCONN = 53,
        NOTDIR = 54,
        NOTEMPTY = 55,
        NOTRECOVERABLE = 56,
        NOTSOCK = 57,
        /// This is also the code used for `NOTSUP`.
        OPNOTSUPP = 58,
        NOTTY = 59,
        NXIO = 60,
        OVERFLOW = 61,
        OWNERDEAD = 62,
        PERM = 63,
        PIPE = 64,
        PROTO = 65,
        PROTONOSUPPORT = 66,
        PROTOTYPE = 67,
        RANGE = 68,
        ROFS = 69,
        SPIPE = 70,
        SRCH = 71,
        STALE = 72,
        TIMEDOUT = 73,
        TXTBSY = 74,
        XDEV = 75,
        NOTCAPABLE = 76,
        _,
    };

    pub const event_t = extern struct {
        userdata: userdata_t,
        @"error": errno_t,
        type: eventtype_t,
        fd_readwrite: eventfdreadwrite_t,
    };

    pub const eventfdreadwrite_t = extern struct {
        nbytes: filesize_t,
        flags: eventrwflags_t,
    };

    pub const eventrwflags_t = u16;
    pub const EVENT_FD_READWRITE_HANGUP: eventrwflags_t = 0x0001;

    pub const eventtype_t = enum(u8) {
        CLOCK = 0,
        FD_READ = 1,
        FD_WRITE = 2,
    };

    pub const exitcode_t = u32;

    pub const fd_t = i32;

    pub const fdflags_t = packed struct(u16) {
        APPEND: bool = false,
        DSYNC: bool = false,
        NONBLOCK: bool = false,
        RSYNC: bool = false,
        SYNC: bool = false,
        _: u11 = 0,
    };

    pub const fdstat_t = extern struct {
        fs_filetype: filetype_t,
        fs_flags: fdflags_t,
        fs_rights_base: rights_t,
        fs_rights_inheriting: rights_t,
    };

    pub const filedelta_t = i64;

    pub const filesize_t = u64;

    pub const filestat_t = extern struct {
        dev: device_t,
        ino: inode_t,
        filetype: filetype_t,
        nlink: linkcount_t,
        size: filesize_t,
        atim: timestamp_t,
        mtim: timestamp_t,
        ctim: timestamp_t,
    };

    pub const filetype_t = enum(u8) {
        UNKNOWN,
        BLOCK_DEVICE,
        CHARACTER_DEVICE,
        DIRECTORY,
        REGULAR_FILE,
        SOCKET_DGRAM,
        SOCKET_STREAM,
        SYMBOLIC_LINK,
        _,
    };

    pub const fstflags_t = packed struct(u16) {
        ATIM: bool = false,
        ATIM_NOW: bool = false,
        MTIM: bool = false,
        MTIM_NOW: bool = false,
        _: u12 = 0,
    };

    pub const inode_t = u64;

    pub const linkcount_t = u64;

    pub const lookupflags_t = packed struct(u32) {
        SYMLINK_FOLLOW: bool = false,
        _: u31 = 0,
    };

    pub const oflags_t = packed struct(u16) {
        CREAT: bool = false,
        DIRECTORY: bool = false,
        EXCL: bool = false,
        TRUNC: bool = false,
        _: u12 = 0,
    };

    pub const preopentype_t = u8;
    pub const PREOPENTYPE_DIR: preopentype_t = 0;

    pub const prestat_t = extern struct {
        pr_type: preopentype_t,
        u: prestat_u_t,
    };

    pub const prestat_dir_t = extern struct {
        pr_name_len: usize,
    };

    pub const prestat_u_t = extern union {
        dir: prestat_dir_t,
    };

    pub const riflags_t = u16;
    pub const roflags_t = u16;

    pub const SOCK = struct {
        pub const RECV_PEEK: riflags_t = 0x0001;
        pub const RECV_WAITALL: riflags_t = 0x0002;

        pub const RECV_DATA_TRUNCATED: roflags_t = 0x0001;
    };

    pub const rights_t = packed struct(u64) {
        FD_DATASYNC: bool = false,
        FD_READ: bool = false,
        FD_SEEK: bool = false,
        FD_FDSTAT_SET_FLAGS: bool = false,
        FD_SYNC: bool = false,
        FD_TELL: bool = false,
        FD_WRITE: bool = false,
        FD_ADVISE: bool = false,
        FD_ALLOCATE: bool = false,
        PATH_CREATE_DIRECTORY: bool = false,
        PATH_CREATE_FILE: bool = false,
        PATH_LINK_SOURCE: bool = false,
        PATH_LINK_TARGET: bool = false,
        PATH_OPEN: bool = false,
        FD_READDIR: bool = false,
        PATH_READLINK: bool = false,
        PATH_RENAME_SOURCE: bool = false,
        PATH_RENAME_TARGET: bool = false,
        PATH_FILESTAT_GET: bool = false,
        PATH_FILESTAT_SET_SIZE: bool = false,
        PATH_FILESTAT_SET_TIMES: bool = false,
        FD_FILESTAT_GET: bool = false,
        FD_FILESTAT_SET_SIZE: bool = false,
        FD_FILESTAT_SET_TIMES: bool = false,
        PATH_SYMLINK: bool = false,
        PATH_REMOVE_DIRECTORY: bool = false,
        PATH_UNLINK_FILE: bool = false,
        POLL_FD_READWRITE: bool = false,
        SOCK_SHUTDOWN: bool = false,
        SOCK_ACCEPT: bool = false,
        _: u34 = 0,
    };

    pub const sdflags_t = packed struct(u8) {
        RD: bool = false,
        WR: bool = false,
        _: u6 = 0,
    };

    pub const siflags_t = u16;

    pub const signal_t = enum(u8) {
        NONE = 0,
        HUP = 1,
        INT = 2,
        QUIT = 3,
        ILL = 4,
        TRAP = 5,
        ABRT = 6,
        BUS = 7,
        FPE = 8,
        KILL = 9,
        USR1 = 10,
        SEGV = 11,
        USR2 = 12,
        PIPE = 13,
        ALRM = 14,
        TERM = 15,
        CHLD = 16,
        CONT = 17,
        STOP = 18,
        TSTP = 19,
        TTIN = 20,
        TTOU = 21,
        URG = 22,
        XCPU = 23,
        XFSZ = 24,
        VTALRM = 25,
        PROF = 26,
        WINCH = 27,
        POLL = 28,
        PWR = 29,
        SYS = 30,
    };

    pub const subclockflags_t = u16;
    pub const SUBSCRIPTION_CLOCK_ABSTIME: subclockflags_t = 0x0001;

    pub const subscription_t = extern struct {
        userdata: userdata_t,
        u: subscription_u_t,
    };

    pub const subscription_clock_t = extern struct {
        id: clockid_t,
        timeout: timestamp_t,
        precision: timestamp_t,
        flags: subclockflags_t,
    };

    pub const subscription_fd_readwrite_t = extern struct {
        fd: fd_t,
    };

    pub const subscription_u_t = extern struct {
        tag: eventtype_t,
        u: subscription_u_u_t,
    };

    pub const subscription_u_u_t = extern union {
        clock: subscription_clock_t,
        fd_read: subscription_fd_readwrite_t,
        fd_write: subscription_fd_readwrite_t,
    };

    /// Nanoseconds.
    pub const timestamp_t = u64;

    pub const userdata_t = u64;

    pub const whence_t = enum(u8) { SET, CUR, END };