summaryrefslogtreecommitdiffstats
path: root/vendor/wasi-0.9.0+wasi-snapshot-preview1/src
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/wasi-0.9.0+wasi-snapshot-preview1/src')
-rw-r--r--vendor/wasi-0.9.0+wasi-snapshot-preview1/src/error.rs51
-rw-r--r--vendor/wasi-0.9.0+wasi-snapshot-preview1/src/lib.rs36
-rw-r--r--vendor/wasi-0.9.0+wasi-snapshot-preview1/src/lib_generated.rs1853
3 files changed, 1940 insertions, 0 deletions
diff --git a/vendor/wasi-0.9.0+wasi-snapshot-preview1/src/error.rs b/vendor/wasi-0.9.0+wasi-snapshot-preview1/src/error.rs
new file mode 100644
index 000000000..2f2aaf4b9
--- /dev/null
+++ b/vendor/wasi-0.9.0+wasi-snapshot-preview1/src/error.rs
@@ -0,0 +1,51 @@
+use super::Errno;
+use core::fmt;
+use core::num::NonZeroU16;
+
+/// A raw error returned by wasi APIs, internally containing a 16-bit error
+/// code.
+#[derive(Copy, Clone, PartialEq, Eq, Ord, PartialOrd)]
+pub struct Error {
+ code: NonZeroU16,
+}
+
+impl Error {
+ /// Constructs a new error from a raw error code, returning `None` if the
+ /// error code is zero (which means success).
+ pub fn from_raw_error(error: Errno) -> Option<Error> {
+ Some(Error {
+ code: NonZeroU16::new(error)?,
+ })
+ }
+
+ /// Returns the raw error code that this error represents.
+ pub fn raw_error(&self) -> u16 {
+ self.code.get()
+ }
+}
+
+impl fmt::Display for Error {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(
+ f,
+ "{} (error {})",
+ super::strerror(self.code.get()),
+ self.code
+ )?;
+ Ok(())
+ }
+}
+
+impl fmt::Debug for Error {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ f.debug_struct("Error")
+ .field("code", &self.code)
+ .field("message", &super::strerror(self.code.get()))
+ .finish()
+ }
+}
+
+#[cfg(feature = "std")]
+extern crate std;
+#[cfg(feature = "std")]
+impl std::error::Error for Error {}
diff --git a/vendor/wasi-0.9.0+wasi-snapshot-preview1/src/lib.rs b/vendor/wasi-0.9.0+wasi-snapshot-preview1/src/lib.rs
new file mode 100644
index 000000000..45c246927
--- /dev/null
+++ b/vendor/wasi-0.9.0+wasi-snapshot-preview1/src/lib.rs
@@ -0,0 +1,36 @@
+//! Raw API bindings to the WebAssembly System Interface (WASI)
+//!
+//! This crate provides Rust API bindings to WASI APIs. All WASI APIs are
+//! exported from this crate and provided with the appropriate type signatures.
+//! This crate is entirely procedurally generated from the `*.witx` files that
+//! describe the WASI API.
+//!
+//! # WASI API Version
+//!
+//! The WASI API is evolving over time. It is both gaining new features as well
+//! as tweaking the ABI of existing features. As a result it's important to
+//! understand what version of this crate you're using and how it relates to
+//! the WASI version of the spec.
+//!
+//! The WASI specification is organized into phases where there is a snapshot
+//! at any one point in time describing the current state of the specification.
+//! This crate implements a particular snapshot. You can find the snapshot
+//! version implemented in this crate in the build metadata of the crate
+//! version number. For example something like `0.9.0+wasi-snapshot-preview1`
+//! means that this crate's own personal version is 0.9.0 and it implements the
+//! `wasi-snapshot-preview1` snapshot. A major release of this crate (i.e.
+//! bumping the "0.9.0") is expected whenever the generated code changes
+//! or a new WASI snapshot is used.
+//!
+//! # Crate Features
+//!
+//! This crate supports one feature, `std`, which implements the standard
+//! `Error` trait for the exported [`Error`] type in this crate. This is
+//! enabled by default but can be disabled to make the library `no_std`
+//! compatible.
+
+#![no_std]
+
+mod error;
+mod lib_generated;
+pub use lib_generated::*;
diff --git a/vendor/wasi-0.9.0+wasi-snapshot-preview1/src/lib_generated.rs b/vendor/wasi-0.9.0+wasi-snapshot-preview1/src/lib_generated.rs
new file mode 100644
index 000000000..8adf46647
--- /dev/null
+++ b/vendor/wasi-0.9.0+wasi-snapshot-preview1/src/lib_generated.rs
@@ -0,0 +1,1853 @@
+// This file is automatically generated, DO NOT EDIT
+//
+// To regenerate this file run the `crates/generate-raw` command
+
+use core::mem::MaybeUninit;
+
+pub use crate::error::Error;
+pub type Result<T, E = Error> = core::result::Result<T, E>;
+pub type Size = usize;
+pub type Filesize = u64;
+pub type Timestamp = u64;
+pub type Clockid = u32;
+/// The clock measuring real time. Time value zero corresponds with
+/// 1970-01-01T00:00:00Z.
+pub const CLOCKID_REALTIME: Clockid = 0;
+/// The store-wide monotonic clock, which is defined as a clock measuring
+/// real time, whose value cannot be adjusted and which cannot have negative
+/// clock jumps. The epoch of this clock is undefined. The absolute time
+/// value of this clock therefore has no meaning.
+pub const CLOCKID_MONOTONIC: Clockid = 1;
+/// The CPU-time clock associated with the current process.
+pub const CLOCKID_PROCESS_CPUTIME_ID: Clockid = 2;
+/// The CPU-time clock associated with the current thread.
+pub const CLOCKID_THREAD_CPUTIME_ID: Clockid = 3;
+pub type Errno = u16;
+/// No error occurred. System call completed successfully.
+pub const ERRNO_SUCCESS: Errno = 0;
+/// Argument list too long.
+pub const ERRNO_2BIG: Errno = 1;
+/// Permission denied.
+pub const ERRNO_ACCES: Errno = 2;
+/// Address in use.
+pub const ERRNO_ADDRINUSE: Errno = 3;
+/// Address not available.
+pub const ERRNO_ADDRNOTAVAIL: Errno = 4;
+/// Address family not supported.
+pub const ERRNO_AFNOSUPPORT: Errno = 5;
+/// Resource unavailable, or operation would block.
+pub const ERRNO_AGAIN: Errno = 6;
+/// Connection already in progress.
+pub const ERRNO_ALREADY: Errno = 7;
+/// Bad file descriptor.
+pub const ERRNO_BADF: Errno = 8;
+/// Bad message.
+pub const ERRNO_BADMSG: Errno = 9;
+/// Device or resource busy.
+pub const ERRNO_BUSY: Errno = 10;
+/// Operation canceled.
+pub const ERRNO_CANCELED: Errno = 11;
+/// No child processes.
+pub const ERRNO_CHILD: Errno = 12;
+/// Connection aborted.
+pub const ERRNO_CONNABORTED: Errno = 13;
+/// Connection refused.
+pub const ERRNO_CONNREFUSED: Errno = 14;
+/// Connection reset.
+pub const ERRNO_CONNRESET: Errno = 15;
+/// Resource deadlock would occur.
+pub const ERRNO_DEADLK: Errno = 16;
+/// Destination address required.
+pub const ERRNO_DESTADDRREQ: Errno = 17;
+/// Mathematics argument out of domain of function.
+pub const ERRNO_DOM: Errno = 18;
+/// Reserved.
+pub const ERRNO_DQUOT: Errno = 19;
+/// File exists.
+pub const ERRNO_EXIST: Errno = 20;
+/// Bad address.
+pub const ERRNO_FAULT: Errno = 21;
+/// File too large.
+pub const ERRNO_FBIG: Errno = 22;
+/// Host is unreachable.
+pub const ERRNO_HOSTUNREACH: Errno = 23;
+/// Identifier removed.
+pub const ERRNO_IDRM: Errno = 24;
+/// Illegal byte sequence.
+pub const ERRNO_ILSEQ: Errno = 25;
+/// Operation in progress.
+pub const ERRNO_INPROGRESS: Errno = 26;
+/// Interrupted function.
+pub const ERRNO_INTR: Errno = 27;
+/// Invalid argument.
+pub const ERRNO_INVAL: Errno = 28;
+/// I/O error.
+pub const ERRNO_IO: Errno = 29;
+/// Socket is connected.
+pub const ERRNO_ISCONN: Errno = 30;
+/// Is a directory.
+pub const ERRNO_ISDIR: Errno = 31;
+/// Too many levels of symbolic links.
+pub const ERRNO_LOOP: Errno = 32;
+/// File descriptor value too large.
+pub const ERRNO_MFILE: Errno = 33;
+/// Too many links.
+pub const ERRNO_MLINK: Errno = 34;
+/// Message too large.
+pub const ERRNO_MSGSIZE: Errno = 35;
+/// Reserved.
+pub const ERRNO_MULTIHOP: Errno = 36;
+/// Filename too long.
+pub const ERRNO_NAMETOOLONG: Errno = 37;
+/// Network is down.
+pub const ERRNO_NETDOWN: Errno = 38;
+/// Connection aborted by network.
+pub const ERRNO_NETRESET: Errno = 39;
+/// Network unreachable.
+pub const ERRNO_NETUNREACH: Errno = 40;
+/// Too many files open in system.
+pub const ERRNO_NFILE: Errno = 41;
+/// No buffer space available.
+pub const ERRNO_NOBUFS: Errno = 42;
+/// No such device.
+pub const ERRNO_NODEV: Errno = 43;
+/// No such file or directory.
+pub const ERRNO_NOENT: Errno = 44;
+/// Executable file format error.
+pub const ERRNO_NOEXEC: Errno = 45;
+/// No locks available.
+pub const ERRNO_NOLCK: Errno = 46;
+/// Reserved.
+pub const ERRNO_NOLINK: Errno = 47;
+/// Not enough space.
+pub const ERRNO_NOMEM: Errno = 48;
+/// No message of the desired type.
+pub const ERRNO_NOMSG: Errno = 49;
+/// Protocol not available.
+pub const ERRNO_NOPROTOOPT: Errno = 50;
+/// No space left on device.
+pub const ERRNO_NOSPC: Errno = 51;
+/// Function not supported.
+pub const ERRNO_NOSYS: Errno = 52;
+/// The socket is not connected.
+pub const ERRNO_NOTCONN: Errno = 53;
+/// Not a directory or a symbolic link to a directory.
+pub const ERRNO_NOTDIR: Errno = 54;
+/// Directory not empty.
+pub const ERRNO_NOTEMPTY: Errno = 55;
+/// State not recoverable.
+pub const ERRNO_NOTRECOVERABLE: Errno = 56;
+/// Not a socket.
+pub const ERRNO_NOTSOCK: Errno = 57;
+/// Not supported, or operation not supported on socket.
+pub const ERRNO_NOTSUP: Errno = 58;
+/// Inappropriate I/O control operation.
+pub const ERRNO_NOTTY: Errno = 59;
+/// No such device or address.
+pub const ERRNO_NXIO: Errno = 60;
+/// Value too large to be stored in data type.
+pub const ERRNO_OVERFLOW: Errno = 61;
+/// Previous owner died.
+pub const ERRNO_OWNERDEAD: Errno = 62;
+/// Operation not permitted.
+pub const ERRNO_PERM: Errno = 63;
+/// Broken pipe.
+pub const ERRNO_PIPE: Errno = 64;
+/// Protocol error.
+pub const ERRNO_PROTO: Errno = 65;
+/// Protocol not supported.
+pub const ERRNO_PROTONOSUPPORT: Errno = 66;
+/// Protocol wrong type for socket.
+pub const ERRNO_PROTOTYPE: Errno = 67;
+/// Result too large.
+pub const ERRNO_RANGE: Errno = 68;
+/// Read-only file system.
+pub const ERRNO_ROFS: Errno = 69;
+/// Invalid seek.
+pub const ERRNO_SPIPE: Errno = 70;
+/// No such process.
+pub const ERRNO_SRCH: Errno = 71;
+/// Reserved.
+pub const ERRNO_STALE: Errno = 72;
+/// Connection timed out.
+pub const ERRNO_TIMEDOUT: Errno = 73;
+/// Text file busy.
+pub const ERRNO_TXTBSY: Errno = 74;
+/// Cross-device link.
+pub const ERRNO_XDEV: Errno = 75;
+/// Extension: Capabilities insufficient.
+pub const ERRNO_NOTCAPABLE: Errno = 76;
+pub(crate) fn strerror(code: u16) -> &'static str {
+ match code {
+ ERRNO_SUCCESS => "No error occurred. System call completed successfully.",
+ ERRNO_2BIG => "Argument list too long.",
+ ERRNO_ACCES => "Permission denied.",
+ ERRNO_ADDRINUSE => "Address in use.",
+ ERRNO_ADDRNOTAVAIL => "Address not available.",
+ ERRNO_AFNOSUPPORT => "Address family not supported.",
+ ERRNO_AGAIN => "Resource unavailable, or operation would block.",
+ ERRNO_ALREADY => "Connection already in progress.",
+ ERRNO_BADF => "Bad file descriptor.",
+ ERRNO_BADMSG => "Bad message.",
+ ERRNO_BUSY => "Device or resource busy.",
+ ERRNO_CANCELED => "Operation canceled.",
+ ERRNO_CHILD => "No child processes.",
+ ERRNO_CONNABORTED => "Connection aborted.",
+ ERRNO_CONNREFUSED => "Connection refused.",
+ ERRNO_CONNRESET => "Connection reset.",
+ ERRNO_DEADLK => "Resource deadlock would occur.",
+ ERRNO_DESTADDRREQ => "Destination address required.",
+ ERRNO_DOM => "Mathematics argument out of domain of function.",
+ ERRNO_DQUOT => "Reserved.",
+ ERRNO_EXIST => "File exists.",
+ ERRNO_FAULT => "Bad address.",
+ ERRNO_FBIG => "File too large.",
+ ERRNO_HOSTUNREACH => "Host is unreachable.",
+ ERRNO_IDRM => "Identifier removed.",
+ ERRNO_ILSEQ => "Illegal byte sequence.",
+ ERRNO_INPROGRESS => "Operation in progress.",
+ ERRNO_INTR => "Interrupted function.",
+ ERRNO_INVAL => "Invalid argument.",
+ ERRNO_IO => "I/O error.",
+ ERRNO_ISCONN => "Socket is connected.",
+ ERRNO_ISDIR => "Is a directory.",
+ ERRNO_LOOP => "Too many levels of symbolic links.",
+ ERRNO_MFILE => "File descriptor value too large.",
+ ERRNO_MLINK => "Too many links.",
+ ERRNO_MSGSIZE => "Message too large.",
+ ERRNO_MULTIHOP => "Reserved.",
+ ERRNO_NAMETOOLONG => "Filename too long.",
+ ERRNO_NETDOWN => "Network is down.",
+ ERRNO_NETRESET => "Connection aborted by network.",
+ ERRNO_NETUNREACH => "Network unreachable.",
+ ERRNO_NFILE => "Too many files open in system.",
+ ERRNO_NOBUFS => "No buffer space available.",
+ ERRNO_NODEV => "No such device.",
+ ERRNO_NOENT => "No such file or directory.",
+ ERRNO_NOEXEC => "Executable file format error.",
+ ERRNO_NOLCK => "No locks available.",
+ ERRNO_NOLINK => "Reserved.",
+ ERRNO_NOMEM => "Not enough space.",
+ ERRNO_NOMSG => "No message of the desired type.",
+ ERRNO_NOPROTOOPT => "Protocol not available.",
+ ERRNO_NOSPC => "No space left on device.",
+ ERRNO_NOSYS => "Function not supported.",
+ ERRNO_NOTCONN => "The socket is not connected.",
+ ERRNO_NOTDIR => "Not a directory or a symbolic link to a directory.",
+ ERRNO_NOTEMPTY => "Directory not empty.",
+ ERRNO_NOTRECOVERABLE => "State not recoverable.",
+ ERRNO_NOTSOCK => "Not a socket.",
+ ERRNO_NOTSUP => "Not supported, or operation not supported on socket.",
+ ERRNO_NOTTY => "Inappropriate I/O control operation.",
+ ERRNO_NXIO => "No such device or address.",
+ ERRNO_OVERFLOW => "Value too large to be stored in data type.",
+ ERRNO_OWNERDEAD => "Previous owner died.",
+ ERRNO_PERM => "Operation not permitted.",
+ ERRNO_PIPE => "Broken pipe.",
+ ERRNO_PROTO => "Protocol error.",
+ ERRNO_PROTONOSUPPORT => "Protocol not supported.",
+ ERRNO_PROTOTYPE => "Protocol wrong type for socket.",
+ ERRNO_RANGE => "Result too large.",
+ ERRNO_ROFS => "Read-only file system.",
+ ERRNO_SPIPE => "Invalid seek.",
+ ERRNO_SRCH => "No such process.",
+ ERRNO_STALE => "Reserved.",
+ ERRNO_TIMEDOUT => "Connection timed out.",
+ ERRNO_TXTBSY => "Text file busy.",
+ ERRNO_XDEV => "Cross-device link.",
+ ERRNO_NOTCAPABLE => "Extension: Capabilities insufficient.",
+ _ => "Unknown error.",
+ }
+}
+pub type Rights = u64;
+/// The right to invoke `fd_datasync`.
+/// If `path_open` is set, includes the right to invoke
+/// `path_open` with `fdflag::dsync`.
+pub const RIGHTS_FD_DATASYNC: Rights = 0x1;
+/// The right to invoke `fd_read` and `sock_recv`.
+/// If `rights::fd_seek` is set, includes the right to invoke `fd_pread`.
+pub const RIGHTS_FD_READ: Rights = 0x2;
+/// The right to invoke `fd_seek`. This flag implies `rights::fd_tell`.
+pub const RIGHTS_FD_SEEK: Rights = 0x4;
+/// The right to invoke `fd_fdstat_set_flags`.
+pub const RIGHTS_FD_FDSTAT_SET_FLAGS: Rights = 0x8;
+/// The right to invoke `fd_sync`.
+/// If `path_open` is set, includes the right to invoke
+/// `path_open` with `fdflag::rsync` and `fdflag::dsync`.
+pub const RIGHTS_FD_SYNC: Rights = 0x10;
+/// 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`.
+pub const RIGHTS_FD_TELL: Rights = 0x20;
+/// The right to invoke `fd_write` and `sock_send`.
+/// If `rights::fd_seek` is set, includes the right to invoke `fd_pwrite`.
+pub const RIGHTS_FD_WRITE: Rights = 0x40;
+/// The right to invoke `fd_advise`.
+pub const RIGHTS_FD_ADVISE: Rights = 0x80;
+/// The right to invoke `fd_allocate`.
+pub const RIGHTS_FD_ALLOCATE: Rights = 0x100;
+/// The right to invoke `path_create_directory`.
+pub const RIGHTS_PATH_CREATE_DIRECTORY: Rights = 0x200;
+/// If `path_open` is set, the right to invoke `path_open` with `oflags::creat`.
+pub const RIGHTS_PATH_CREATE_FILE: Rights = 0x400;
+/// The right to invoke `path_link` with the file descriptor as the
+/// source directory.
+pub const RIGHTS_PATH_LINK_SOURCE: Rights = 0x800;
+/// The right to invoke `path_link` with the file descriptor as the
+/// target directory.
+pub const RIGHTS_PATH_LINK_TARGET: Rights = 0x1000;
+/// The right to invoke `path_open`.
+pub const RIGHTS_PATH_OPEN: Rights = 0x2000;
+/// The right to invoke `fd_readdir`.
+pub const RIGHTS_FD_READDIR: Rights = 0x4000;
+/// The right to invoke `path_readlink`.
+pub const RIGHTS_PATH_READLINK: Rights = 0x8000;
+/// The right to invoke `path_rename` with the file descriptor as the source directory.
+pub const RIGHTS_PATH_RENAME_SOURCE: Rights = 0x10000;
+/// The right to invoke `path_rename` with the file descriptor as the target directory.
+pub const RIGHTS_PATH_RENAME_TARGET: Rights = 0x20000;
+/// The right to invoke `path_filestat_get`.
+pub const RIGHTS_PATH_FILESTAT_GET: Rights = 0x40000;
+/// The right to change a file's size (there is no `path_filestat_set_size`).
+/// If `path_open` is set, includes the right to invoke `path_open` with `oflags::trunc`.
+pub const RIGHTS_PATH_FILESTAT_SET_SIZE: Rights = 0x80000;
+/// The right to invoke `path_filestat_set_times`.
+pub const RIGHTS_PATH_FILESTAT_SET_TIMES: Rights = 0x100000;
+/// The right to invoke `fd_filestat_get`.
+pub const RIGHTS_FD_FILESTAT_GET: Rights = 0x200000;
+/// The right to invoke `fd_filestat_set_size`.
+pub const RIGHTS_FD_FILESTAT_SET_SIZE: Rights = 0x400000;
+/// The right to invoke `fd_filestat_set_times`.
+pub const RIGHTS_FD_FILESTAT_SET_TIMES: Rights = 0x800000;
+/// The right to invoke `path_symlink`.
+pub const RIGHTS_PATH_SYMLINK: Rights = 0x1000000;
+/// The right to invoke `path_remove_directory`.
+pub const RIGHTS_PATH_REMOVE_DIRECTORY: Rights = 0x2000000;
+/// The right to invoke `path_unlink_file`.
+pub const RIGHTS_PATH_UNLINK_FILE: Rights = 0x4000000;
+/// 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`.
+pub const RIGHTS_POLL_FD_READWRITE: Rights = 0x8000000;
+/// The right to invoke `sock_shutdown`.
+pub const RIGHTS_SOCK_SHUTDOWN: Rights = 0x10000000;
+pub type Fd = u32;
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub struct Iovec {
+ /// The address of the buffer to be filled.
+ pub buf: *mut u8,
+ /// The length of the buffer to be filled.
+ pub buf_len: Size,
+}
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub struct Ciovec {
+ /// The address of the buffer to be written.
+ pub buf: *const u8,
+ /// The length of the buffer to be written.
+ pub buf_len: Size,
+}
+pub type IovecArray<'a> = &'a [Iovec];
+pub type CiovecArray<'a> = &'a [Ciovec];
+pub type Filedelta = i64;
+pub type Whence = u8;
+/// Seek relative to start-of-file.
+pub const WHENCE_SET: Whence = 0;
+/// Seek relative to current position.
+pub const WHENCE_CUR: Whence = 1;
+/// Seek relative to end-of-file.
+pub const WHENCE_END: Whence = 2;
+pub type Dircookie = u64;
+pub type Dirnamlen = u32;
+pub type Inode = u64;
+pub type Filetype = u8;
+/// The type of the file descriptor or file is unknown or is different from any of the other types specified.
+pub const FILETYPE_UNKNOWN: Filetype = 0;
+/// The file descriptor or file refers to a block device inode.
+pub const FILETYPE_BLOCK_DEVICE: Filetype = 1;
+/// The file descriptor or file refers to a character device inode.
+pub const FILETYPE_CHARACTER_DEVICE: Filetype = 2;
+/// The file descriptor or file refers to a directory inode.
+pub const FILETYPE_DIRECTORY: Filetype = 3;
+/// The file descriptor or file refers to a regular file inode.
+pub const FILETYPE_REGULAR_FILE: Filetype = 4;
+/// The file descriptor or file refers to a datagram socket.
+pub const FILETYPE_SOCKET_DGRAM: Filetype = 5;
+/// The file descriptor or file refers to a byte-stream socket.
+pub const FILETYPE_SOCKET_STREAM: Filetype = 6;
+/// The file refers to a symbolic link inode.
+pub const FILETYPE_SYMBOLIC_LINK: Filetype = 7;
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub struct Dirent {
+ /// The offset of the next directory entry stored in this directory.
+ pub d_next: Dircookie,
+ /// The serial number of the file referred to by this directory entry.
+ pub d_ino: Inode,
+ /// The length of the name of the directory entry.
+ pub d_namlen: Dirnamlen,
+ /// The type of the file referred to by this directory entry.
+ pub d_type: Filetype,
+}
+pub type Advice = u8;
+/// The application has no advice to give on its behavior with respect to the specified data.
+pub const ADVICE_NORMAL: Advice = 0;
+/// The application expects to access the specified data sequentially from lower offsets to higher offsets.
+pub const ADVICE_SEQUENTIAL: Advice = 1;
+/// The application expects to access the specified data in a random order.
+pub const ADVICE_RANDOM: Advice = 2;
+/// The application expects to access the specified data in the near future.
+pub const ADVICE_WILLNEED: Advice = 3;
+/// The application expects that it will not access the specified data in the near future.
+pub const ADVICE_DONTNEED: Advice = 4;
+/// The application expects to access the specified data once and then not reuse it thereafter.
+pub const ADVICE_NOREUSE: Advice = 5;
+pub type Fdflags = u16;
+/// Append mode: Data written to the file is always appended to the file's end.
+pub const FDFLAGS_APPEND: Fdflags = 0x1;
+/// Write according to synchronized I/O data integrity completion. Only the data stored in the file is synchronized.
+pub const FDFLAGS_DSYNC: Fdflags = 0x2;
+/// Non-blocking mode.
+pub const FDFLAGS_NONBLOCK: Fdflags = 0x4;
+/// Synchronized read I/O operations.
+pub const FDFLAGS_RSYNC: Fdflags = 0x8;
+/// Write according to synchronized I/O file integrity completion. In
+/// addition to synchronizing the data stored in the file, the implementation
+/// may also synchronously update the file's metadata.
+pub const FDFLAGS_SYNC: Fdflags = 0x10;
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub struct Fdstat {
+ /// File type.
+ pub fs_filetype: Filetype,
+ /// File descriptor flags.
+ pub fs_flags: Fdflags,
+ /// Rights that apply to this file descriptor.
+ pub fs_rights_base: Rights,
+ /// Maximum set of rights that may be installed on new file descriptors that
+ /// are created through this file descriptor, e.g., through `path_open`.
+ pub fs_rights_inheriting: Rights,
+}
+pub type Device = u64;
+pub type Fstflags = u16;
+/// Adjust the last data access timestamp to the value stored in `filestat::st_atim`.
+pub const FSTFLAGS_ATIM: Fstflags = 0x1;
+/// Adjust the last data access timestamp to the time of clock `clock::realtime`.
+pub const FSTFLAGS_ATIM_NOW: Fstflags = 0x2;
+/// Adjust the last data modification timestamp to the value stored in `filestat::st_mtim`.
+pub const FSTFLAGS_MTIM: Fstflags = 0x4;
+/// Adjust the last data modification timestamp to the time of clock `clock::realtime`.
+pub const FSTFLAGS_MTIM_NOW: Fstflags = 0x8;
+pub type Lookupflags = u32;
+/// As long as the resolved path corresponds to a symbolic link, it is expanded.
+pub const LOOKUPFLAGS_SYMLINK_FOLLOW: Lookupflags = 0x1;
+pub type Oflags = u16;
+/// Create file if it does not exist.
+pub const OFLAGS_CREAT: Oflags = 0x1;
+/// Fail if not a directory.
+pub const OFLAGS_DIRECTORY: Oflags = 0x2;
+/// Fail if file already exists.
+pub const OFLAGS_EXCL: Oflags = 0x4;
+/// Truncate file to size 0.
+pub const OFLAGS_TRUNC: Oflags = 0x8;
+pub type Linkcount = u64;
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub struct Filestat {
+ /// Device ID of device containing the file.
+ pub dev: Device,
+ /// File serial number.
+ pub ino: Inode,
+ /// File type.
+ pub filetype: Filetype,
+ /// Number of hard links to the file.
+ pub nlink: Linkcount,
+ /// For regular files, the file size in bytes. For symbolic links, the length in bytes of the pathname contained in the symbolic link.
+ pub size: Filesize,
+ /// Last data access timestamp.
+ pub atim: Timestamp,
+ /// Last data modification timestamp.
+ pub mtim: Timestamp,
+ /// Last file status change timestamp.
+ pub ctim: Timestamp,
+}
+pub type Userdata = u64;
+pub type Eventtype = u8;
+/// The time value of clock `subscription::u.clock.clock_id` has
+/// reached timestamp `subscription::u.clock.timeout`.
+pub const EVENTTYPE_CLOCK: Eventtype = 0;
+/// File descriptor `subscription::u.fd_readwrite.fd` has data
+/// available for reading. This event always triggers for regular files.
+pub const EVENTTYPE_FD_READ: Eventtype = 1;
+/// File descriptor `subscription::u.fd_readwrite.fd` has capacity
+/// available for writing. This event always triggers for regular files.
+pub const EVENTTYPE_FD_WRITE: Eventtype = 2;
+pub type Eventrwflags = u16;
+/// The peer of this socket has closed or disconnected.
+pub const EVENTRWFLAGS_FD_READWRITE_HANGUP: Eventrwflags = 0x1;
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub struct EventFdReadwrite {
+ /// The number of bytes available for reading or writing.
+ pub nbytes: Filesize,
+ /// The state of the file descriptor.
+ pub flags: Eventrwflags,
+}
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub union EventU {
+ /// When type is `eventtype::fd_read` or `eventtype::fd_write`:
+ pub fd_readwrite: EventFdReadwrite,
+}
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub struct Event {
+ /// User-provided value that got attached to `subscription::userdata`.
+ pub userdata: Userdata,
+ /// If non-zero, an error that occurred while processing the subscription request.
+ pub error: Errno,
+ /// The type of the event that occurred.
+ pub r#type: Eventtype,
+ /// The contents of the event.
+ pub u: EventU,
+}
+pub type Subclockflags = u16;
+/// If set, treat the timestamp provided in
+/// `subscription::u.clock.timeout` as an absolute timestamp of clock
+/// `subscription::u.clock.clock_id.` If clear, treat the timestamp
+/// provided in `subscription::u.clock.timeout` relative to the
+/// current time value of clock `subscription::u.clock.clock_id.`
+pub const SUBCLOCKFLAGS_SUBSCRIPTION_CLOCK_ABSTIME: Subclockflags = 0x1;
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub struct SubscriptionClock {
+ /// The clock against which to compare the timestamp.
+ pub id: Clockid,
+ /// The absolute or relative timestamp.
+ pub timeout: Timestamp,
+ /// The amount of time that the implementation may wait additionally
+ /// to coalesce with other events.
+ pub precision: Timestamp,
+ /// Flags specifying whether the timeout is absolute or relative
+ pub flags: Subclockflags,
+}
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub struct SubscriptionFdReadwrite {
+ /// The file descriptor on which to wait for it to become ready for reading or writing.
+ pub file_descriptor: Fd,
+}
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub union SubscriptionU {
+ /// When type is `eventtype::clock`:
+ pub clock: SubscriptionClock,
+ /// When type is `eventtype::fd_read` or `eventtype::fd_write`:
+ pub fd_readwrite: SubscriptionFdReadwrite,
+}
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub struct Subscription {
+ /// User-provided value that is attached to the subscription in the
+ /// implementation and returned through `event::userdata`.
+ pub userdata: Userdata,
+ /// The type of the event to which to subscribe.
+ pub r#type: Eventtype,
+ /// The contents of the subscription.
+ pub u: SubscriptionU,
+}
+pub type Exitcode = u32;
+pub type Signal = u8;
+/// No signal. Note that POSIX has special semantics for `kill(pid, 0)`,
+/// so this value is reserved.
+pub const SIGNAL_NONE: Signal = 0;
+/// Hangup.
+/// Action: Terminates the process.
+pub const SIGNAL_HUP: Signal = 1;
+/// Terminate interrupt signal.
+/// Action: Terminates the process.
+pub const SIGNAL_INT: Signal = 2;
+/// Terminal quit signal.
+/// Action: Terminates the process.
+pub const SIGNAL_QUIT: Signal = 3;
+/// Illegal instruction.
+/// Action: Terminates the process.
+pub const SIGNAL_ILL: Signal = 4;
+/// Trace/breakpoint trap.
+/// Action: Terminates the process.
+pub const SIGNAL_TRAP: Signal = 5;
+/// Process abort signal.
+/// Action: Terminates the process.
+pub const SIGNAL_ABRT: Signal = 6;
+/// Access to an undefined portion of a memory object.
+/// Action: Terminates the process.
+pub const SIGNAL_BUS: Signal = 7;
+/// Erroneous arithmetic operation.
+/// Action: Terminates the process.
+pub const SIGNAL_FPE: Signal = 8;
+/// Kill.
+/// Action: Terminates the process.
+pub const SIGNAL_KILL: Signal = 9;
+/// User-defined signal 1.
+/// Action: Terminates the process.
+pub const SIGNAL_USR1: Signal = 10;
+/// Invalid memory reference.
+/// Action: Terminates the process.
+pub const SIGNAL_SEGV: Signal = 11;
+/// User-defined signal 2.
+/// Action: Terminates the process.
+pub const SIGNAL_USR2: Signal = 12;
+/// Write on a pipe with no one to read it.
+/// Action: Ignored.
+pub const SIGNAL_PIPE: Signal = 13;
+/// Alarm clock.
+/// Action: Terminates the process.
+pub const SIGNAL_ALRM: Signal = 14;
+/// Termination signal.
+/// Action: Terminates the process.
+pub const SIGNAL_TERM: Signal = 15;
+/// Child process terminated, stopped, or continued.
+/// Action: Ignored.
+pub const SIGNAL_CHLD: Signal = 16;
+/// Continue executing, if stopped.
+/// Action: Continues executing, if stopped.
+pub const SIGNAL_CONT: Signal = 17;
+/// Stop executing.
+/// Action: Stops executing.
+pub const SIGNAL_STOP: Signal = 18;
+/// Terminal stop signal.
+/// Action: Stops executing.
+pub const SIGNAL_TSTP: Signal = 19;
+/// Background process attempting read.
+/// Action: Stops executing.
+pub const SIGNAL_TTIN: Signal = 20;
+/// Background process attempting write.
+/// Action: Stops executing.
+pub const SIGNAL_TTOU: Signal = 21;
+/// High bandwidth data is available at a socket.
+/// Action: Ignored.
+pub const SIGNAL_URG: Signal = 22;
+/// CPU time limit exceeded.
+/// Action: Terminates the process.
+pub const SIGNAL_XCPU: Signal = 23;
+/// File size limit exceeded.
+/// Action: Terminates the process.
+pub const SIGNAL_XFSZ: Signal = 24;
+/// Virtual timer expired.
+/// Action: Terminates the process.
+pub const SIGNAL_VTALRM: Signal = 25;
+/// Profiling timer expired.
+/// Action: Terminates the process.
+pub const SIGNAL_PROF: Signal = 26;
+/// Window changed.
+/// Action: Ignored.
+pub const SIGNAL_WINCH: Signal = 27;
+/// I/O possible.
+/// Action: Terminates the process.
+pub const SIGNAL_POLL: Signal = 28;
+/// Power failure.
+/// Action: Terminates the process.
+pub const SIGNAL_PWR: Signal = 29;
+/// Bad system call.
+/// Action: Terminates the process.
+pub const SIGNAL_SYS: Signal = 30;
+pub type Riflags = u16;
+/// Returns the message without removing it from the socket's receive queue.
+pub const RIFLAGS_RECV_PEEK: Riflags = 0x1;
+/// On byte-stream sockets, block until the full amount of data can be returned.
+pub const RIFLAGS_RECV_WAITALL: Riflags = 0x2;
+pub type Roflags = u16;
+/// Returned by `sock_recv`: Message data has been truncated.
+pub const ROFLAGS_RECV_DATA_TRUNCATED: Roflags = 0x1;
+pub type Siflags = u16;
+pub type Sdflags = u8;
+/// Disables further receive operations.
+pub const SDFLAGS_RD: Sdflags = 0x1;
+/// Disables further send operations.
+pub const SDFLAGS_WR: Sdflags = 0x2;
+pub type Preopentype = u8;
+/// A pre-opened directory.
+pub const PREOPENTYPE_DIR: Preopentype = 0;
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub struct PrestatDir {
+ /// The length of the directory name for use with `fd_prestat_dir_name`.
+ pub pr_name_len: Size,
+}
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub union PrestatU {
+ /// When type is `preopentype::dir`:
+ pub dir: PrestatDir,
+}
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub struct Prestat {
+ /// The type of the pre-opened capability.
+ pub pr_type: Preopentype,
+ /// The contents of the information.
+ pub u: PrestatU,
+}
+/// Read command-line argument data.
+/// The size of the array should match that returned by `wasi_args_sizes_get()`
+pub unsafe fn args_get(argv: *mut *mut u8, argv_buf: *mut u8) -> Result<()> {
+ let rc = wasi_snapshot_preview1::args_get(argv, argv_buf);
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(())
+ }
+}
+
+/// Return command-line argument data sizes.
+///
+/// ## Return
+///
+/// * `argc` - The number of arguments.
+/// * `argv_buf_size` - The size of the argument string data.
+pub unsafe fn args_sizes_get() -> Result<(Size, Size)> {
+ let mut argc = MaybeUninit::uninit();
+ let mut argv_buf_size = MaybeUninit::uninit();
+ let rc = wasi_snapshot_preview1::args_sizes_get(argc.as_mut_ptr(), argv_buf_size.as_mut_ptr());
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok((argc.assume_init(), argv_buf_size.assume_init()))
+ }
+}
+
+/// Read environment variable data.
+/// The sizes of the buffers should match that returned by `environ.sizes_get()`.
+pub unsafe fn environ_get(environ: *mut *mut u8, environ_buf: *mut u8) -> Result<()> {
+ let rc = wasi_snapshot_preview1::environ_get(environ, environ_buf);
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(())
+ }
+}
+
+/// Return command-line argument data sizes.
+///
+/// ## Return
+///
+/// * `argc` - The number of arguments.
+/// * `argv_buf_size` - The size of the argument string data.
+pub unsafe fn environ_sizes_get() -> Result<(Size, Size)> {
+ let mut argc = MaybeUninit::uninit();
+ let mut argv_buf_size = MaybeUninit::uninit();
+ let rc =
+ wasi_snapshot_preview1::environ_sizes_get(argc.as_mut_ptr(), argv_buf_size.as_mut_ptr());
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok((argc.assume_init(), argv_buf_size.assume_init()))
+ }
+}
+
+/// Return the resolution of a clock.
+/// Implementations are required to provide a non-zero value for supported clocks. For unsupported clocks, return `WASI_EINVAL`
+/// Note: This is similar to `clock_getres` in POSIX.
+///
+/// ## Parameters
+///
+/// * `id` - The clock for which to return the resolution.
+///
+/// ## Return
+///
+/// * `resolution` - The resolution of the clock.
+pub unsafe fn clock_res_get(id: Clockid) -> Result<Timestamp> {
+ let mut resolution = MaybeUninit::uninit();
+ let rc = wasi_snapshot_preview1::clock_res_get(id, resolution.as_mut_ptr());
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(resolution.assume_init())
+ }
+}
+
+/// Return the time value of a clock.
+/// Note: This is similar to `clock_gettime` in POSIX.
+///
+/// ## Parameters
+///
+/// * `id` - The clock for which to return the time.
+/// * `precision` - The maximum lag (exclusive) that the returned time value may have, compared to its actual value.
+///
+/// ## Return
+///
+/// * `time` - The time value of the clock.
+pub unsafe fn clock_time_get(id: Clockid, precision: Timestamp) -> Result<Timestamp> {
+ let mut time = MaybeUninit::uninit();
+ let rc = wasi_snapshot_preview1::clock_time_get(id, precision, time.as_mut_ptr());
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(time.assume_init())
+ }
+}
+
+/// Provide file advisory information on a file descriptor.
+/// Note: This is similar to `posix_fadvise` in POSIX.
+///
+/// ## Parameters
+///
+/// * `offset` - The offset within the file to which the advisory applies.
+/// * `len` - The length of the region to which the advisory applies.
+/// * `advice` - The advice.
+pub unsafe fn fd_advise(fd: Fd, offset: Filesize, len: Filesize, advice: Advice) -> Result<()> {
+ let rc = wasi_snapshot_preview1::fd_advise(fd, offset, len, advice);
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(())
+ }
+}
+
+/// Force the allocation of space in a file.
+/// Note: This is similar to `posix_fallocate` in POSIX.
+///
+/// ## Parameters
+///
+/// * `offset` - The offset at which to start the allocation.
+/// * `len` - The length of the area that is allocated.
+pub unsafe fn fd_allocate(fd: Fd, offset: Filesize, len: Filesize) -> Result<()> {
+ let rc = wasi_snapshot_preview1::fd_allocate(fd, offset, len);
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(())
+ }
+}
+
+/// Close a file descriptor.
+/// Note: This is similar to `close` in POSIX.
+pub unsafe fn fd_close(fd: Fd) -> Result<()> {
+ let rc = wasi_snapshot_preview1::fd_close(fd);
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(())
+ }
+}
+
+/// Synchronize the data of a file to disk.
+/// Note: This is similar to `fdatasync` in POSIX.
+pub unsafe fn fd_datasync(fd: Fd) -> Result<()> {
+ let rc = wasi_snapshot_preview1::fd_datasync(fd);
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(())
+ }
+}
+
+/// Get the attributes of a file descriptor.
+/// Note: This returns similar flags to `fsync(fd, F_GETFL)` in POSIX, as well as additional fields.
+///
+/// ## Return
+///
+/// * `stat` - The buffer where the file descriptor's attributes are stored.
+pub unsafe fn fd_fdstat_get(fd: Fd) -> Result<Fdstat> {
+ let mut stat = MaybeUninit::uninit();
+ let rc = wasi_snapshot_preview1::fd_fdstat_get(fd, stat.as_mut_ptr());
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(stat.assume_init())
+ }
+}
+
+/// Adjust the flags associated with a file descriptor.
+/// Note: This is similar to `fcntl(fd, F_SETFL, flags)` in POSIX.
+///
+/// ## Parameters
+///
+/// * `flags` - The desired values of the file descriptor flags.
+pub unsafe fn fd_fdstat_set_flags(fd: Fd, flags: Fdflags) -> Result<()> {
+ let rc = wasi_snapshot_preview1::fd_fdstat_set_flags(fd, flags);
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(())
+ }
+}
+
+/// Adjust the rights associated with a file descriptor.
+/// This can only be used to remove rights, and returns `ENOTCAPABLE` if called in a way that would attempt to add rights
+///
+/// ## Parameters
+///
+/// * `fs_rights_base` - The desired rights of the file descriptor.
+pub unsafe fn fd_fdstat_set_rights(
+ fd: Fd,
+ fs_rights_base: Rights,
+ fs_rights_inheriting: Rights,
+) -> Result<()> {
+ let rc = wasi_snapshot_preview1::fd_fdstat_set_rights(fd, fs_rights_base, fs_rights_inheriting);
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(())
+ }
+}
+
+/// Return the attributes of an open file.
+///
+/// ## Return
+///
+/// * `buf` - The buffer where the file's attributes are stored.
+pub unsafe fn fd_filestat_get(fd: Fd) -> Result<Filestat> {
+ let mut buf = MaybeUninit::uninit();
+ let rc = wasi_snapshot_preview1::fd_filestat_get(fd, buf.as_mut_ptr());
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(buf.assume_init())
+ }
+}
+
+/// Adjust the size of an open file. If this increases the file's size, the extra bytes are filled with zeros.
+/// Note: This is similar to `ftruncate` in POSIX.
+///
+/// ## Parameters
+///
+/// * `size` - The desired file size.
+pub unsafe fn fd_filestat_set_size(fd: Fd, size: Filesize) -> Result<()> {
+ let rc = wasi_snapshot_preview1::fd_filestat_set_size(fd, size);
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(())
+ }
+}
+
+/// Adjust the timestamps of an open file or directory.
+/// Note: This is similar to `futimens` in POSIX.
+///
+/// ## Parameters
+///
+/// * `atim` - The desired values of the data access timestamp.
+/// * `mtim` - The desired values of the data modification timestamp.
+/// * `fst_flags` - A bitmask indicating which timestamps to adjust.
+pub unsafe fn fd_filestat_set_times(
+ fd: Fd,
+ atim: Timestamp,
+ mtim: Timestamp,
+ fst_flags: Fstflags,
+) -> Result<()> {
+ let rc = wasi_snapshot_preview1::fd_filestat_set_times(fd, atim, mtim, fst_flags);
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(())
+ }
+}
+
+/// Read from a file descriptor, without using and updating the file descriptor's offset.
+/// Note: This is similar to `preadv` in POSIX.
+///
+/// ## Parameters
+///
+/// * `iovs` - List of scatter/gather vectors in which to store data.
+/// * `offset` - The offset within the file at which to read.
+///
+/// ## Return
+///
+/// * `nread` - The number of bytes read.
+pub unsafe fn fd_pread(fd: Fd, iovs: IovecArray, offset: Filesize) -> Result<Size> {
+ let mut nread = MaybeUninit::uninit();
+ let rc =
+ wasi_snapshot_preview1::fd_pread(fd, iovs.as_ptr(), iovs.len(), offset, nread.as_mut_ptr());
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(nread.assume_init())
+ }
+}
+
+/// Return a description of the given preopened file descriptor.
+///
+/// ## Return
+///
+/// * `buf` - The buffer where the description is stored.
+pub unsafe fn fd_prestat_get(fd: Fd) -> Result<Prestat> {
+ let mut buf = MaybeUninit::uninit();
+ let rc = wasi_snapshot_preview1::fd_prestat_get(fd, buf.as_mut_ptr());
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(buf.assume_init())
+ }
+}
+
+/// Return a description of the given preopened file descriptor.
+///
+/// ## Parameters
+///
+/// * `path` - A buffer into which to write the preopened directory name.
+pub unsafe fn fd_prestat_dir_name(fd: Fd, path: *mut u8, path_len: Size) -> Result<()> {
+ let rc = wasi_snapshot_preview1::fd_prestat_dir_name(fd, path, path_len);
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(())
+ }
+}
+
+/// Write to a file descriptor, without using and updating the file descriptor's offset.
+/// Note: This is similar to `pwritev` in POSIX.
+///
+/// ## Parameters
+///
+/// * `iovs` - List of scatter/gather vectors from which to retrieve data.
+/// * `offset` - The offset within the file at which to write.
+///
+/// ## Return
+///
+/// * `nwritten` - The number of bytes written.
+pub unsafe fn fd_pwrite(fd: Fd, iovs: CiovecArray, offset: Filesize) -> Result<Size> {
+ let mut nwritten = MaybeUninit::uninit();
+ let rc = wasi_snapshot_preview1::fd_pwrite(
+ fd,
+ iovs.as_ptr(),
+ iovs.len(),
+ offset,
+ nwritten.as_mut_ptr(),
+ );
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(nwritten.assume_init())
+ }
+}
+
+/// Read from a file descriptor.
+/// Note: This is similar to `readv` in POSIX.
+///
+/// ## Parameters
+///
+/// * `iovs` - List of scatter/gather vectors to which to store data.
+///
+/// ## Return
+///
+/// * `nread` - The number of bytes read.
+pub unsafe fn fd_read(fd: Fd, iovs: IovecArray) -> Result<Size> {
+ let mut nread = MaybeUninit::uninit();
+ let rc = wasi_snapshot_preview1::fd_read(fd, iovs.as_ptr(), iovs.len(), nread.as_mut_ptr());
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(nread.assume_init())
+ }
+}
+
+/// Read directory entries from a directory.
+/// When successful, the contents of the output buffer consist of a sequence of
+/// directory entries. Each directory entry consists of a dirent_t object,
+/// followed by dirent_t::d_namlen bytes holding the name of the directory
+/// entry.
+/// This function fills the output buffer as much as possible, potentially
+/// truncating the last directory entry. This allows the caller to grow its
+/// read buffer size in case it's too small to fit a single large directory
+/// entry, or skip the oversized directory entry.
+///
+/// ## Parameters
+///
+/// * `buf` - The buffer where directory entries are stored
+/// * `cookie` - The location within the directory to start reading
+///
+/// ## Return
+///
+/// * `bufused` - The number of bytes stored in the read buffer. If less than the size of the read buffer, the end of the directory has been reached.
+pub unsafe fn fd_readdir(fd: Fd, buf: *mut u8, buf_len: Size, cookie: Dircookie) -> Result<Size> {
+ let mut bufused = MaybeUninit::uninit();
+ let rc = wasi_snapshot_preview1::fd_readdir(fd, buf, buf_len, cookie, bufused.as_mut_ptr());
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(bufused.assume_init())
+ }
+}
+
+/// Atomically replace a file descriptor by renumbering another file descriptor.
+/// Due to the strong focus on thread safety, this environment does not provide
+/// a mechanism to duplicate or renumber a file descriptor to an arbitrary
+/// number, like `dup2()`. This would be prone to race conditions, as an actual
+/// file descriptor with the same number could be allocated by a different
+/// thread at the same time.
+/// This function provides a way to atomically renumber file descriptors, which
+/// would disappear if `dup2()` were to be removed entirely.
+///
+/// ## Parameters
+///
+/// * `to` - The file descriptor to overwrite.
+pub unsafe fn fd_renumber(fd: Fd, to: Fd) -> Result<()> {
+ let rc = wasi_snapshot_preview1::fd_renumber(fd, to);
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(())
+ }
+}
+
+/// Move the offset of a file descriptor.
+/// Note: This is similar to `lseek` in POSIX.
+///
+/// ## Parameters
+///
+/// * `offset` - The number of bytes to move.
+/// * `whence` - The base from which the offset is relative.
+///
+/// ## Return
+///
+/// * `newoffset` - The new offset of the file descriptor, relative to the start of the file.
+pub unsafe fn fd_seek(fd: Fd, offset: Filedelta, whence: Whence) -> Result<Filesize> {
+ let mut newoffset = MaybeUninit::uninit();
+ let rc = wasi_snapshot_preview1::fd_seek(fd, offset, whence, newoffset.as_mut_ptr());
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(newoffset.assume_init())
+ }
+}
+
+/// Synchronize the data and metadata of a file to disk.
+/// Note: This is similar to `fsync` in POSIX.
+pub unsafe fn fd_sync(fd: Fd) -> Result<()> {
+ let rc = wasi_snapshot_preview1::fd_sync(fd);
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(())
+ }
+}
+
+/// Return the current offset of a file descriptor.
+/// Note: This is similar to `lseek(fd, 0, SEEK_CUR)` in POSIX.
+///
+/// ## Return
+///
+/// * `offset` - The current offset of the file descriptor, relative to the start of the file.
+pub unsafe fn fd_tell(fd: Fd) -> Result<Filesize> {
+ let mut offset = MaybeUninit::uninit();
+ let rc = wasi_snapshot_preview1::fd_tell(fd, offset.as_mut_ptr());
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(offset.assume_init())
+ }
+}
+
+/// Write to a file descriptor.
+/// Note: This is similar to `writev` in POSIX.
+///
+/// ## Parameters
+///
+/// * `iovs` - List of scatter/gather vectors from which to retrieve data.
+///
+/// ## Return
+///
+/// * `nwritten` - The number of bytes written.
+pub unsafe fn fd_write(fd: Fd, iovs: CiovecArray) -> Result<Size> {
+ let mut nwritten = MaybeUninit::uninit();
+ let rc = wasi_snapshot_preview1::fd_write(fd, iovs.as_ptr(), iovs.len(), nwritten.as_mut_ptr());
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(nwritten.assume_init())
+ }
+}
+
+/// Create a directory.
+/// Note: This is similar to `mkdirat` in POSIX.
+///
+/// ## Parameters
+///
+/// * `path` - The path at which to create the directory.
+pub unsafe fn path_create_directory(fd: Fd, path: &str) -> Result<()> {
+ let rc = wasi_snapshot_preview1::path_create_directory(fd, path.as_ptr(), path.len());
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(())
+ }
+}
+
+/// Return the attributes of a file or directory.
+/// Note: This is similar to `stat` in POSIX.
+///
+/// ## Parameters
+///
+/// * `flags` - Flags determining the method of how the path is resolved.
+/// * `path` - The path of the file or directory to inspect.
+///
+/// ## Return
+///
+/// * `buf` - The buffer where the file's attributes are stored.
+pub unsafe fn path_filestat_get(fd: Fd, flags: Lookupflags, path: &str) -> Result<Filestat> {
+ let mut buf = MaybeUninit::uninit();
+ let rc = wasi_snapshot_preview1::path_filestat_get(
+ fd,
+ flags,
+ path.as_ptr(),
+ path.len(),
+ buf.as_mut_ptr(),
+ );
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(buf.assume_init())
+ }
+}
+
+/// Adjust the timestamps of a file or directory.
+/// Note: This is similar to `utimensat` in POSIX.
+///
+/// ## Parameters
+///
+/// * `flags` - Flags determining the method of how the path is resolved.
+/// * `path` - The path of the file or directory to operate on.
+/// * `atim` - The desired values of the data access timestamp.
+/// * `mtim` - The desired values of the data modification timestamp.
+/// * `fst_flags` - A bitmask indicating which timestamps to adjust.
+pub unsafe fn path_filestat_set_times(
+ fd: Fd,
+ flags: Lookupflags,
+ path: &str,
+ atim: Timestamp,
+ mtim: Timestamp,
+ fst_flags: Fstflags,
+) -> Result<()> {
+ let rc = wasi_snapshot_preview1::path_filestat_set_times(
+ fd,
+ flags,
+ path.as_ptr(),
+ path.len(),
+ atim,
+ mtim,
+ fst_flags,
+ );
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(())
+ }
+}
+
+/// Create a hard link.
+/// Note: This is similar to `linkat` in POSIX.
+///
+/// ## Parameters
+///
+/// * `old_flags` - Flags determining the method of how the path is resolved.
+/// * `old_path` - The source path from which to link.
+/// * `new_fd` - The working directory at which the resolution of the new path starts.
+/// * `new_path` - The destination path at which to create the hard link.
+pub unsafe fn path_link(
+ old_fd: Fd,
+ old_flags: Lookupflags,
+ old_path: &str,
+ new_fd: Fd,
+ new_path: &str,
+) -> Result<()> {
+ let rc = wasi_snapshot_preview1::path_link(
+ old_fd,
+ old_flags,
+ old_path.as_ptr(),
+ old_path.len(),
+ new_fd,
+ new_path.as_ptr(),
+ new_path.len(),
+ );
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(())
+ }
+}
+
+/// Open a file or directory.
+/// The returned file descriptor is not guaranteed to be the lowest-numbered
+/// file descriptor not currently open; it is randomized to prevent
+/// applications from depending on making assumptions about indexes, since this
+/// is error-prone in multi-threaded contexts. The returned file descriptor is
+/// guaranteed to be less than 2**31.
+/// Note: This is similar to `openat` in POSIX.
+///
+/// ## Parameters
+///
+/// * `dirflags` - Flags determining the method of how the path is resolved.
+/// * `path` - The relative path of the file or directory to open, relative to the
+/// `dirfd` directory.
+/// * `oflags` - The method by which to open the file.
+/// * `fs_rights_base` - The initial rights of the newly created file descriptor. The
+/// implementation is allowed to return a file descriptor with fewer rights
+/// than specified, if and only if those rights do not apply to the type of
+/// file being opened.
+/// The *base* rights are rights that will apply to operations using the file
+/// descriptor itself, while the *inheriting* rights are rights that apply to
+/// file descriptors derived from it.
+///
+/// ## Return
+///
+/// * `opened_fd` - The file descriptor of the file that has been opened.
+pub unsafe fn path_open(
+ fd: Fd,
+ dirflags: Lookupflags,
+ path: &str,
+ oflags: Oflags,
+ fs_rights_base: Rights,
+ fs_rights_inherting: Rights,
+ fdflags: Fdflags,
+) -> Result<Fd> {
+ let mut opened_fd = MaybeUninit::uninit();
+ let rc = wasi_snapshot_preview1::path_open(
+ fd,
+ dirflags,
+ path.as_ptr(),
+ path.len(),
+ oflags,
+ fs_rights_base,
+ fs_rights_inherting,
+ fdflags,
+ opened_fd.as_mut_ptr(),
+ );
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(opened_fd.assume_init())
+ }
+}
+
+/// Read the contents of a symbolic link.
+/// Note: This is similar to `readlinkat` in POSIX.
+///
+/// ## Parameters
+///
+/// * `path` - The path of the symbolic link from which to read.
+/// * `buf` - The buffer to which to write the contents of the symbolic link.
+///
+/// ## Return
+///
+/// * `bufused` - The number of bytes placed in the buffer.
+pub unsafe fn path_readlink(fd: Fd, path: &str, buf: *mut u8, buf_len: Size) -> Result<Size> {
+ let mut bufused = MaybeUninit::uninit();
+ let rc = wasi_snapshot_preview1::path_readlink(
+ fd,
+ path.as_ptr(),
+ path.len(),
+ buf,
+ buf_len,
+ bufused.as_mut_ptr(),
+ );
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(bufused.assume_init())
+ }
+}
+
+/// Remove a directory.
+/// Return `ENOTEMPTY` if the directory is not empty.
+/// Note: This is similar to `unlinkat(fd, path, AT_REMOVEDIR)` in POSIX.
+///
+/// ## Parameters
+///
+/// * `path` - The path to a directory to remove.
+pub unsafe fn path_remove_directory(fd: Fd, path: &str) -> Result<()> {
+ let rc = wasi_snapshot_preview1::path_remove_directory(fd, path.as_ptr(), path.len());
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(())
+ }
+}
+
+/// Rename a file or directory.
+/// Note: This is similar to `renameat` in POSIX.
+///
+/// ## Parameters
+///
+/// * `old_path` - The source path of the file or directory to rename.
+/// * `new_fd` - The working directory at which the resolution of the new path starts.
+/// * `new_path` - The destination path to which to rename the file or directory.
+pub unsafe fn path_rename(fd: Fd, old_path: &str, new_fd: Fd, new_path: &str) -> Result<()> {
+ let rc = wasi_snapshot_preview1::path_rename(
+ fd,
+ old_path.as_ptr(),
+ old_path.len(),
+ new_fd,
+ new_path.as_ptr(),
+ new_path.len(),
+ );
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(())
+ }
+}
+
+/// Create a symbolic link.
+/// Note: This is similar to `symlinkat` in POSIX.
+///
+/// ## Parameters
+///
+/// * `old_path` - The contents of the symbolic link.
+/// * `new_path` - The destination path at which to create the symbolic link.
+pub unsafe fn path_symlink(old_path: &str, fd: Fd, new_path: &str) -> Result<()> {
+ let rc = wasi_snapshot_preview1::path_symlink(
+ old_path.as_ptr(),
+ old_path.len(),
+ fd,
+ new_path.as_ptr(),
+ new_path.len(),
+ );
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(())
+ }
+}
+
+/// Unlink a file.
+/// Return `EISDIR` if the path refers to a directory.
+/// Note: This is similar to `unlinkat(fd, path, 0)` in POSIX.
+///
+/// ## Parameters
+///
+/// * `path` - The path to a file to unlink.
+pub unsafe fn path_unlink_file(fd: Fd, path: &str) -> Result<()> {
+ let rc = wasi_snapshot_preview1::path_unlink_file(fd, path.as_ptr(), path.len());
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(())
+ }
+}
+
+/// Concurrently poll for the occurrence of a set of events.
+///
+/// ## Parameters
+///
+/// * `r#in` - The events to which to subscribe.
+/// * `out` - The events that have occurred.
+/// * `nsubscriptions` - Both the number of subscriptions and events.
+///
+/// ## Return
+///
+/// * `nevents` - The number of events stored.
+pub unsafe fn poll_oneoff(
+ r#in: *const Subscription,
+ out: *mut Event,
+ nsubscriptions: Size,
+) -> Result<Size> {
+ let mut nevents = MaybeUninit::uninit();
+ let rc = wasi_snapshot_preview1::poll_oneoff(r#in, out, nsubscriptions, nevents.as_mut_ptr());
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(nevents.assume_init())
+ }
+}
+
+/// 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.
+///
+/// ## Parameters
+///
+/// * `rval` - The exit code returned by the process.
+pub unsafe fn proc_exit(rval: Exitcode) {
+ wasi_snapshot_preview1::proc_exit(rval);
+}
+
+/// Send a signal to the process of the calling thread.
+/// Note: This is similar to `raise` in POSIX.
+///
+/// ## Parameters
+///
+/// * `sig` - The signal condition to trigger.
+pub unsafe fn proc_raise(sig: Signal) -> Result<()> {
+ let rc = wasi_snapshot_preview1::proc_raise(sig);
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(())
+ }
+}
+
+/// Temporarily yield execution of the calling thread.
+/// Note: This is similar to `sched_yield` in POSIX.
+pub unsafe fn sched_yield() -> Result<()> {
+ let rc = wasi_snapshot_preview1::sched_yield();
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(())
+ }
+}
+
+/// Write high-quality random data into a buffer.
+/// This function blocks when the implementation is unable to immediately
+/// provide sufficient high-quality random data.
+/// This function may execute slowly, so when large mounts of random data are
+/// required, it's advisable to use this function to seed a pseudo-random
+/// number generator, rather than to provide the random data directly.
+///
+/// ## Parameters
+///
+/// * `buf` - The buffer to fill with random data.
+pub unsafe fn random_get(buf: *mut u8, buf_len: Size) -> Result<()> {
+ let rc = wasi_snapshot_preview1::random_get(buf, buf_len);
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(())
+ }
+}
+
+/// Receive a message from a socket.
+/// Note: This is similar to `recv` in POSIX, though it also supports reading
+/// the data into multiple buffers in the manner of `readv`.
+///
+/// ## Parameters
+///
+/// * `ri_data` - List of scatter/gather vectors to which to store data.
+/// * `ri_flags` - Message flags.
+///
+/// ## Return
+///
+/// * `ro_datalen` - Number of bytes stored in ri_data.
+/// * `ro_flags` - Message flags.
+pub unsafe fn sock_recv(fd: Fd, ri_data: IovecArray, ri_flags: Riflags) -> Result<(Size, Roflags)> {
+ let mut ro_datalen = MaybeUninit::uninit();
+ let mut ro_flags = MaybeUninit::uninit();
+ let rc = wasi_snapshot_preview1::sock_recv(
+ fd,
+ ri_data.as_ptr(),
+ ri_data.len(),
+ ri_flags,
+ ro_datalen.as_mut_ptr(),
+ ro_flags.as_mut_ptr(),
+ );
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok((ro_datalen.assume_init(), ro_flags.assume_init()))
+ }
+}
+
+/// Send a message on a socket.
+/// Note: This is similar to `send` in POSIX, though it also supports writing
+/// the data from multiple buffers in the manner of `writev`.
+///
+/// ## Parameters
+///
+/// * `si_data` - List of scatter/gather vectors to which to retrieve data
+/// * `si_flags` - Message flags.
+///
+/// ## Return
+///
+/// * `so_datalen` - Number of bytes transmitted.
+pub unsafe fn sock_send(fd: Fd, si_data: CiovecArray, si_flags: Siflags) -> Result<Size> {
+ let mut so_datalen = MaybeUninit::uninit();
+ let rc = wasi_snapshot_preview1::sock_send(
+ fd,
+ si_data.as_ptr(),
+ si_data.len(),
+ si_flags,
+ so_datalen.as_mut_ptr(),
+ );
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(so_datalen.assume_init())
+ }
+}
+
+/// Shut down socket send and receive channels.
+/// Note: This is similar to `shutdown` in POSIX.
+///
+/// ## Parameters
+///
+/// * `how` - Which channels on the socket to shut down.
+pub unsafe fn sock_shutdown(fd: Fd, how: Sdflags) -> Result<()> {
+ let rc = wasi_snapshot_preview1::sock_shutdown(fd, how);
+ if let Some(err) = Error::from_raw_error(rc) {
+ Err(err)
+ } else {
+ Ok(())
+ }
+}
+
+pub mod wasi_snapshot_preview1 {
+ use super::*;
+ #[link(wasm_import_module = "wasi_snapshot_preview1")]
+ extern "C" {
+ /// Read command-line argument data.
+ /// The size of the array should match that returned by `wasi_args_sizes_get()`
+ pub fn args_get(argv: *mut *mut u8, argv_buf: *mut u8) -> Errno;
+ /// Return command-line argument data sizes.
+ pub fn args_sizes_get(argc: *mut Size, argv_buf_size: *mut Size) -> Errno;
+ /// Read environment variable data.
+ /// The sizes of the buffers should match that returned by `environ.sizes_get()`.
+ pub fn environ_get(environ: *mut *mut u8, environ_buf: *mut u8) -> Errno;
+ /// Return command-line argument data sizes.
+ pub fn environ_sizes_get(argc: *mut Size, argv_buf_size: *mut Size) -> Errno;
+ /// Return the resolution of a clock.
+ /// Implementations are required to provide a non-zero value for supported clocks. For unsupported clocks, return `WASI_EINVAL`
+ /// Note: This is similar to `clock_getres` in POSIX.
+ pub fn clock_res_get(id: Clockid, resolution: *mut Timestamp) -> Errno;
+ /// Return the time value of a clock.
+ /// Note: This is similar to `clock_gettime` in POSIX.
+ pub fn clock_time_get(id: Clockid, precision: Timestamp, time: *mut Timestamp) -> Errno;
+ /// Provide file advisory information on a file descriptor.
+ /// Note: This is similar to `posix_fadvise` in POSIX.
+ pub fn fd_advise(fd: Fd, offset: Filesize, len: Filesize, advice: Advice) -> Errno;
+ /// Force the allocation of space in a file.
+ /// Note: This is similar to `posix_fallocate` in POSIX.
+ pub fn fd_allocate(fd: Fd, offset: Filesize, len: Filesize) -> Errno;
+ /// Close a file descriptor.
+ /// Note: This is similar to `close` in POSIX.
+ pub fn fd_close(fd: Fd) -> Errno;
+ /// Synchronize the data of a file to disk.
+ /// Note: This is similar to `fdatasync` in POSIX.
+ pub fn fd_datasync(fd: Fd) -> Errno;
+ /// Get the attributes of a file descriptor.
+ /// Note: This returns similar flags to `fsync(fd, F_GETFL)` in POSIX, as well as additional fields.
+ pub fn fd_fdstat_get(fd: Fd, stat: *mut Fdstat) -> Errno;
+ /// Adjust the flags associated with a file descriptor.
+ /// Note: This is similar to `fcntl(fd, F_SETFL, flags)` in POSIX.
+ pub fn fd_fdstat_set_flags(fd: Fd, flags: Fdflags) -> Errno;
+ /// Adjust the rights associated with a file descriptor.
+ /// This can only be used to remove rights, and returns `ENOTCAPABLE` if called in a way that would attempt to add rights
+ pub fn fd_fdstat_set_rights(
+ fd: Fd,
+ fs_rights_base: Rights,
+ fs_rights_inheriting: Rights,
+ ) -> Errno;
+ /// Return the attributes of an open file.
+ pub fn fd_filestat_get(fd: Fd, buf: *mut Filestat) -> Errno;
+ /// Adjust the size of an open file. If this increases the file's size, the extra bytes are filled with zeros.
+ /// Note: This is similar to `ftruncate` in POSIX.
+ pub fn fd_filestat_set_size(fd: Fd, size: Filesize) -> Errno;
+ /// Adjust the timestamps of an open file or directory.
+ /// Note: This is similar to `futimens` in POSIX.
+ pub fn fd_filestat_set_times(
+ fd: Fd,
+ atim: Timestamp,
+ mtim: Timestamp,
+ fst_flags: Fstflags,
+ ) -> Errno;
+ /// Read from a file descriptor, without using and updating the file descriptor's offset.
+ /// Note: This is similar to `preadv` in POSIX.
+ pub fn fd_pread(
+ fd: Fd,
+ iovs_ptr: *const Iovec,
+ iovs_len: usize,
+ offset: Filesize,
+ nread: *mut Size,
+ ) -> Errno;
+ /// Return a description of the given preopened file descriptor.
+ pub fn fd_prestat_get(fd: Fd, buf: *mut Prestat) -> Errno;
+ /// Return a description of the given preopened file descriptor.
+ pub fn fd_prestat_dir_name(fd: Fd, path: *mut u8, path_len: Size) -> Errno;
+ /// Write to a file descriptor, without using and updating the file descriptor's offset.
+ /// Note: This is similar to `pwritev` in POSIX.
+ pub fn fd_pwrite(
+ fd: Fd,
+ iovs_ptr: *const Ciovec,
+ iovs_len: usize,
+ offset: Filesize,
+ nwritten: *mut Size,
+ ) -> Errno;
+ /// Read from a file descriptor.
+ /// Note: This is similar to `readv` in POSIX.
+ pub fn fd_read(fd: Fd, iovs_ptr: *const Iovec, iovs_len: usize, nread: *mut Size) -> Errno;
+ /// Read directory entries from a directory.
+ /// When successful, the contents of the output buffer consist of a sequence of
+ /// directory entries. Each directory entry consists of a dirent_t object,
+ /// followed by dirent_t::d_namlen bytes holding the name of the directory
+ /// entry.
+ /// This function fills the output buffer as much as possible, potentially
+ /// truncating the last directory entry. This allows the caller to grow its
+ /// read buffer size in case it's too small to fit a single large directory
+ /// entry, or skip the oversized directory entry.
+ pub fn fd_readdir(
+ fd: Fd,
+ buf: *mut u8,
+ buf_len: Size,
+ cookie: Dircookie,
+ bufused: *mut Size,
+ ) -> Errno;
+ /// Atomically replace a file descriptor by renumbering another file descriptor.
+ /// Due to the strong focus on thread safety, this environment does not provide
+ /// a mechanism to duplicate or renumber a file descriptor to an arbitrary
+ /// number, like `dup2()`. This would be prone to race conditions, as an actual
+ /// file descriptor with the same number could be allocated by a different
+ /// thread at the same time.
+ /// This function provides a way to atomically renumber file descriptors, which
+ /// would disappear if `dup2()` were to be removed entirely.
+ pub fn fd_renumber(fd: Fd, to: Fd) -> Errno;
+ /// Move the offset of a file descriptor.
+ /// Note: This is similar to `lseek` in POSIX.
+ pub fn fd_seek(
+ fd: Fd,
+ offset: Filedelta,
+ whence: Whence,
+ newoffset: *mut Filesize,
+ ) -> Errno;
+ /// Synchronize the data and metadata of a file to disk.
+ /// Note: This is similar to `fsync` in POSIX.
+ pub fn fd_sync(fd: Fd) -> Errno;
+ /// Return the current offset of a file descriptor.
+ /// Note: This is similar to `lseek(fd, 0, SEEK_CUR)` in POSIX.
+ pub fn fd_tell(fd: Fd, offset: *mut Filesize) -> Errno;
+ /// Write to a file descriptor.
+ /// Note: This is similar to `writev` in POSIX.
+ pub fn fd_write(
+ fd: Fd,
+ iovs_ptr: *const Ciovec,
+ iovs_len: usize,
+ nwritten: *mut Size,
+ ) -> Errno;
+ /// Create a directory.
+ /// Note: This is similar to `mkdirat` in POSIX.
+ pub fn path_create_directory(fd: Fd, path_ptr: *const u8, path_len: usize) -> Errno;
+ /// Return the attributes of a file or directory.
+ /// Note: This is similar to `stat` in POSIX.
+ pub fn path_filestat_get(
+ fd: Fd,
+ flags: Lookupflags,
+ path_ptr: *const u8,
+ path_len: usize,
+ buf: *mut Filestat,
+ ) -> Errno;
+ /// Adjust the timestamps of a file or directory.
+ /// Note: This is similar to `utimensat` in POSIX.
+ pub fn path_filestat_set_times(
+ fd: Fd,
+ flags: Lookupflags,
+ path_ptr: *const u8,
+ path_len: usize,
+ atim: Timestamp,
+ mtim: Timestamp,
+ fst_flags: Fstflags,
+ ) -> Errno;
+ /// Create a hard link.
+ /// Note: This is similar to `linkat` in POSIX.
+ pub fn path_link(
+ old_fd: Fd,
+ old_flags: Lookupflags,
+ old_path_ptr: *const u8,
+ old_path_len: usize,
+ new_fd: Fd,
+ new_path_ptr: *const u8,
+ new_path_len: usize,
+ ) -> Errno;
+ /// Open a file or directory.
+ /// The returned file descriptor is not guaranteed to be the lowest-numbered
+ /// file descriptor not currently open; it is randomized to prevent
+ /// applications from depending on making assumptions about indexes, since this
+ /// is error-prone in multi-threaded contexts. The returned file descriptor is
+ /// guaranteed to be less than 2**31.
+ /// Note: This is similar to `openat` in POSIX.
+ pub fn path_open(
+ fd: Fd,
+ dirflags: Lookupflags,
+ path_ptr: *const u8,
+ path_len: usize,
+ oflags: Oflags,
+ fs_rights_base: Rights,
+ fs_rights_inherting: Rights,
+ fdflags: Fdflags,
+ opened_fd: *mut Fd,
+ ) -> Errno;
+ /// Read the contents of a symbolic link.
+ /// Note: This is similar to `readlinkat` in POSIX.
+ pub fn path_readlink(
+ fd: Fd,
+ path_ptr: *const u8,
+ path_len: usize,
+ buf: *mut u8,
+ buf_len: Size,
+ bufused: *mut Size,
+ ) -> Errno;
+ /// Remove a directory.
+ /// Return `ENOTEMPTY` if the directory is not empty.
+ /// Note: This is similar to `unlinkat(fd, path, AT_REMOVEDIR)` in POSIX.
+ pub fn path_remove_directory(fd: Fd, path_ptr: *const u8, path_len: usize) -> Errno;
+ /// Rename a file or directory.
+ /// Note: This is similar to `renameat` in POSIX.
+ pub fn path_rename(
+ fd: Fd,
+ old_path_ptr: *const u8,
+ old_path_len: usize,
+ new_fd: Fd,
+ new_path_ptr: *const u8,
+ new_path_len: usize,
+ ) -> Errno;
+ /// Create a symbolic link.
+ /// Note: This is similar to `symlinkat` in POSIX.
+ pub fn path_symlink(
+ old_path_ptr: *const u8,
+ old_path_len: usize,
+ fd: Fd,
+ new_path_ptr: *const u8,
+ new_path_len: usize,
+ ) -> Errno;
+ /// Unlink a file.
+ /// Return `EISDIR` if the path refers to a directory.
+ /// Note: This is similar to `unlinkat(fd, path, 0)` in POSIX.
+ pub fn path_unlink_file(fd: Fd, path_ptr: *const u8, path_len: usize) -> Errno;
+ /// Concurrently poll for the occurrence of a set of events.
+ pub fn poll_oneoff(
+ r#in: *const Subscription,
+ out: *mut Event,
+ nsubscriptions: Size,
+ nevents: *mut Size,
+ ) -> 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.
+ pub fn proc_exit(rval: Exitcode) -> !;
+ /// Send a signal to the process of the calling thread.
+ /// Note: This is similar to `raise` in POSIX.
+ pub fn proc_raise(sig: Signal) -> Errno;
+ /// Temporarily yield execution of the calling thread.
+ /// Note: This is similar to `sched_yield` in POSIX.
+ pub fn sched_yield() -> Errno;
+ /// Write high-quality random data into a buffer.
+ /// This function blocks when the implementation is unable to immediately
+ /// provide sufficient high-quality random data.
+ /// This function may execute slowly, so when large mounts of random data are
+ /// required, it's advisable to use this function to seed a pseudo-random
+ /// number generator, rather than to provide the random data directly.
+ pub fn random_get(buf: *mut u8, buf_len: Size) -> Errno;
+ /// Receive a message from a socket.
+ /// Note: This is similar to `recv` in POSIX, though it also supports reading
+ /// the data into multiple buffers in the manner of `readv`.
+ pub fn sock_recv(
+ fd: Fd,
+ ri_data_ptr: *const Iovec,
+ ri_data_len: usize,
+ ri_flags: Riflags,
+ ro_datalen: *mut Size,
+ ro_flags: *mut Roflags,
+ ) -> Errno;
+ /// Send a message on a socket.
+ /// Note: This is similar to `send` in POSIX, though it also supports writing
+ /// the data from multiple buffers in the manner of `writev`.
+ pub fn sock_send(
+ fd: Fd,
+ si_data_ptr: *const Ciovec,
+ si_data_len: usize,
+ si_flags: Siflags,
+ so_datalen: *mut Size,
+ ) -> Errno;
+ /// Shut down socket send and receive channels.
+ /// Note: This is similar to `shutdown` in POSIX.
+ pub fn sock_shutdown(fd: Fd, how: Sdflags) -> Errno;
+ }
+}