From 96dc211c5d4f477f83b71d33c44271ca18137a06 Mon Sep 17 00:00:00 2001 From: dcode Date: Wed, 27 Mar 2019 22:05:14 +0100 Subject: [PATCH] make it wasi_unstable --- std/assembly/bindings/wasi.ts | 682 +------------------------ std/assembly/bindings/wasi_unstable.ts | 681 ++++++++++++++++++++++++ 2 files changed, 682 insertions(+), 681 deletions(-) create mode 100644 std/assembly/bindings/wasi_unstable.ts diff --git a/std/assembly/bindings/wasi.ts b/std/assembly/bindings/wasi.ts index 2d5255ee..c6bd75e9 100644 --- a/std/assembly/bindings/wasi.ts +++ b/std/assembly/bindings/wasi.ts @@ -1,681 +1 @@ -// see: https://github.com/CraneStation/wasmtime/blob/master/docs/WASI-api.md - -/* tslint:disable:max-line-length */ - -/** Read command-line argument data. */ -export declare function args_get(argv: uintptr_t, argv_buf: uintptr_t): errno; -/** Return command-line argument data sizes. */ -export declare function args_sizes_get(argc: uintptr_t, argv_buf_size_ptr: uintptr_t): errno; - -/** Return the resolution of a clock. */ -export declare function clock_res_get(clock: clockid, resolution: uintptr_t): errno; -/** Return the time value of a clock. */ -export declare function clock_time_get(clock: clockid, precision: timestamp_t, time: uintptr_t): errno; - -/** Read environment variable data. */ -export declare function environ_get(environ: uintptr_t, environ_buf: uintptr_t): errno; -/** Return command-line argument data sizes. */ -export declare function environ_sizes_get(environ_count: uintptr_t, environ_buf_size: uintptr_t): errno; - -/** Provide file advisory information on a file descriptor. */ -export declare function fd_advise(fd: fd_t, offset: filesize_t, len: filesize_t, advice: advice): errno; -/** Provide file advisory information on a file descriptor. */ -export declare function fd_allocate(fd: fd_t, offset: filesize_t, len: filesize_t): errno; -/** Close a file descriptor. */ -export declare function fd_close(fd: fd_t): errno; -/** Synchronize the data of a file to disk. */ -export declare function fd_datasync(fd: fd_t): errno; -/** Get the attributes of a file descriptor. */ -export declare function fd_fdstat_get(fd: fd_t, buf: uintptr_t): errno; -/** Adjust the flags associated with a file descriptor. */ -export declare function fd_fdstat_set_flags(fd: fd_t, flags: fdflags): errno; -/** Adjust the rights associated with a file descriptor. */ -export declare function fd_fdstat_set_rights(fd: fd_t, fs_rights_base: rights, fs_rights_inheriting: rights): errno; -/** Return the attributes of an open file. */ -export declare function fd_filestat_get(fd: fd_t, buf: uintptr_t): errno; -/** Adjust the size of an open file. If this increases the file's size, the extra bytes are filled with zeros. */ -export declare function fd_filestat_set_size(fd: fd_t, size: filesize_t): errno; -/** Adjust the timestamps of an open file or directory. */ -export declare function fd_filestat_set_times(fd: fd_t, st_atim: timestamp_t, st_mtim: timestamp_t, fstflags: fstflags): errno; -/** Read from a file descriptor, without using and updating the file descriptor's offset. */ -export declare function fd_pread(fd: fd_t, iovs: uintptr_t, iovs_len: size_t, offset: filesize_t, nread: uintptr_t): errno; -/** Return a description of the given preopened file descriptor. */ -export declare function fd_prestat_get(fd: fd_t, buf: uintptr_t): errno; -/** Return a description of the given preopened file descriptor. */ -export declare function fd_prestat_dir_name(fd: fd_t, path: uintptr_t, path_len: size_t): errno; -/** Write to a file descriptor, without using and updating the file descriptor's offset. */ -export declare function fd_pwrite(fd: fd_t, iovs: uintptr_t, iovs_len: size_t, offset: filesize_t, nwritten: uintptr_t): errno; -/** Read from a file descriptor. */ -export declare function fd_read(fd: fd_t, iovs: uintptr_t, iovs_len: size_t, nread: uintptr_t): errno; -/** Read directory entries from a directory. */ -export declare function fd_readdir(fd: fd_t, buf: uintptr_t, buf_len: size_t, cookie: dircookie_t, buf_used: uintptr_t): errno; -/** Atomically replace a file descriptor by renumbering another file descriptor. */ -export declare function fd_renumber(from: fd_t, to: fd_t): errno; -/** Move the offset of a file descriptor. */ -export declare function fd_seek(fd: fd_t, offset: filedelta_t, whence: whence, newoffset: uintptr_t): errno; -/** Synchronize the data and metadata of a file to disk. */ -export declare function fd_sync(fd: fd_t): errno; -/** Return the current offset of a file descriptor. */ -export declare function fd_tell(fd: fd_t, newoffset: uintptr_t): errno; -/** Write to a file descriptor. */ -export declare function fd_write(fd: fd_t, iovs: uintptr_t, iovs_len: size_t, nwritten: uintptr_t): errno; - -/* Create a directory. */ -export declare function path_create_directory(fd: fd_t, path: uintptr_t, path_len: size_t): errno; -/** Return the attributes of a file or directory. */ -export declare function path_filestat_get(fd: fd_t, flags: lookupflags, path: uintptr_t, path_len: size_t, buf: uintptr_t): errno; -/** Adjust the timestamps of a file or directory. */ -export declare function path_filestat_set_times(fd: fd_t, flags: lookupflags, path: uintptr_t, path_len: size_t, st_atim: timestamp_t, st_mtim: timestamp_t, fstflags: fstflags): errno; -/** Create a hard link. */ -export declare function path_link(fd0: fd_t, flags0: lookupflags, path0: uintptr_t, path_len0: size_t, fd1: fd_t, path1: uintptr_t, path_len: size_t): errno; -/** Open a file or directory. */ -export declare function path_open(dirfd: fd_t, dirflags: lookupflags, path: uintptr_t, path_len: size_t, oflags: oflags, fs_rights_base: rights, fs_rights_inheriting: rights, fs_flags: fdflags, fd: fd_t): errno; -/** Read the contents of a symbolic link. */ -export declare function path_readlink(fd: fd_t, path: uintptr_t, path_len: size_t, buf: uintptr_t, buf_len: size_t, buf_used: uintptr_t): errno; -/** Remove a directory. */ -export declare function path_remove_directory(fd: fd_t, path: uintptr_t, path_len: size_t): errno; -/** Rename a file or directory. */ -export declare function path_rename(fd0: fd_t, path0: uintptr_t, path_len0: size_t, fd1: fd_t, path1: uintptr_t, path_len1: size_t): errno; -/** Create a symbolic link. */ -export declare function path_symlink(path0: uintptr_t, path_len0: size_t, fd: fd_t, path1: uintptr_t, path_len1: size_t): errno; -/** Unlink a file. */ -export declare function path_unlink_file(fd: fd_t, path: uintptr_t, path_len: size_t): errno; - -/** Concurrently poll for the occurrence of a set of events. */ -export declare function poll_oneoff(in_: uintptr_t, out: uintptr_t, nsubscriptions: size_t, nevents: uintptr_t): errno; - -/** Terminate the process normally. An exit code of 0 indicates successful termination of the program. The meanings of other values is dependent on the environment. */ -export declare function proc_exit(rval: u32): void; -/** Send a signal to the process of the calling thread. */ -export declare function proc_raise(sig: signal): errno; - -/** Write high-quality random data into a buffer. */ -export declare function random_get(buf: uintptr_t, buf_len: size_t): errno; - -/** Temporarily yield execution of the calling thread. */ -export declare function sched_yield(): errno; - -/** Receive a message from a socket. */ -export declare function sock_recv(sock: fd_t, ri_data: uintptr_t, ri_data_len: size_t, ri_flags: riflags, ro_datalen: uintptr_t, ro_flags: roflags): errno; -/** Send a message on a socket. */ -export declare function sock_send(sock: fd_t, si_data: uintptr_t, si_data_len: size_t, si_flags: siflags, so_datalen: uintptr_t): errno; -/** Shut down socket send and receive channels. */ -export declare function sock_shutdown(sock: fd_t, how: sdflags): errno; - -// === Types ====================================================================================== - -/** File or memory access pattern advisory information. */ -export const enum advice { - /** The application has no advice to give on its behavior with respect to the specified data. */ - NORMAL = 0, - /** The application expects to access the specified data sequentially from lower offsets to higher offsets. */ - SEQUENTIAL = 1, - /** The application expects to access the specified data in a random order. */ - RANDOM = 2, - /** The application expects to access the specified data in the near future. */ - WILLNEED = 3, - /** The application expects that it will not access the specified data in the near future. */ - DONTNEED = 4, - /** The application expects to access the specified data once and then not reuse it thereafter. */ - NOREUSE = 5 -} -export type advice_t = u8; - -/** Identifiers for clocks. */ -export const enum clockid { - /** The clock measuring real time. Time value zero corresponds with 1970-01-01T00:00:00Z. */ - REALTIME = 0, - /** The store-wide monotonic clock. Absolute value has no meaning. */ - MONOTONIC = 1, - /** The CPU-time clock associated with the current process. */ - PROCESS_CPUTIME_ID = 2, - /** The CPU-time clock associated with the current thread. */ - THREAD_CPUTIME_ID = 3 -} -export type clockid_t = u32; - -/** Identifier for a device containing a file system. Can be used in combination with `inode` to uniquely identify a file or directory in the filesystem. */ -export type device_t = u64; - -/** A reference to the offset of a directory entry. */ -export type dircookie_t = u64; - -/** A directory entry. */ -@unmanaged export class dirent { - /** The offset of the next directory entry stored in this directory. */ - next: dircookie_t; - /** The serial number of the file referred to by this directory entry. */ - ino: inode_t; - /** The length of the name of the directory entry. */ - namlen: u32; - /** The type of the file referred to by this directory entry. */ - type: filetype_t; -} - -/** Error codes returned by functions. */ -export const enum errno { - /** No error occurred. System call completed successfully. */ - SUCCESS = 0, - /** Argument list too long. */ - TOOBIG = 1, - /** Permission denied. */ - ACCES = 2, - /** Address in use. */ - ADDRINUSE = 3, - /** Address not available. */ - ADDRNOTAVAIL = 4, - /** Address family not supported. */ - AFNOSUPPORT = 5, - /** Resource unavailable, or operation would block. */ - AGAIN = 6, - /** Connection already in progress. */ - ALREADY = 7, - /** Bad file descriptor. */ - BADF = 8, - /** Bad message. */ - BADMSG = 9, - /** Device or resource busy. */ - BUSY = 10, - /** Operation canceled. */ - CANCELED = 11, - /** No child processes. */ - CHILD = 12, - /** Connection aborted. */ - CONNABORTED = 13, - /** Connection refused. */ - CONNREFUSED = 14, - /** Connection reset. */ - CONNRESET = 15, - /** Resource deadlock would occur. */ - DEADLK = 16, - /** Destination address required. */ - DESTADDRREQ = 17, - /** Mathematics argument out of domain of function. */ - DOM = 18, - /** Reserved. */ - DQUOT = 19, - /** File exists. */ - EXIST = 20, - /** Bad address. */ - FAULT = 21, - /** File too large. */ - FBIG = 22, - /** Host is unreachable. */ - HOSTUNREACH = 23, - /** Identifier removed. */ - IDRM = 24, - /** Illegal byte sequence. */ - ILSEQ = 25, - /** Operation in progress. */ - INPROGRESS = 26, - /** Interrupted function. */ - INTR = 27, - /** Invalid argument. */ - INVAL = 28, - /** I/O error. */ - IO = 29, - /** Socket is connected. */ - ISCONN = 30, - /** Is a directory. */ - ISDIR = 31, - /** Too many levels of symbolic links. */ - LOOP = 32, - /** File descriptor value too large. */ - MFILE = 33, - /** Too many links. */ - MLINK = 34, - /** Message too large. */ - MSGSIZE = 35, - /** Reserved. */ - MULTIHOP = 36, - /** Filename too long. */ - NAMETOOLONG = 37, - /** Network is down. */ - NETDOWN = 38, - /** Connection aborted by network. */ - NETRESET = 39, - /** Network unreachable. */ - NETUNREACH = 40, - /** Too many files open in system. */ - NFILE = 41, - /** No buffer space available. */ - NOBUFS = 42, - /** No such device. */ - NODEV = 43, - /** No such file or directory. */ - NOENT = 44, - /** Executable file format error. */ - NOEXEC = 45, - /** No locks available. */ - NOLCK = 46, - /** Reserved. */ - NOLINK = 47, - /** Not enough space. */ - NOMEM = 48, - /** No message of the desired type. */ - NOMSG = 49, - /** Protocol not available. */ - NOPROTOOPT = 50, - /** No space left on device. */ - NOSPC = 51, - /** Function not supported. */ - NOSYS = 52, - /** The socket is not connected. */ - NOTCONN = 53, - /** Not a directory or a symbolic link to a directory. */ - NOTDIR = 54, - /** Directory not empty. */ - NOTEMPTY = 55, - /** State not recoverable. */ - NOTRECOVERABLE = 56, - /** Not a socket. */ - NOTSOCK = 57, - /** Not supported, or operation not supported on socket. */ - NOTSUP = 58, - /** Inappropriate I/O control operation. */ - NOTTY = 59, - /** No such device or address. */ - NXIO = 60, - /** Value too large to be stored in data type. */ - OVERFLOW = 61, - /** Previous owner died. */ - OWNERDEAD = 62, - /** Operation not permitted. */ - PERM = 63, - /** Broken pipe. */ - PIPE = 64, - /** Protocol error. */ - PROTO = 65, - /** Protocol not supported. */ - PROTONOSUPPORT = 66, - /** Protocol wrong type for socket. */ - PROTOTYPE = 67, - /** Result too large. */ - RANGE = 68, - /** Read-only file system. */ - ROFS = 69, - /** Invalid seek. */ - SPIPE = 70, - /** No such process. */ - SRCH = 71, - /** Reserved. */ - STALE = 72, - /** Connection timed out. */ - TIMEDOUT = 73, - /** Text file busy. */ - TXTBSY = 74, - /** Cross-device link. */ - XDEV = 75, - /** Extension: Capabilities insufficient. */ - NOTCAPABLE = 76 -} -export type errno_t = u16; - -/** An event that occurred. */ -@unmanaged export class event { - userdata: userdata_t; - error: errno_t; - type: eventtype_t; -} - -/** An event that occurred when type is `eventtype.FD_READ` or `eventtype.FD_WRITE`. */ -@unmanaged export class rwevent extends event { - nbytes: filesize_t; - flags: eventrwflags_t; -} - -/** The state of the file descriptor subscribed to with `eventtype.FD_READ` or `eventtype.FD_WRITE`. */ -export const enum eventrwflags { - /** The peer of this socket has closed or disconnected. */ - HANGUP = 1 -} -export type eventrwflags_t = u16; - -/** Type of a subscription to an event or its occurrence. */ -export const enum eventtype { - /** The time value of clock has reached the timestamp. */ - CLOCK = 0, - /** File descriptor has data available for reading. */ - FD_READ = 1, - /** File descriptor has capacity available for writing */ - FD_WRITE = 2 -} -export type eventtype_t = u8; - -/** Exit code generated by a process when exiting. */ -export type exitcode_t = u32; - -/** A file descriptor number. */ -export type fd_t = u32; - -/** File descriptor flags. */ -export const enum fdflags { - /** Append mode: Data written to the file is always appended to the file's end. */ - APPEND = 1, - /** Write according to synchronized I/O data integrity completion. Only the data stored in the file is synchronized. */ - DSYNC = 2, - /** Non-blocking mode. */ - NONBLOCK = 4, - /** Synchronized read I/O operations. */ - RSYNC = 8, - /** Write according to synchronized I/O file integrity completion. */ - SYNC = 16 -} -export type fdflags_t = u16; - -/** File descriptor attributes. */ -@unmanaged export class fdstat { - /** File type. */ - filetype: filetype_t; - /** File descriptor flags. */ - flags: fdflags_t; - /** Rights that apply to this file descriptor. */ - rights_base: rights_t; - /** Maximum set of rights that may be installed on new file descriptors that are created through this file descriptor, e.g., through `path_open`. */ - rights_inheriting: rights_t; -} - -/** Relative offset within a file. */ -export type filedelta_t = i64; - -/** Non-negative file size or length of a region within a file. */ -export type filesize_t = u64; - -/** File attributes. */ -@unmanaged export class filestat { - /** Device ID of device containing the file. */ - dev: device_t; - /** File serial number. */ - ino: inode_t; - /** File type. */ - filetype: filetype_t; - /** Number of hard links to the file. */ - nlink: linkcount_t; - /** For regular files, the file size in bytes. For symbolic links, the length in bytes of the pathname contained in the symbolic link. */ - size: filesize_t; - /** Last data access timestamp. */ - atim: timestamp_t; - /** Last data modification timestamp. */ - mtim: timestamp_t; - /** Last file status change timestamp. */ - ctim: timestamp_t; -} - -/** The type of a file descriptor or file. */ -export const enum filetype { - /** The type of the file descriptor or file is unknown or is different from any of the other types specified. */ - UNKNOWN = 0, - /** The file descriptor or file refers to a block device inode. */ - BLOCK_DEVICE = 1, - /** The file descriptor or file refers to a character device inode. */ - CHARACTER_DEVICE = 2, - /** The file descriptor or file refers to a directory inode. */ - DIRECTORY = 3, - /** The file descriptor or file refers to a regular file inode. */ - REGULAR_FILE = 4, - /** The file descriptor or file refers to a datagram socket. */ - SOCKET_DGRAM = 5, - /** The file descriptor or file refers to a byte-stream socket. */ - SOCKET_STREAM = 6, - /** The file refers to a symbolic link inode. */ - SYMBOLIC_LINK = 7 -} -export type filetype_t = u8; - -/** Which file time attributes to adjust. */ -export const enum fstflags { - /** Adjust the last data access timestamp to the value stored in `filestat#st_atim`. */ - SET_ATIM = 1, - /** Adjust the last data access timestamp to the time of clock `clockid.REALTIME`. */ - SET_ATIM_NOW = 2, - /** Adjust the last data modification timestamp to the value stored in `filestat#st_mtim`. */ - SET_MTIM = 4, - /** Adjust the last data modification timestamp to the time of clock `clockid.REALTIME`. */ - SET_MTIM_NOW = 8 -} -export type fstflags_t = u16; - -/** File serial number that is unique within its file system. */ -export type inode_t = u64; - -/** A region of memory for scatter/gather reads. */ -@unmanaged export class iovec { - /** The address of the buffer to be filled. */ - buf: uintptr_t; - /** The length of the buffer to be filled. */ - buf_len: size_t; -} - -/** Number of hard links to an inode. */ -export type linkcount_t = u32; - -/** Flags determining the method of how paths are resolved. */ -export const enum lookupflags { - /** As long as the resolved path corresponds to a symbolic link, it is expanded. */ - SYMLINK_FOLLOW = 1 -} -export type lookupflags_t = u32; - -/** Open flags. */ -export const enum oflags { - /** Create file if it does not exist. */ - CREAT = 1, - /** Fail if not a directory. */ - DIRECTORY = 2, - /** Fail if file already exists. */ - EXCL = 4, - /** Truncate file to size 0. */ - TRUNC = 8 -} -export type oflags_t = u16; - -/** Flags provided to `sock_recv`. */ -export const enum riflags { - /** Returns the message without removing it from the socket's receive queue. */ - PEEK = 1, - /** On byte-stream sockets, block until the full amount of data can be returned. */ - WAITALL = 2 -} -export type riflags_t = u16; - -/** File descriptor rights, determining which actions may be performed. */ -export const enum rights { - /** The right to invoke `fd_datasync`. */ - FD_DATASYNC = 1, - /** The right to invoke `fd_read` and `sock_recv`. */ - FD_READ = 2, - /** The right to invoke `fd_seek`. This flag implies `rights.FD_TELL`. */ - FD_SEEK = 4, - /** The right to invoke `fd_fdstat_set_flags`. */ - FD_FDSTAT_SET_FLAGS = 8, - /** The right to invoke `fd_sync`. */ - FD_SYNC = 16, - /** The right to invoke `fd_seek` in such a way that the file offset remains unaltered (i.e., `whence.CUR` with offset zero), or to invoke `fd_tell`). */ - FD_TELL = 32, - /** The right to invoke `fd_write` and `sock_send`. If `rights.FD_SEEK` is set, includes the right to invoke `fd_pwrite`. */ - FD_WRITE = 64, - /** The right to invoke `fd_advise`. */ - FD_ADVISE = 128, - /** The right to invoke `fd_allocate`. */ - FD_ALLOCATE = 256, - /** The right to invoke `path_create_directory`. */ - PATH_CREATE_DIRECTORY = 512, - /** If `rights.PATH_OPEN` is set, the right to invoke `path_open` with `oflags.CREAT`. */ - PATH_CREATE_FILE = 1024, - /** The right to invoke `path_link` with the file descriptor as the source directory. */ - PATH_LINK_SOURCE = 2048, - /** The right to invoke `path_link` with the file descriptor as the target directory. */ - PATH_LINK_TARGET = 4096, - /** The right to invoke `path_open`. */ - PATH_OPEN = 8192, - /** The right to invoke `fd_readdir`. */ - FD_READDIR = 16384, - /** The right to invoke `path_readlink`. */ - PATH_READLINK = 32768, - /** The right to invoke `path_rename` with the file descriptor as the source directory. */ - PATH_RENAME_SOURCE = 65536, - /** The right to invoke `path_rename` with the file descriptor as the target directory. */ - PATH_RENAME_TARGET = 131072, - /** The right to invoke `path_filestat_get`. */ - PATH_FILESTAT_GET = 262144, - /** The right to change a file's size (there is no `path_filestat_set_size`). If `rights.PATH_OPEN` is set, includes the right to invoke `path_open` with `oflags.TRUNC`. */ - PATH_FILESTAT_SET_SIZE = 524288, - /** The right to invoke `path_filestat_set_times`. */ - PATH_FILESTAT_SET_TIMES = 1048576, - /** The right to invoke `fd_filestat_get`. */ - FD_FILESTAT_GET = 2097152, - /** The right to invoke `fd_filestat_set_size`. */ - FD_FILESTAT_SET_SIZE = 4194304, - /** The right to invoke `fd_filestat_set_times`. */ - FD_FILESTAT_SET_TIMES = 8388608, - /** The right to invoke `path_symlink`. */ - RIGHT_PATH_SYMLINK = 16777216, - /** The right to invoke `path_remove_directory`. */ - PATH_REMOVE_DIRECTORY = 33554432, - /** The right to invoke `path_unlink_file`. */ - PATH_UNLINK_FILE = 67108864, - /** If `rights.FD_READ` is set, includes the right to invoke `poll_oneoff` to subscribe to `eventtype.FD_READ`. If `rights.FD_WRITE` is set, includes the right to invoke `poll_oneoff` to subscribe to `eventtype.FD_WRITE`. */ - POLL_FD_READWRITE = 134217728, - /** The right to invoke `sock_shutdown`. */ - SOCK_SHUTDOWN = 268435456 -} -export type rights_t = u64; - -/** Flags returned by `sock_recv`. */ -export const enum roflags { - /** Message data has been truncated. */ - DATA_TRUNCATED = 1 -} -export type roflags_t = u16; - -/** Which channels on a socket to shut down. */ -export const enum sdflags { - /** Disables further receive operations. */ - RD = 1, - /** Disables further send operations. */ - WR = 2 -} -export type sdflags_t = u8; - -/** Flags provided to `sock_send`. */ -export const enum siflags { - // As there are currently no flags defined, it must be set to zero. -} -export type siflags_t = u16; - -/** Signal condition. */ -export const enum signal { - /** Hangup. */ - HUP = 1, - /** Terminate interrupt signal. */ - INT = 2, - /** Terminal quit signal. */ - QUIT = 3, - /** Illegal instruction. */ - ILL = 4, - /** Trace/breakpoint trap. */ - TRAP = 5, - /** Process abort signal. */ - ABRT = 6, - /** Access to an undefined portion of a memory object. */ - BUS = 7, - /** Erroneous arithmetic operation. */ - FPE = 8, - /** Kill. */ - KILL = 9, - /** User-defined signal 1. */ - USR1 = 10, - /** Invalid memory reference. */ - SEGV = 11, - /** User-defined signal 2. */ - USR2 = 12, - /** Write on a pipe with no one to read it. */ - PIPE = 13, - /** Alarm clock. */ - ALRM = 14, - /** Termination signal. */ - TERM = 15, - /** Child process terminated, stopped, or continued. */ - CHLD = 16, - /** Continue executing, if stopped. */ - CONT = 17, - /** Stop executing. */ - STOP = 18, - /** Terminal stop signal. */ - TSTP = 19, - /** Background process attempting read. */ - TTIN = 20, - /** Background process attempting write. */ - TTOU = 21, - /** High bandwidth data is available at a socket. */ - URG = 22, - /** CPU time limit exceeded. */ - XCPU = 23, - /** File size limit exceeded. */ - XFSZ = 24, - /** Virtual timer expired. */ - VTALRM = 25, - PROF = 26, - WINCH = 27, - POLL = 28, - PWR = 29, - /** Bad system call. */ - SYS = 30 -} -export type signal_t = u8; - -/** Flags determining how to interpret the timestamp provided in `subscription_t::u.clock.timeout. */ -export const enum subclockflags { - /** If set, treat the timestamp provided in `clocksubscription` as an absolute timestamp. */ - ABSTIME = 1 -} -export type subclockflags_t = u16; - -/** Subscription to an event. */ -@unmanaged export class subscription { - /** User-provided value that is attached to the subscription. */ - userdata: userdata_t; - /** The type of the event to which to subscribe. */ - type: eventtype_t; -} - -/* Subscription to an event of type `eventtype.CLOCK`.**/ -@unmanaged export class clocksubscription extends subscription { - /** The user-defined unique identifier of the clock. */ - identifier: userdata_t; - /** The clock against which to compare the timestamp. */ - clock_id: clockid_t; - /** The absolute or relative timestamp. */ - timeout: timestamp_t; - /** The amount of time that the implementation may wait additionally to coalesce with other events. */ - precision: timestamp_t; - /** Flags specifying whether the timeout is absolute or relative. */ - flags: subclockflags_t; -} - -/* Subscription to an event of type `eventtype.FD_READ` or `eventtype.FD_WRITE`.**/ -@unmanaged export class fdsubscription extends subscription { - /** The file descriptor on which to wait for it to become ready for reading or writing. */ - fd_readwrite: fd_t; -} - -/** Timestamp in nanoseconds. */ -export type timestamp_t = u64; - -/** User-provided value that may be attached to objects that is retained when extracted from the implementation. */ -export type userdata_t = u64; - -/** The position relative to which to set the offset of the file descriptor. */ -export const enum whence { - /** Seek relative to current position. */ - CUR = 0, - /** Seek relative to end-of-file. */ - END = 1, - /** Seek relative to start-of-file. */ - SET = 2 -} -export type whence_t = u8; - -// glue -export type uintptr_t = usize; -export type size_t = usize; +export * from "./wasi_unstable"; diff --git a/std/assembly/bindings/wasi_unstable.ts b/std/assembly/bindings/wasi_unstable.ts new file mode 100644 index 00000000..2d5255ee --- /dev/null +++ b/std/assembly/bindings/wasi_unstable.ts @@ -0,0 +1,681 @@ +// see: https://github.com/CraneStation/wasmtime/blob/master/docs/WASI-api.md + +/* tslint:disable:max-line-length */ + +/** Read command-line argument data. */ +export declare function args_get(argv: uintptr_t, argv_buf: uintptr_t): errno; +/** Return command-line argument data sizes. */ +export declare function args_sizes_get(argc: uintptr_t, argv_buf_size_ptr: uintptr_t): errno; + +/** Return the resolution of a clock. */ +export declare function clock_res_get(clock: clockid, resolution: uintptr_t): errno; +/** Return the time value of a clock. */ +export declare function clock_time_get(clock: clockid, precision: timestamp_t, time: uintptr_t): errno; + +/** Read environment variable data. */ +export declare function environ_get(environ: uintptr_t, environ_buf: uintptr_t): errno; +/** Return command-line argument data sizes. */ +export declare function environ_sizes_get(environ_count: uintptr_t, environ_buf_size: uintptr_t): errno; + +/** Provide file advisory information on a file descriptor. */ +export declare function fd_advise(fd: fd_t, offset: filesize_t, len: filesize_t, advice: advice): errno; +/** Provide file advisory information on a file descriptor. */ +export declare function fd_allocate(fd: fd_t, offset: filesize_t, len: filesize_t): errno; +/** Close a file descriptor. */ +export declare function fd_close(fd: fd_t): errno; +/** Synchronize the data of a file to disk. */ +export declare function fd_datasync(fd: fd_t): errno; +/** Get the attributes of a file descriptor. */ +export declare function fd_fdstat_get(fd: fd_t, buf: uintptr_t): errno; +/** Adjust the flags associated with a file descriptor. */ +export declare function fd_fdstat_set_flags(fd: fd_t, flags: fdflags): errno; +/** Adjust the rights associated with a file descriptor. */ +export declare function fd_fdstat_set_rights(fd: fd_t, fs_rights_base: rights, fs_rights_inheriting: rights): errno; +/** Return the attributes of an open file. */ +export declare function fd_filestat_get(fd: fd_t, buf: uintptr_t): errno; +/** Adjust the size of an open file. If this increases the file's size, the extra bytes are filled with zeros. */ +export declare function fd_filestat_set_size(fd: fd_t, size: filesize_t): errno; +/** Adjust the timestamps of an open file or directory. */ +export declare function fd_filestat_set_times(fd: fd_t, st_atim: timestamp_t, st_mtim: timestamp_t, fstflags: fstflags): errno; +/** Read from a file descriptor, without using and updating the file descriptor's offset. */ +export declare function fd_pread(fd: fd_t, iovs: uintptr_t, iovs_len: size_t, offset: filesize_t, nread: uintptr_t): errno; +/** Return a description of the given preopened file descriptor. */ +export declare function fd_prestat_get(fd: fd_t, buf: uintptr_t): errno; +/** Return a description of the given preopened file descriptor. */ +export declare function fd_prestat_dir_name(fd: fd_t, path: uintptr_t, path_len: size_t): errno; +/** Write to a file descriptor, without using and updating the file descriptor's offset. */ +export declare function fd_pwrite(fd: fd_t, iovs: uintptr_t, iovs_len: size_t, offset: filesize_t, nwritten: uintptr_t): errno; +/** Read from a file descriptor. */ +export declare function fd_read(fd: fd_t, iovs: uintptr_t, iovs_len: size_t, nread: uintptr_t): errno; +/** Read directory entries from a directory. */ +export declare function fd_readdir(fd: fd_t, buf: uintptr_t, buf_len: size_t, cookie: dircookie_t, buf_used: uintptr_t): errno; +/** Atomically replace a file descriptor by renumbering another file descriptor. */ +export declare function fd_renumber(from: fd_t, to: fd_t): errno; +/** Move the offset of a file descriptor. */ +export declare function fd_seek(fd: fd_t, offset: filedelta_t, whence: whence, newoffset: uintptr_t): errno; +/** Synchronize the data and metadata of a file to disk. */ +export declare function fd_sync(fd: fd_t): errno; +/** Return the current offset of a file descriptor. */ +export declare function fd_tell(fd: fd_t, newoffset: uintptr_t): errno; +/** Write to a file descriptor. */ +export declare function fd_write(fd: fd_t, iovs: uintptr_t, iovs_len: size_t, nwritten: uintptr_t): errno; + +/* Create a directory. */ +export declare function path_create_directory(fd: fd_t, path: uintptr_t, path_len: size_t): errno; +/** Return the attributes of a file or directory. */ +export declare function path_filestat_get(fd: fd_t, flags: lookupflags, path: uintptr_t, path_len: size_t, buf: uintptr_t): errno; +/** Adjust the timestamps of a file or directory. */ +export declare function path_filestat_set_times(fd: fd_t, flags: lookupflags, path: uintptr_t, path_len: size_t, st_atim: timestamp_t, st_mtim: timestamp_t, fstflags: fstflags): errno; +/** Create a hard link. */ +export declare function path_link(fd0: fd_t, flags0: lookupflags, path0: uintptr_t, path_len0: size_t, fd1: fd_t, path1: uintptr_t, path_len: size_t): errno; +/** Open a file or directory. */ +export declare function path_open(dirfd: fd_t, dirflags: lookupflags, path: uintptr_t, path_len: size_t, oflags: oflags, fs_rights_base: rights, fs_rights_inheriting: rights, fs_flags: fdflags, fd: fd_t): errno; +/** Read the contents of a symbolic link. */ +export declare function path_readlink(fd: fd_t, path: uintptr_t, path_len: size_t, buf: uintptr_t, buf_len: size_t, buf_used: uintptr_t): errno; +/** Remove a directory. */ +export declare function path_remove_directory(fd: fd_t, path: uintptr_t, path_len: size_t): errno; +/** Rename a file or directory. */ +export declare function path_rename(fd0: fd_t, path0: uintptr_t, path_len0: size_t, fd1: fd_t, path1: uintptr_t, path_len1: size_t): errno; +/** Create a symbolic link. */ +export declare function path_symlink(path0: uintptr_t, path_len0: size_t, fd: fd_t, path1: uintptr_t, path_len1: size_t): errno; +/** Unlink a file. */ +export declare function path_unlink_file(fd: fd_t, path: uintptr_t, path_len: size_t): errno; + +/** Concurrently poll for the occurrence of a set of events. */ +export declare function poll_oneoff(in_: uintptr_t, out: uintptr_t, nsubscriptions: size_t, nevents: uintptr_t): errno; + +/** Terminate the process normally. An exit code of 0 indicates successful termination of the program. The meanings of other values is dependent on the environment. */ +export declare function proc_exit(rval: u32): void; +/** Send a signal to the process of the calling thread. */ +export declare function proc_raise(sig: signal): errno; + +/** Write high-quality random data into a buffer. */ +export declare function random_get(buf: uintptr_t, buf_len: size_t): errno; + +/** Temporarily yield execution of the calling thread. */ +export declare function sched_yield(): errno; + +/** Receive a message from a socket. */ +export declare function sock_recv(sock: fd_t, ri_data: uintptr_t, ri_data_len: size_t, ri_flags: riflags, ro_datalen: uintptr_t, ro_flags: roflags): errno; +/** Send a message on a socket. */ +export declare function sock_send(sock: fd_t, si_data: uintptr_t, si_data_len: size_t, si_flags: siflags, so_datalen: uintptr_t): errno; +/** Shut down socket send and receive channels. */ +export declare function sock_shutdown(sock: fd_t, how: sdflags): errno; + +// === Types ====================================================================================== + +/** File or memory access pattern advisory information. */ +export const enum advice { + /** The application has no advice to give on its behavior with respect to the specified data. */ + NORMAL = 0, + /** The application expects to access the specified data sequentially from lower offsets to higher offsets. */ + SEQUENTIAL = 1, + /** The application expects to access the specified data in a random order. */ + RANDOM = 2, + /** The application expects to access the specified data in the near future. */ + WILLNEED = 3, + /** The application expects that it will not access the specified data in the near future. */ + DONTNEED = 4, + /** The application expects to access the specified data once and then not reuse it thereafter. */ + NOREUSE = 5 +} +export type advice_t = u8; + +/** Identifiers for clocks. */ +export const enum clockid { + /** The clock measuring real time. Time value zero corresponds with 1970-01-01T00:00:00Z. */ + REALTIME = 0, + /** The store-wide monotonic clock. Absolute value has no meaning. */ + MONOTONIC = 1, + /** The CPU-time clock associated with the current process. */ + PROCESS_CPUTIME_ID = 2, + /** The CPU-time clock associated with the current thread. */ + THREAD_CPUTIME_ID = 3 +} +export type clockid_t = u32; + +/** Identifier for a device containing a file system. Can be used in combination with `inode` to uniquely identify a file or directory in the filesystem. */ +export type device_t = u64; + +/** A reference to the offset of a directory entry. */ +export type dircookie_t = u64; + +/** A directory entry. */ +@unmanaged export class dirent { + /** The offset of the next directory entry stored in this directory. */ + next: dircookie_t; + /** The serial number of the file referred to by this directory entry. */ + ino: inode_t; + /** The length of the name of the directory entry. */ + namlen: u32; + /** The type of the file referred to by this directory entry. */ + type: filetype_t; +} + +/** Error codes returned by functions. */ +export const enum errno { + /** No error occurred. System call completed successfully. */ + SUCCESS = 0, + /** Argument list too long. */ + TOOBIG = 1, + /** Permission denied. */ + ACCES = 2, + /** Address in use. */ + ADDRINUSE = 3, + /** Address not available. */ + ADDRNOTAVAIL = 4, + /** Address family not supported. */ + AFNOSUPPORT = 5, + /** Resource unavailable, or operation would block. */ + AGAIN = 6, + /** Connection already in progress. */ + ALREADY = 7, + /** Bad file descriptor. */ + BADF = 8, + /** Bad message. */ + BADMSG = 9, + /** Device or resource busy. */ + BUSY = 10, + /** Operation canceled. */ + CANCELED = 11, + /** No child processes. */ + CHILD = 12, + /** Connection aborted. */ + CONNABORTED = 13, + /** Connection refused. */ + CONNREFUSED = 14, + /** Connection reset. */ + CONNRESET = 15, + /** Resource deadlock would occur. */ + DEADLK = 16, + /** Destination address required. */ + DESTADDRREQ = 17, + /** Mathematics argument out of domain of function. */ + DOM = 18, + /** Reserved. */ + DQUOT = 19, + /** File exists. */ + EXIST = 20, + /** Bad address. */ + FAULT = 21, + /** File too large. */ + FBIG = 22, + /** Host is unreachable. */ + HOSTUNREACH = 23, + /** Identifier removed. */ + IDRM = 24, + /** Illegal byte sequence. */ + ILSEQ = 25, + /** Operation in progress. */ + INPROGRESS = 26, + /** Interrupted function. */ + INTR = 27, + /** Invalid argument. */ + INVAL = 28, + /** I/O error. */ + IO = 29, + /** Socket is connected. */ + ISCONN = 30, + /** Is a directory. */ + ISDIR = 31, + /** Too many levels of symbolic links. */ + LOOP = 32, + /** File descriptor value too large. */ + MFILE = 33, + /** Too many links. */ + MLINK = 34, + /** Message too large. */ + MSGSIZE = 35, + /** Reserved. */ + MULTIHOP = 36, + /** Filename too long. */ + NAMETOOLONG = 37, + /** Network is down. */ + NETDOWN = 38, + /** Connection aborted by network. */ + NETRESET = 39, + /** Network unreachable. */ + NETUNREACH = 40, + /** Too many files open in system. */ + NFILE = 41, + /** No buffer space available. */ + NOBUFS = 42, + /** No such device. */ + NODEV = 43, + /** No such file or directory. */ + NOENT = 44, + /** Executable file format error. */ + NOEXEC = 45, + /** No locks available. */ + NOLCK = 46, + /** Reserved. */ + NOLINK = 47, + /** Not enough space. */ + NOMEM = 48, + /** No message of the desired type. */ + NOMSG = 49, + /** Protocol not available. */ + NOPROTOOPT = 50, + /** No space left on device. */ + NOSPC = 51, + /** Function not supported. */ + NOSYS = 52, + /** The socket is not connected. */ + NOTCONN = 53, + /** Not a directory or a symbolic link to a directory. */ + NOTDIR = 54, + /** Directory not empty. */ + NOTEMPTY = 55, + /** State not recoverable. */ + NOTRECOVERABLE = 56, + /** Not a socket. */ + NOTSOCK = 57, + /** Not supported, or operation not supported on socket. */ + NOTSUP = 58, + /** Inappropriate I/O control operation. */ + NOTTY = 59, + /** No such device or address. */ + NXIO = 60, + /** Value too large to be stored in data type. */ + OVERFLOW = 61, + /** Previous owner died. */ + OWNERDEAD = 62, + /** Operation not permitted. */ + PERM = 63, + /** Broken pipe. */ + PIPE = 64, + /** Protocol error. */ + PROTO = 65, + /** Protocol not supported. */ + PROTONOSUPPORT = 66, + /** Protocol wrong type for socket. */ + PROTOTYPE = 67, + /** Result too large. */ + RANGE = 68, + /** Read-only file system. */ + ROFS = 69, + /** Invalid seek. */ + SPIPE = 70, + /** No such process. */ + SRCH = 71, + /** Reserved. */ + STALE = 72, + /** Connection timed out. */ + TIMEDOUT = 73, + /** Text file busy. */ + TXTBSY = 74, + /** Cross-device link. */ + XDEV = 75, + /** Extension: Capabilities insufficient. */ + NOTCAPABLE = 76 +} +export type errno_t = u16; + +/** An event that occurred. */ +@unmanaged export class event { + userdata: userdata_t; + error: errno_t; + type: eventtype_t; +} + +/** An event that occurred when type is `eventtype.FD_READ` or `eventtype.FD_WRITE`. */ +@unmanaged export class rwevent extends event { + nbytes: filesize_t; + flags: eventrwflags_t; +} + +/** The state of the file descriptor subscribed to with `eventtype.FD_READ` or `eventtype.FD_WRITE`. */ +export const enum eventrwflags { + /** The peer of this socket has closed or disconnected. */ + HANGUP = 1 +} +export type eventrwflags_t = u16; + +/** Type of a subscription to an event or its occurrence. */ +export const enum eventtype { + /** The time value of clock has reached the timestamp. */ + CLOCK = 0, + /** File descriptor has data available for reading. */ + FD_READ = 1, + /** File descriptor has capacity available for writing */ + FD_WRITE = 2 +} +export type eventtype_t = u8; + +/** Exit code generated by a process when exiting. */ +export type exitcode_t = u32; + +/** A file descriptor number. */ +export type fd_t = u32; + +/** File descriptor flags. */ +export const enum fdflags { + /** Append mode: Data written to the file is always appended to the file's end. */ + APPEND = 1, + /** Write according to synchronized I/O data integrity completion. Only the data stored in the file is synchronized. */ + DSYNC = 2, + /** Non-blocking mode. */ + NONBLOCK = 4, + /** Synchronized read I/O operations. */ + RSYNC = 8, + /** Write according to synchronized I/O file integrity completion. */ + SYNC = 16 +} +export type fdflags_t = u16; + +/** File descriptor attributes. */ +@unmanaged export class fdstat { + /** File type. */ + filetype: filetype_t; + /** File descriptor flags. */ + flags: fdflags_t; + /** Rights that apply to this file descriptor. */ + rights_base: rights_t; + /** Maximum set of rights that may be installed on new file descriptors that are created through this file descriptor, e.g., through `path_open`. */ + rights_inheriting: rights_t; +} + +/** Relative offset within a file. */ +export type filedelta_t = i64; + +/** Non-negative file size or length of a region within a file. */ +export type filesize_t = u64; + +/** File attributes. */ +@unmanaged export class filestat { + /** Device ID of device containing the file. */ + dev: device_t; + /** File serial number. */ + ino: inode_t; + /** File type. */ + filetype: filetype_t; + /** Number of hard links to the file. */ + nlink: linkcount_t; + /** For regular files, the file size in bytes. For symbolic links, the length in bytes of the pathname contained in the symbolic link. */ + size: filesize_t; + /** Last data access timestamp. */ + atim: timestamp_t; + /** Last data modification timestamp. */ + mtim: timestamp_t; + /** Last file status change timestamp. */ + ctim: timestamp_t; +} + +/** The type of a file descriptor or file. */ +export const enum filetype { + /** The type of the file descriptor or file is unknown or is different from any of the other types specified. */ + UNKNOWN = 0, + /** The file descriptor or file refers to a block device inode. */ + BLOCK_DEVICE = 1, + /** The file descriptor or file refers to a character device inode. */ + CHARACTER_DEVICE = 2, + /** The file descriptor or file refers to a directory inode. */ + DIRECTORY = 3, + /** The file descriptor or file refers to a regular file inode. */ + REGULAR_FILE = 4, + /** The file descriptor or file refers to a datagram socket. */ + SOCKET_DGRAM = 5, + /** The file descriptor or file refers to a byte-stream socket. */ + SOCKET_STREAM = 6, + /** The file refers to a symbolic link inode. */ + SYMBOLIC_LINK = 7 +} +export type filetype_t = u8; + +/** Which file time attributes to adjust. */ +export const enum fstflags { + /** Adjust the last data access timestamp to the value stored in `filestat#st_atim`. */ + SET_ATIM = 1, + /** Adjust the last data access timestamp to the time of clock `clockid.REALTIME`. */ + SET_ATIM_NOW = 2, + /** Adjust the last data modification timestamp to the value stored in `filestat#st_mtim`. */ + SET_MTIM = 4, + /** Adjust the last data modification timestamp to the time of clock `clockid.REALTIME`. */ + SET_MTIM_NOW = 8 +} +export type fstflags_t = u16; + +/** File serial number that is unique within its file system. */ +export type inode_t = u64; + +/** A region of memory for scatter/gather reads. */ +@unmanaged export class iovec { + /** The address of the buffer to be filled. */ + buf: uintptr_t; + /** The length of the buffer to be filled. */ + buf_len: size_t; +} + +/** Number of hard links to an inode. */ +export type linkcount_t = u32; + +/** Flags determining the method of how paths are resolved. */ +export const enum lookupflags { + /** As long as the resolved path corresponds to a symbolic link, it is expanded. */ + SYMLINK_FOLLOW = 1 +} +export type lookupflags_t = u32; + +/** Open flags. */ +export const enum oflags { + /** Create file if it does not exist. */ + CREAT = 1, + /** Fail if not a directory. */ + DIRECTORY = 2, + /** Fail if file already exists. */ + EXCL = 4, + /** Truncate file to size 0. */ + TRUNC = 8 +} +export type oflags_t = u16; + +/** Flags provided to `sock_recv`. */ +export const enum riflags { + /** Returns the message without removing it from the socket's receive queue. */ + PEEK = 1, + /** On byte-stream sockets, block until the full amount of data can be returned. */ + WAITALL = 2 +} +export type riflags_t = u16; + +/** File descriptor rights, determining which actions may be performed. */ +export const enum rights { + /** The right to invoke `fd_datasync`. */ + FD_DATASYNC = 1, + /** The right to invoke `fd_read` and `sock_recv`. */ + FD_READ = 2, + /** The right to invoke `fd_seek`. This flag implies `rights.FD_TELL`. */ + FD_SEEK = 4, + /** The right to invoke `fd_fdstat_set_flags`. */ + FD_FDSTAT_SET_FLAGS = 8, + /** The right to invoke `fd_sync`. */ + FD_SYNC = 16, + /** The right to invoke `fd_seek` in such a way that the file offset remains unaltered (i.e., `whence.CUR` with offset zero), or to invoke `fd_tell`). */ + FD_TELL = 32, + /** The right to invoke `fd_write` and `sock_send`. If `rights.FD_SEEK` is set, includes the right to invoke `fd_pwrite`. */ + FD_WRITE = 64, + /** The right to invoke `fd_advise`. */ + FD_ADVISE = 128, + /** The right to invoke `fd_allocate`. */ + FD_ALLOCATE = 256, + /** The right to invoke `path_create_directory`. */ + PATH_CREATE_DIRECTORY = 512, + /** If `rights.PATH_OPEN` is set, the right to invoke `path_open` with `oflags.CREAT`. */ + PATH_CREATE_FILE = 1024, + /** The right to invoke `path_link` with the file descriptor as the source directory. */ + PATH_LINK_SOURCE = 2048, + /** The right to invoke `path_link` with the file descriptor as the target directory. */ + PATH_LINK_TARGET = 4096, + /** The right to invoke `path_open`. */ + PATH_OPEN = 8192, + /** The right to invoke `fd_readdir`. */ + FD_READDIR = 16384, + /** The right to invoke `path_readlink`. */ + PATH_READLINK = 32768, + /** The right to invoke `path_rename` with the file descriptor as the source directory. */ + PATH_RENAME_SOURCE = 65536, + /** The right to invoke `path_rename` with the file descriptor as the target directory. */ + PATH_RENAME_TARGET = 131072, + /** The right to invoke `path_filestat_get`. */ + PATH_FILESTAT_GET = 262144, + /** The right to change a file's size (there is no `path_filestat_set_size`). If `rights.PATH_OPEN` is set, includes the right to invoke `path_open` with `oflags.TRUNC`. */ + PATH_FILESTAT_SET_SIZE = 524288, + /** The right to invoke `path_filestat_set_times`. */ + PATH_FILESTAT_SET_TIMES = 1048576, + /** The right to invoke `fd_filestat_get`. */ + FD_FILESTAT_GET = 2097152, + /** The right to invoke `fd_filestat_set_size`. */ + FD_FILESTAT_SET_SIZE = 4194304, + /** The right to invoke `fd_filestat_set_times`. */ + FD_FILESTAT_SET_TIMES = 8388608, + /** The right to invoke `path_symlink`. */ + RIGHT_PATH_SYMLINK = 16777216, + /** The right to invoke `path_remove_directory`. */ + PATH_REMOVE_DIRECTORY = 33554432, + /** The right to invoke `path_unlink_file`. */ + PATH_UNLINK_FILE = 67108864, + /** If `rights.FD_READ` is set, includes the right to invoke `poll_oneoff` to subscribe to `eventtype.FD_READ`. If `rights.FD_WRITE` is set, includes the right to invoke `poll_oneoff` to subscribe to `eventtype.FD_WRITE`. */ + POLL_FD_READWRITE = 134217728, + /** The right to invoke `sock_shutdown`. */ + SOCK_SHUTDOWN = 268435456 +} +export type rights_t = u64; + +/** Flags returned by `sock_recv`. */ +export const enum roflags { + /** Message data has been truncated. */ + DATA_TRUNCATED = 1 +} +export type roflags_t = u16; + +/** Which channels on a socket to shut down. */ +export const enum sdflags { + /** Disables further receive operations. */ + RD = 1, + /** Disables further send operations. */ + WR = 2 +} +export type sdflags_t = u8; + +/** Flags provided to `sock_send`. */ +export const enum siflags { + // As there are currently no flags defined, it must be set to zero. +} +export type siflags_t = u16; + +/** Signal condition. */ +export const enum signal { + /** Hangup. */ + HUP = 1, + /** Terminate interrupt signal. */ + INT = 2, + /** Terminal quit signal. */ + QUIT = 3, + /** Illegal instruction. */ + ILL = 4, + /** Trace/breakpoint trap. */ + TRAP = 5, + /** Process abort signal. */ + ABRT = 6, + /** Access to an undefined portion of a memory object. */ + BUS = 7, + /** Erroneous arithmetic operation. */ + FPE = 8, + /** Kill. */ + KILL = 9, + /** User-defined signal 1. */ + USR1 = 10, + /** Invalid memory reference. */ + SEGV = 11, + /** User-defined signal 2. */ + USR2 = 12, + /** Write on a pipe with no one to read it. */ + PIPE = 13, + /** Alarm clock. */ + ALRM = 14, + /** Termination signal. */ + TERM = 15, + /** Child process terminated, stopped, or continued. */ + CHLD = 16, + /** Continue executing, if stopped. */ + CONT = 17, + /** Stop executing. */ + STOP = 18, + /** Terminal stop signal. */ + TSTP = 19, + /** Background process attempting read. */ + TTIN = 20, + /** Background process attempting write. */ + TTOU = 21, + /** High bandwidth data is available at a socket. */ + URG = 22, + /** CPU time limit exceeded. */ + XCPU = 23, + /** File size limit exceeded. */ + XFSZ = 24, + /** Virtual timer expired. */ + VTALRM = 25, + PROF = 26, + WINCH = 27, + POLL = 28, + PWR = 29, + /** Bad system call. */ + SYS = 30 +} +export type signal_t = u8; + +/** Flags determining how to interpret the timestamp provided in `subscription_t::u.clock.timeout. */ +export const enum subclockflags { + /** If set, treat the timestamp provided in `clocksubscription` as an absolute timestamp. */ + ABSTIME = 1 +} +export type subclockflags_t = u16; + +/** Subscription to an event. */ +@unmanaged export class subscription { + /** User-provided value that is attached to the subscription. */ + userdata: userdata_t; + /** The type of the event to which to subscribe. */ + type: eventtype_t; +} + +/* Subscription to an event of type `eventtype.CLOCK`.**/ +@unmanaged export class clocksubscription extends subscription { + /** The user-defined unique identifier of the clock. */ + identifier: userdata_t; + /** The clock against which to compare the timestamp. */ + clock_id: clockid_t; + /** The absolute or relative timestamp. */ + timeout: timestamp_t; + /** The amount of time that the implementation may wait additionally to coalesce with other events. */ + precision: timestamp_t; + /** Flags specifying whether the timeout is absolute or relative. */ + flags: subclockflags_t; +} + +/* Subscription to an event of type `eventtype.FD_READ` or `eventtype.FD_WRITE`.**/ +@unmanaged export class fdsubscription extends subscription { + /** The file descriptor on which to wait for it to become ready for reading or writing. */ + fd_readwrite: fd_t; +} + +/** Timestamp in nanoseconds. */ +export type timestamp_t = u64; + +/** User-provided value that may be attached to objects that is retained when extracted from the implementation. */ +export type userdata_t = u64; + +/** The position relative to which to set the offset of the file descriptor. */ +export const enum whence { + /** Seek relative to current position. */ + CUR = 0, + /** Seek relative to end-of-file. */ + END = 1, + /** Seek relative to start-of-file. */ + SET = 2 +} +export type whence_t = u8; + +// glue +export type uintptr_t = usize; +export type size_t = usize;