1/**
   2 * <wasi/api.h>. This file contains declarations describing the WASI ABI
   3 * as of "snapshot preview1". It was originally auto-generated from
   4 * wasi_snapshot_preview1.witx, however WASI is in the process of
   5 * transitioning to a new IDL and header file generator, and this file
   6 * is temporarily being manually maintained.
   7 *
   8 * @file
   9 * This file describes the [WASI] interface, consisting of functions, types,
  10 * and defined values (macros).
  11 *
  12 * The interface described here is greatly inspired by [CloudABI]'s clean,
  13 * thoughtfully-designed, capability-oriented, POSIX-style API.
  14 *
  15 * [CloudABI]: https://github.com/NuxiNL/cloudlibc
  16 * [WASI]: https://github.com/WebAssembly/WASI/
  17 */
  18
  19#ifndef __wasi_api_h
  20#define __wasi_api_h
  21
  22#ifndef __wasi__
  23#error <wasi/api.h> is only supported on WASI platforms.
  24#endif
  25
  26#ifndef __wasm32__
  27#error <wasi/api.h> only supports wasm32; doesn't yet support wasm64
  28#endif
  29
  30#include <stddef.h>
  31#include <stdint.h>
  32
  33_Static_assert(_Alignof(int8_t) == 1, "non-wasi data layout");
  34_Static_assert(_Alignof(uint8_t) == 1, "non-wasi data layout");
  35_Static_assert(_Alignof(int16_t) == 2, "non-wasi data layout");
  36_Static_assert(_Alignof(uint16_t) == 2, "non-wasi data layout");
  37_Static_assert(_Alignof(int32_t) == 4, "non-wasi data layout");
  38_Static_assert(_Alignof(uint32_t) == 4, "non-wasi data layout");
  39_Static_assert(_Alignof(int64_t) == 8, "non-wasi data layout");
  40_Static_assert(_Alignof(uint64_t) == 8, "non-wasi data layout");
  41_Static_assert(_Alignof(void*) == 4, "non-wasi data layout");
  42
  43#ifdef __cplusplus
  44extern "C" {
  45#endif
  46
  47// TODO: Encoding this in witx.
  48#define __WASI_DIRCOOKIE_START (UINT64_C(0))
  49typedef __SIZE_TYPE__ __wasi_size_t;
  50
  51_Static_assert(sizeof(__wasi_size_t) == 4, "witx calculated size");
  52_Static_assert(_Alignof(__wasi_size_t) == 4, "witx calculated align");
  53
  54/**
  55 * Non-negative file size or length of a region within a file.
  56 */
  57typedef uint64_t __wasi_filesize_t;
  58
  59_Static_assert(sizeof(__wasi_filesize_t) == 8, "witx calculated size");
  60_Static_assert(_Alignof(__wasi_filesize_t) == 8, "witx calculated align");
  61
  62/**
  63 * Timestamp in nanoseconds.
  64 */
  65typedef uint64_t __wasi_timestamp_t;
  66
  67_Static_assert(sizeof(__wasi_timestamp_t) == 8, "witx calculated size");
  68_Static_assert(_Alignof(__wasi_timestamp_t) == 8, "witx calculated align");
  69
  70/**
  71 * Identifiers for clocks.
  72 */
  73typedef uint32_t __wasi_clockid_t;
  74
  75/**
  76 * The clock measuring real time. Time value zero corresponds with
  77 * 1970-01-01T00:00:00Z.
  78 */
  79#define __WASI_CLOCKID_REALTIME (UINT32_C(0))
  80
  81/**
  82 * The store-wide monotonic clock, which is defined as a clock measuring
  83 * real time, whose value cannot be adjusted and which cannot have negative
  84 * clock jumps. The epoch of this clock is undefined. The absolute time
  85 * value of this clock therefore has no meaning.
  86 */
  87#define __WASI_CLOCKID_MONOTONIC (UINT32_C(1))
  88
  89/**
  90 * The CPU-time clock associated with the current process.
  91 */
  92#define __WASI_CLOCKID_PROCESS_CPUTIME_ID (UINT32_C(2))
  93
  94/**
  95 * The CPU-time clock associated with the current thread.
  96 */
  97#define __WASI_CLOCKID_THREAD_CPUTIME_ID (UINT32_C(3))
  98
  99_Static_assert(sizeof(__wasi_clockid_t) == 4, "witx calculated size");
 100_Static_assert(_Alignof(__wasi_clockid_t) == 4, "witx calculated align");
 101
 102/**
 103 * Error codes returned by functions.
 104 * Not all of these error codes are returned by the functions provided by this
 105 * API; some are used in higher-level library layers, and others are provided
 106 * merely for alignment with POSIX.
 107 */
 108typedef uint16_t __wasi_errno_t;
 109
 110/**
 111 * No error occurred. System call completed successfully.
 112 */
 113#define __WASI_ERRNO_SUCCESS (UINT16_C(0))
 114
 115/**
 116 * Argument list too long.
 117 */
 118#define __WASI_ERRNO_2BIG (UINT16_C(1))
 119
 120/**
 121 * Permission denied.
 122 */
 123#define __WASI_ERRNO_ACCES (UINT16_C(2))
 124
 125/**
 126 * Address in use.
 127 */
 128#define __WASI_ERRNO_ADDRINUSE (UINT16_C(3))
 129
 130/**
 131 * Address not available.
 132 */
 133#define __WASI_ERRNO_ADDRNOTAVAIL (UINT16_C(4))
 134
 135/**
 136 * Address family not supported.
 137 */
 138#define __WASI_ERRNO_AFNOSUPPORT (UINT16_C(5))
 139
 140/**
 141 * Resource unavailable, or operation would block.
 142 */
 143#define __WASI_ERRNO_AGAIN (UINT16_C(6))
 144
 145/**
 146 * Connection already in progress.
 147 */
 148#define __WASI_ERRNO_ALREADY (UINT16_C(7))
 149
 150/**
 151 * Bad file descriptor.
 152 */
 153#define __WASI_ERRNO_BADF (UINT16_C(8))
 154
 155/**
 156 * Bad message.
 157 */
 158#define __WASI_ERRNO_BADMSG (UINT16_C(9))
 159
 160/**
 161 * Device or resource busy.
 162 */
 163#define __WASI_ERRNO_BUSY (UINT16_C(10))
 164
 165/**
 166 * Operation canceled.
 167 */
 168#define __WASI_ERRNO_CANCELED (UINT16_C(11))
 169
 170/**
 171 * No child processes.
 172 */
 173#define __WASI_ERRNO_CHILD (UINT16_C(12))
 174
 175/**
 176 * Connection aborted.
 177 */
 178#define __WASI_ERRNO_CONNABORTED (UINT16_C(13))
 179
 180/**
 181 * Connection refused.
 182 */
 183#define __WASI_ERRNO_CONNREFUSED (UINT16_C(14))
 184
 185/**
 186 * Connection reset.
 187 */
 188#define __WASI_ERRNO_CONNRESET (UINT16_C(15))
 189
 190/**
 191 * Resource deadlock would occur.
 192 */
 193#define __WASI_ERRNO_DEADLK (UINT16_C(16))
 194
 195/**
 196 * Destination address required.
 197 */
 198#define __WASI_ERRNO_DESTADDRREQ (UINT16_C(17))
 199
 200/**
 201 * Mathematics argument out of domain of function.
 202 */
 203#define __WASI_ERRNO_DOM (UINT16_C(18))
 204
 205/**
 206 * Reserved.
 207 */
 208#define __WASI_ERRNO_DQUOT (UINT16_C(19))
 209
 210/**
 211 * File exists.
 212 */
 213#define __WASI_ERRNO_EXIST (UINT16_C(20))
 214
 215/**
 216 * Bad address.
 217 */
 218#define __WASI_ERRNO_FAULT (UINT16_C(21))
 219
 220/**
 221 * File too large.
 222 */
 223#define __WASI_ERRNO_FBIG (UINT16_C(22))
 224
 225/**
 226 * Host is unreachable.
 227 */
 228#define __WASI_ERRNO_HOSTUNREACH (UINT16_C(23))
 229
 230/**
 231 * Identifier removed.
 232 */
 233#define __WASI_ERRNO_IDRM (UINT16_C(24))
 234
 235/**
 236 * Illegal byte sequence.
 237 */
 238#define __WASI_ERRNO_ILSEQ (UINT16_C(25))
 239
 240/**
 241 * Operation in progress.
 242 */
 243#define __WASI_ERRNO_INPROGRESS (UINT16_C(26))
 244
 245/**
 246 * Interrupted function.
 247 */
 248#define __WASI_ERRNO_INTR (UINT16_C(27))
 249
 250/**
 251 * Invalid argument.
 252 */
 253#define __WASI_ERRNO_INVAL (UINT16_C(28))
 254
 255/**
 256 * I/O error.
 257 */
 258#define __WASI_ERRNO_IO (UINT16_C(29))
 259
 260/**
 261 * Socket is connected.
 262 */
 263#define __WASI_ERRNO_ISCONN (UINT16_C(30))
 264
 265/**
 266 * Is a directory.
 267 */
 268#define __WASI_ERRNO_ISDIR (UINT16_C(31))
 269
 270/**
 271 * Too many levels of symbolic links.
 272 */
 273#define __WASI_ERRNO_LOOP (UINT16_C(32))
 274
 275/**
 276 * File descriptor value too large.
 277 */
 278#define __WASI_ERRNO_MFILE (UINT16_C(33))
 279
 280/**
 281 * Too many links.
 282 */
 283#define __WASI_ERRNO_MLINK (UINT16_C(34))
 284
 285/**
 286 * Message too large.
 287 */
 288#define __WASI_ERRNO_MSGSIZE (UINT16_C(35))
 289
 290/**
 291 * Reserved.
 292 */
 293#define __WASI_ERRNO_MULTIHOP (UINT16_C(36))
 294
 295/**
 296 * Filename too long.
 297 */
 298#define __WASI_ERRNO_NAMETOOLONG (UINT16_C(37))
 299
 300/**
 301 * Network is down.
 302 */
 303#define __WASI_ERRNO_NETDOWN (UINT16_C(38))
 304
 305/**
 306 * Connection aborted by network.
 307 */
 308#define __WASI_ERRNO_NETRESET (UINT16_C(39))
 309
 310/**
 311 * Network unreachable.
 312 */
 313#define __WASI_ERRNO_NETUNREACH (UINT16_C(40))
 314
 315/**
 316 * Too many files open in system.
 317 */
 318#define __WASI_ERRNO_NFILE (UINT16_C(41))
 319
 320/**
 321 * No buffer space available.
 322 */
 323#define __WASI_ERRNO_NOBUFS (UINT16_C(42))
 324
 325/**
 326 * No such device.
 327 */
 328#define __WASI_ERRNO_NODEV (UINT16_C(43))
 329
 330/**
 331 * No such file or directory.
 332 */
 333#define __WASI_ERRNO_NOENT (UINT16_C(44))
 334
 335/**
 336 * Executable file format error.
 337 */
 338#define __WASI_ERRNO_NOEXEC (UINT16_C(45))
 339
 340/**
 341 * No locks available.
 342 */
 343#define __WASI_ERRNO_NOLCK (UINT16_C(46))
 344
 345/**
 346 * Reserved.
 347 */
 348#define __WASI_ERRNO_NOLINK (UINT16_C(47))
 349
 350/**
 351 * Not enough space.
 352 */
 353#define __WASI_ERRNO_NOMEM (UINT16_C(48))
 354
 355/**
 356 * No message of the desired type.
 357 */
 358#define __WASI_ERRNO_NOMSG (UINT16_C(49))
 359
 360/**
 361 * Protocol not available.
 362 */
 363#define __WASI_ERRNO_NOPROTOOPT (UINT16_C(50))
 364
 365/**
 366 * No space left on device.
 367 */
 368#define __WASI_ERRNO_NOSPC (UINT16_C(51))
 369
 370/**
 371 * Function not supported.
 372 */
 373#define __WASI_ERRNO_NOSYS (UINT16_C(52))
 374
 375/**
 376 * The socket is not connected.
 377 */
 378#define __WASI_ERRNO_NOTCONN (UINT16_C(53))
 379
 380/**
 381 * Not a directory or a symbolic link to a directory.
 382 */
 383#define __WASI_ERRNO_NOTDIR (UINT16_C(54))
 384
 385/**
 386 * Directory not empty.
 387 */
 388#define __WASI_ERRNO_NOTEMPTY (UINT16_C(55))
 389
 390/**
 391 * State not recoverable.
 392 */
 393#define __WASI_ERRNO_NOTRECOVERABLE (UINT16_C(56))
 394
 395/**
 396 * Not a socket.
 397 */
 398#define __WASI_ERRNO_NOTSOCK (UINT16_C(57))
 399
 400/**
 401 * Not supported, or operation not supported on socket.
 402 */
 403#define __WASI_ERRNO_NOTSUP (UINT16_C(58))
 404
 405/**
 406 * Inappropriate I/O control operation.
 407 */
 408#define __WASI_ERRNO_NOTTY (UINT16_C(59))
 409
 410/**
 411 * No such device or address.
 412 */
 413#define __WASI_ERRNO_NXIO (UINT16_C(60))
 414
 415/**
 416 * Value too large to be stored in data type.
 417 */
 418#define __WASI_ERRNO_OVERFLOW (UINT16_C(61))
 419
 420/**
 421 * Previous owner died.
 422 */
 423#define __WASI_ERRNO_OWNERDEAD (UINT16_C(62))
 424
 425/**
 426 * Operation not permitted.
 427 */
 428#define __WASI_ERRNO_PERM (UINT16_C(63))
 429
 430/**
 431 * Broken pipe.
 432 */
 433#define __WASI_ERRNO_PIPE (UINT16_C(64))
 434
 435/**
 436 * Protocol error.
 437 */
 438#define __WASI_ERRNO_PROTO (UINT16_C(65))
 439
 440/**
 441 * Protocol not supported.
 442 */
 443#define __WASI_ERRNO_PROTONOSUPPORT (UINT16_C(66))
 444
 445/**
 446 * Protocol wrong type for socket.
 447 */
 448#define __WASI_ERRNO_PROTOTYPE (UINT16_C(67))
 449
 450/**
 451 * Result too large.
 452 */
 453#define __WASI_ERRNO_RANGE (UINT16_C(68))
 454
 455/**
 456 * Read-only file system.
 457 */
 458#define __WASI_ERRNO_ROFS (UINT16_C(69))
 459
 460/**
 461 * Invalid seek.
 462 */
 463#define __WASI_ERRNO_SPIPE (UINT16_C(70))
 464
 465/**
 466 * No such process.
 467 */
 468#define __WASI_ERRNO_SRCH (UINT16_C(71))
 469
 470/**
 471 * Reserved.
 472 */
 473#define __WASI_ERRNO_STALE (UINT16_C(72))
 474
 475/**
 476 * Connection timed out.
 477 */
 478#define __WASI_ERRNO_TIMEDOUT (UINT16_C(73))
 479
 480/**
 481 * Text file busy.
 482 */
 483#define __WASI_ERRNO_TXTBSY (UINT16_C(74))
 484
 485/**
 486 * Cross-device link.
 487 */
 488#define __WASI_ERRNO_XDEV (UINT16_C(75))
 489
 490/**
 491 * Extension: Capabilities insufficient.
 492 */
 493#define __WASI_ERRNO_NOTCAPABLE (UINT16_C(76))
 494
 495_Static_assert(sizeof(__wasi_errno_t) == 2, "witx calculated size");
 496_Static_assert(_Alignof(__wasi_errno_t) == 2, "witx calculated align");
 497
 498/**
 499 * File descriptor rights, determining which actions may be performed.
 500 */
 501typedef uint64_t __wasi_rights_t;
 502
 503/**
 504 * The right to invoke `fd_datasync`.
 505 * If `path_open` is set, includes the right to invoke
 506 * `path_open` with `fdflags::dsync`.
 507 */
 508#define __WASI_RIGHTS_FD_DATASYNC ((__wasi_rights_t)(1 << 0))
 509
 510/**
 511 * The right to invoke `fd_read` and `sock_recv`.
 512 * If `rights::fd_seek` is set, includes the right to invoke `fd_pread`.
 513 */
 514#define __WASI_RIGHTS_FD_READ ((__wasi_rights_t)(1 << 1))
 515
 516/**
 517 * The right to invoke `fd_seek`. This flag implies `rights::fd_tell`.
 518 */
 519#define __WASI_RIGHTS_FD_SEEK ((__wasi_rights_t)(1 << 2))
 520
 521/**
 522 * The right to invoke `fd_fdstat_set_flags`.
 523 */
 524#define __WASI_RIGHTS_FD_FDSTAT_SET_FLAGS ((__wasi_rights_t)(1 << 3))
 525
 526/**
 527 * The right to invoke `fd_sync`.
 528 * If `path_open` is set, includes the right to invoke
 529 * `path_open` with `fdflags::rsync` and `fdflags::dsync`.
 530 */
 531#define __WASI_RIGHTS_FD_SYNC ((__wasi_rights_t)(1 << 4))
 532
 533/**
 534 * The right to invoke `fd_seek` in such a way that the file offset
 535 * remains unaltered (i.e., `whence::cur` with offset zero), or to
 536 * invoke `fd_tell`.
 537 */
 538#define __WASI_RIGHTS_FD_TELL ((__wasi_rights_t)(1 << 5))
 539
 540/**
 541 * The right to invoke `fd_write` and `sock_send`.
 542 * If `rights::fd_seek` is set, includes the right to invoke `fd_pwrite`.
 543 */
 544#define __WASI_RIGHTS_FD_WRITE ((__wasi_rights_t)(1 << 6))
 545
 546/**
 547 * The right to invoke `fd_advise`.
 548 */
 549#define __WASI_RIGHTS_FD_ADVISE ((__wasi_rights_t)(1 << 7))
 550
 551/**
 552 * The right to invoke `fd_allocate`.
 553 */
 554#define __WASI_RIGHTS_FD_ALLOCATE ((__wasi_rights_t)(1 << 8))
 555
 556/**
 557 * The right to invoke `path_create_directory`.
 558 */
 559#define __WASI_RIGHTS_PATH_CREATE_DIRECTORY ((__wasi_rights_t)(1 << 9))
 560
 561/**
 562 * If `path_open` is set, the right to invoke `path_open` with `oflags::creat`.
 563 */
 564#define __WASI_RIGHTS_PATH_CREATE_FILE ((__wasi_rights_t)(1 << 10))
 565
 566/**
 567 * The right to invoke `path_link` with the file descriptor as the
 568 * source directory.
 569 */
 570#define __WASI_RIGHTS_PATH_LINK_SOURCE ((__wasi_rights_t)(1 << 11))
 571
 572/**
 573 * The right to invoke `path_link` with the file descriptor as the
 574 * target directory.
 575 */
 576#define __WASI_RIGHTS_PATH_LINK_TARGET ((__wasi_rights_t)(1 << 12))
 577
 578/**
 579 * The right to invoke `path_open`.
 580 */
 581#define __WASI_RIGHTS_PATH_OPEN ((__wasi_rights_t)(1 << 13))
 582
 583/**
 584 * The right to invoke `fd_readdir`.
 585 */
 586#define __WASI_RIGHTS_FD_READDIR ((__wasi_rights_t)(1 << 14))
 587
 588/**
 589 * The right to invoke `path_readlink`.
 590 */
 591#define __WASI_RIGHTS_PATH_READLINK ((__wasi_rights_t)(1 << 15))
 592
 593/**
 594 * The right to invoke `path_rename` with the file descriptor as the source directory.
 595 */
 596#define __WASI_RIGHTS_PATH_RENAME_SOURCE ((__wasi_rights_t)(1 << 16))
 597
 598/**
 599 * The right to invoke `path_rename` with the file descriptor as the target directory.
 600 */
 601#define __WASI_RIGHTS_PATH_RENAME_TARGET ((__wasi_rights_t)(1 << 17))
 602
 603/**
 604 * The right to invoke `path_filestat_get`.
 605 */
 606#define __WASI_RIGHTS_PATH_FILESTAT_GET ((__wasi_rights_t)(1 << 18))
 607
 608/**
 609 * The right to change a file's size (there is no `path_filestat_set_size`).
 610 * If `path_open` is set, includes the right to invoke `path_open` with `oflags::trunc`.
 611 */
 612#define __WASI_RIGHTS_PATH_FILESTAT_SET_SIZE ((__wasi_rights_t)(1 << 19))
 613
 614/**
 615 * The right to invoke `path_filestat_set_times`.
 616 */
 617#define __WASI_RIGHTS_PATH_FILESTAT_SET_TIMES ((__wasi_rights_t)(1 << 20))
 618
 619/**
 620 * The right to invoke `fd_filestat_get`.
 621 */
 622#define __WASI_RIGHTS_FD_FILESTAT_GET ((__wasi_rights_t)(1 << 21))
 623
 624/**
 625 * The right to invoke `fd_filestat_set_size`.
 626 */
 627#define __WASI_RIGHTS_FD_FILESTAT_SET_SIZE ((__wasi_rights_t)(1 << 22))
 628
 629/**
 630 * The right to invoke `fd_filestat_set_times`.
 631 */
 632#define __WASI_RIGHTS_FD_FILESTAT_SET_TIMES ((__wasi_rights_t)(1 << 23))
 633
 634/**
 635 * The right to invoke `path_symlink`.
 636 */
 637#define __WASI_RIGHTS_PATH_SYMLINK ((__wasi_rights_t)(1 << 24))
 638
 639/**
 640 * The right to invoke `path_remove_directory`.
 641 */
 642#define __WASI_RIGHTS_PATH_REMOVE_DIRECTORY ((__wasi_rights_t)(1 << 25))
 643
 644/**
 645 * The right to invoke `path_unlink_file`.
 646 */
 647#define __WASI_RIGHTS_PATH_UNLINK_FILE ((__wasi_rights_t)(1 << 26))
 648
 649/**
 650 * If `rights::fd_read` is set, includes the right to invoke `poll_oneoff` to subscribe to `eventtype::fd_read`.
 651 * If `rights::fd_write` is set, includes the right to invoke `poll_oneoff` to subscribe to `eventtype::fd_write`.
 652 */
 653#define __WASI_RIGHTS_POLL_FD_READWRITE ((__wasi_rights_t)(1 << 27))
 654
 655/**
 656 * The right to invoke `sock_shutdown`.
 657 */
 658#define __WASI_RIGHTS_SOCK_SHUTDOWN ((__wasi_rights_t)(1 << 28))
 659
 660/**
 661 * The right to invoke `sock_accept`.
 662 */
 663#define __WASI_RIGHTS_SOCK_ACCEPT ((__wasi_rights_t)(1 << 29))
 664
 665/**
 666 * A file descriptor handle.
 667 */
 668typedef int __wasi_fd_t;
 669
 670_Static_assert(sizeof(__wasi_fd_t) == 4, "witx calculated size");
 671_Static_assert(_Alignof(__wasi_fd_t) == 4, "witx calculated align");
 672
 673/**
 674 * A region of memory for scatter/gather reads.
 675 */
 676typedef struct __wasi_iovec_t {
 677    /**
 678     * The address of the buffer to be filled.
 679     */
 680    uint8_t * buf;
 681
 682    /**
 683     * The length of the buffer to be filled.
 684     */
 685    __wasi_size_t buf_len;
 686
 687} __wasi_iovec_t;
 688
 689_Static_assert(sizeof(__wasi_iovec_t) == 8, "witx calculated size");
 690_Static_assert(_Alignof(__wasi_iovec_t) == 4, "witx calculated align");
 691_Static_assert(offsetof(__wasi_iovec_t, buf) == 0, "witx calculated offset");
 692_Static_assert(offsetof(__wasi_iovec_t, buf_len) == 4, "witx calculated offset");
 693
 694/**
 695 * A region of memory for scatter/gather writes.
 696 */
 697typedef struct __wasi_ciovec_t {
 698    /**
 699     * The address of the buffer to be written.
 700     */
 701    const uint8_t * buf;
 702
 703    /**
 704     * The length of the buffer to be written.
 705     */
 706    __wasi_size_t buf_len;
 707
 708} __wasi_ciovec_t;
 709
 710_Static_assert(sizeof(__wasi_ciovec_t) == 8, "witx calculated size");
 711_Static_assert(_Alignof(__wasi_ciovec_t) == 4, "witx calculated align");
 712_Static_assert(offsetof(__wasi_ciovec_t, buf) == 0, "witx calculated offset");
 713_Static_assert(offsetof(__wasi_ciovec_t, buf_len) == 4, "witx calculated offset");
 714
 715/**
 716 * Relative offset within a file.
 717 */
 718typedef int64_t __wasi_filedelta_t;
 719
 720_Static_assert(sizeof(__wasi_filedelta_t) == 8, "witx calculated size");
 721_Static_assert(_Alignof(__wasi_filedelta_t) == 8, "witx calculated align");
 722
 723/**
 724 * The position relative to which to set the offset of the file descriptor.
 725 */
 726typedef uint8_t __wasi_whence_t;
 727
 728/**
 729 * Seek relative to start-of-file.
 730 */
 731#define __WASI_WHENCE_SET (UINT8_C(0))
 732
 733/**
 734 * Seek relative to current position.
 735 */
 736#define __WASI_WHENCE_CUR (UINT8_C(1))
 737
 738/**
 739 * Seek relative to end-of-file.
 740 */
 741#define __WASI_WHENCE_END (UINT8_C(2))
 742
 743_Static_assert(sizeof(__wasi_whence_t) == 1, "witx calculated size");
 744_Static_assert(_Alignof(__wasi_whence_t) == 1, "witx calculated align");
 745
 746/**
 747 * A reference to the offset of a directory entry.
 748 * 
 749 * The value 0 signifies the start of the directory.
 750 */
 751typedef uint64_t __wasi_dircookie_t;
 752
 753_Static_assert(sizeof(__wasi_dircookie_t) == 8, "witx calculated size");
 754_Static_assert(_Alignof(__wasi_dircookie_t) == 8, "witx calculated align");
 755
 756/**
 757 * The type for the `dirent::d_namlen` field of `dirent` struct.
 758 */
 759typedef uint32_t __wasi_dirnamlen_t;
 760
 761_Static_assert(sizeof(__wasi_dirnamlen_t) == 4, "witx calculated size");
 762_Static_assert(_Alignof(__wasi_dirnamlen_t) == 4, "witx calculated align");
 763
 764/**
 765 * File serial number that is unique within its file system.
 766 */
 767typedef uint64_t __wasi_inode_t;
 768
 769_Static_assert(sizeof(__wasi_inode_t) == 8, "witx calculated size");
 770_Static_assert(_Alignof(__wasi_inode_t) == 8, "witx calculated align");
 771
 772/**
 773 * The type of a file descriptor or file.
 774 */
 775typedef uint8_t __wasi_filetype_t;
 776
 777/**
 778 * The type of the file descriptor or file is unknown or is different from any of the other types specified.
 779 */
 780#define __WASI_FILETYPE_UNKNOWN (UINT8_C(0))
 781
 782/**
 783 * The file descriptor or file refers to a block device inode.
 784 */
 785#define __WASI_FILETYPE_BLOCK_DEVICE (UINT8_C(1))
 786
 787/**
 788 * The file descriptor or file refers to a character device inode.
 789 */
 790#define __WASI_FILETYPE_CHARACTER_DEVICE (UINT8_C(2))
 791
 792/**
 793 * The file descriptor or file refers to a directory inode.
 794 */
 795#define __WASI_FILETYPE_DIRECTORY (UINT8_C(3))
 796
 797/**
 798 * The file descriptor or file refers to a regular file inode.
 799 */
 800#define __WASI_FILETYPE_REGULAR_FILE (UINT8_C(4))
 801
 802/**
 803 * The file descriptor or file refers to a datagram socket.
 804 */
 805#define __WASI_FILETYPE_SOCKET_DGRAM (UINT8_C(5))
 806
 807/**
 808 * The file descriptor or file refers to a byte-stream socket.
 809 */
 810#define __WASI_FILETYPE_SOCKET_STREAM (UINT8_C(6))
 811
 812/**
 813 * The file refers to a symbolic link inode.
 814 */
 815#define __WASI_FILETYPE_SYMBOLIC_LINK (UINT8_C(7))
 816
 817_Static_assert(sizeof(__wasi_filetype_t) == 1, "witx calculated size");
 818_Static_assert(_Alignof(__wasi_filetype_t) == 1, "witx calculated align");
 819
 820/**
 821 * A directory entry.
 822 */
 823typedef struct __wasi_dirent_t {
 824    /**
 825     * The offset of the next directory entry stored in this directory.
 826     */
 827    __wasi_dircookie_t d_next;
 828
 829    /**
 830     * The serial number of the file referred to by this directory entry.
 831     */
 832    __wasi_inode_t d_ino;
 833
 834    /**
 835     * The length of the name of the directory entry.
 836     */
 837    __wasi_dirnamlen_t d_namlen;
 838
 839    /**
 840     * The type of the file referred to by this directory entry.
 841     */
 842    __wasi_filetype_t d_type;
 843
 844} __wasi_dirent_t;
 845
 846_Static_assert(sizeof(__wasi_dirent_t) == 24, "witx calculated size");
 847_Static_assert(_Alignof(__wasi_dirent_t) == 8, "witx calculated align");
 848_Static_assert(offsetof(__wasi_dirent_t, d_next) == 0, "witx calculated offset");
 849_Static_assert(offsetof(__wasi_dirent_t, d_ino) == 8, "witx calculated offset");
 850_Static_assert(offsetof(__wasi_dirent_t, d_namlen) == 16, "witx calculated offset");
 851_Static_assert(offsetof(__wasi_dirent_t, d_type) == 20, "witx calculated offset");
 852
 853/**
 854 * File or memory access pattern advisory information.
 855 */
 856typedef uint8_t __wasi_advice_t;
 857
 858/**
 859 * The application has no advice to give on its behavior with respect to the specified data.
 860 */
 861#define __WASI_ADVICE_NORMAL (UINT8_C(0))
 862
 863/**
 864 * The application expects to access the specified data sequentially from lower offsets to higher offsets.
 865 */
 866#define __WASI_ADVICE_SEQUENTIAL (UINT8_C(1))
 867
 868/**
 869 * The application expects to access the specified data in a random order.
 870 */
 871#define __WASI_ADVICE_RANDOM (UINT8_C(2))
 872
 873/**
 874 * The application expects to access the specified data in the near future.
 875 */
 876#define __WASI_ADVICE_WILLNEED (UINT8_C(3))
 877
 878/**
 879 * The application expects that it will not access the specified data in the near future.
 880 */
 881#define __WASI_ADVICE_DONTNEED (UINT8_C(4))
 882
 883/**
 884 * The application expects to access the specified data once and then not reuse it thereafter.
 885 */
 886#define __WASI_ADVICE_NOREUSE (UINT8_C(5))
 887
 888_Static_assert(sizeof(__wasi_advice_t) == 1, "witx calculated size");
 889_Static_assert(_Alignof(__wasi_advice_t) == 1, "witx calculated align");
 890
 891/**
 892 * File descriptor flags.
 893 */
 894typedef uint16_t __wasi_fdflags_t;
 895
 896/**
 897 * Append mode: Data written to the file is always appended to the file's end.
 898 */
 899#define __WASI_FDFLAGS_APPEND ((__wasi_fdflags_t)(1 << 0))
 900
 901/**
 902 * Write according to synchronized I/O data integrity completion. Only the data stored in the file is synchronized.
 903 */
 904#define __WASI_FDFLAGS_DSYNC ((__wasi_fdflags_t)(1 << 1))
 905
 906/**
 907 * Non-blocking mode.
 908 */
 909#define __WASI_FDFLAGS_NONBLOCK ((__wasi_fdflags_t)(1 << 2))
 910
 911/**
 912 * Synchronized read I/O operations.
 913 */
 914#define __WASI_FDFLAGS_RSYNC ((__wasi_fdflags_t)(1 << 3))
 915
 916/**
 917 * Write according to synchronized I/O file integrity completion. In
 918 * addition to synchronizing the data stored in the file, the implementation
 919 * may also synchronously update the file's metadata.
 920 */
 921#define __WASI_FDFLAGS_SYNC ((__wasi_fdflags_t)(1 << 4))
 922
 923/**
 924 * File descriptor attributes.
 925 */
 926typedef struct __wasi_fdstat_t {
 927    /**
 928     * File type.
 929     */
 930    __wasi_filetype_t fs_filetype;
 931
 932    /**
 933     * File descriptor flags.
 934     */
 935    __wasi_fdflags_t fs_flags;
 936
 937    /**
 938     * Rights that apply to this file descriptor.
 939     */
 940    __wasi_rights_t fs_rights_base;
 941
 942    /**
 943     * Maximum set of rights that may be installed on new file descriptors that
 944     * are created through this file descriptor, e.g., through `path_open`.
 945     */
 946    __wasi_rights_t fs_rights_inheriting;
 947
 948} __wasi_fdstat_t;
 949
 950_Static_assert(sizeof(__wasi_fdstat_t) == 24, "witx calculated size");
 951_Static_assert(_Alignof(__wasi_fdstat_t) == 8, "witx calculated align");
 952_Static_assert(offsetof(__wasi_fdstat_t, fs_filetype) == 0, "witx calculated offset");
 953_Static_assert(offsetof(__wasi_fdstat_t, fs_flags) == 2, "witx calculated offset");
 954_Static_assert(offsetof(__wasi_fdstat_t, fs_rights_base) == 8, "witx calculated offset");
 955_Static_assert(offsetof(__wasi_fdstat_t, fs_rights_inheriting) == 16, "witx calculated offset");
 956
 957/**
 958 * Identifier for a device containing a file system. Can be used in combination
 959 * with `inode` to uniquely identify a file or directory in the filesystem.
 960 */
 961typedef uint64_t __wasi_device_t;
 962
 963_Static_assert(sizeof(__wasi_device_t) == 8, "witx calculated size");
 964_Static_assert(_Alignof(__wasi_device_t) == 8, "witx calculated align");
 965
 966/**
 967 * Which file time attributes to adjust.
 968 */
 969typedef uint16_t __wasi_fstflags_t;
 970
 971/**
 972 * Adjust the last data access timestamp to the value stored in `filestat::atim`.
 973 */
 974#define __WASI_FSTFLAGS_ATIM ((__wasi_fstflags_t)(1 << 0))
 975
 976/**
 977 * Adjust the last data access timestamp to the time of clock `clockid::realtime`.
 978 */
 979#define __WASI_FSTFLAGS_ATIM_NOW ((__wasi_fstflags_t)(1 << 1))
 980
 981/**
 982 * Adjust the last data modification timestamp to the value stored in `filestat::mtim`.
 983 */
 984#define __WASI_FSTFLAGS_MTIM ((__wasi_fstflags_t)(1 << 2))
 985
 986/**
 987 * Adjust the last data modification timestamp to the time of clock `clockid::realtime`.
 988 */
 989#define __WASI_FSTFLAGS_MTIM_NOW ((__wasi_fstflags_t)(1 << 3))
 990
 991/**
 992 * Flags determining the method of how paths are resolved.
 993 */
 994typedef uint32_t __wasi_lookupflags_t;
 995
 996/**
 997 * As long as the resolved path corresponds to a symbolic link, it is expanded.
 998 */
 999#define __WASI_LOOKUPFLAGS_SYMLINK_FOLLOW ((__wasi_lookupflags_t)(1 << 0))
1000
1001/**
1002 * Open flags used by `path_open`.
1003 */
1004typedef uint16_t __wasi_oflags_t;
1005
1006/**
1007 * Create file if it does not exist.
1008 */
1009#define __WASI_OFLAGS_CREAT ((__wasi_oflags_t)(1 << 0))
1010
1011/**
1012 * Fail if not a directory.
1013 */
1014#define __WASI_OFLAGS_DIRECTORY ((__wasi_oflags_t)(1 << 1))
1015
1016/**
1017 * Fail if file already exists.
1018 */
1019#define __WASI_OFLAGS_EXCL ((__wasi_oflags_t)(1 << 2))
1020
1021/**
1022 * Truncate file to size 0.
1023 */
1024#define __WASI_OFLAGS_TRUNC ((__wasi_oflags_t)(1 << 3))
1025
1026/**
1027 * Number of hard links to an inode.
1028 */
1029typedef uint64_t __wasi_linkcount_t;
1030
1031_Static_assert(sizeof(__wasi_linkcount_t) == 8, "witx calculated size");
1032_Static_assert(_Alignof(__wasi_linkcount_t) == 8, "witx calculated align");
1033
1034/**
1035 * File attributes.
1036 */
1037typedef struct __wasi_filestat_t {
1038    /**
1039     * Device ID of device containing the file.
1040     */
1041    __wasi_device_t dev;
1042
1043    /**
1044     * File serial number.
1045     */
1046    __wasi_inode_t ino;
1047
1048    /**
1049     * File type.
1050     */
1051    __wasi_filetype_t filetype;
1052
1053    /**
1054     * Number of hard links to the file.
1055     */
1056    __wasi_linkcount_t nlink;
1057
1058    /**
1059     * For regular files, the file size in bytes. For symbolic links, the length in bytes of the pathname contained in the symbolic link.
1060     */
1061    __wasi_filesize_t size;
1062
1063    /**
1064     * Last data access timestamp.
1065     */
1066    __wasi_timestamp_t atim;
1067
1068    /**
1069     * Last data modification timestamp.
1070     */
1071    __wasi_timestamp_t mtim;
1072
1073    /**
1074     * Last file status change timestamp.
1075     */
1076    __wasi_timestamp_t ctim;
1077
1078} __wasi_filestat_t;
1079
1080_Static_assert(sizeof(__wasi_filestat_t) == 64, "witx calculated size");
1081_Static_assert(_Alignof(__wasi_filestat_t) == 8, "witx calculated align");
1082_Static_assert(offsetof(__wasi_filestat_t, dev) == 0, "witx calculated offset");
1083_Static_assert(offsetof(__wasi_filestat_t, ino) == 8, "witx calculated offset");
1084_Static_assert(offsetof(__wasi_filestat_t, filetype) == 16, "witx calculated offset");
1085_Static_assert(offsetof(__wasi_filestat_t, nlink) == 24, "witx calculated offset");
1086_Static_assert(offsetof(__wasi_filestat_t, size) == 32, "witx calculated offset");
1087_Static_assert(offsetof(__wasi_filestat_t, atim) == 40, "witx calculated offset");
1088_Static_assert(offsetof(__wasi_filestat_t, mtim) == 48, "witx calculated offset");
1089_Static_assert(offsetof(__wasi_filestat_t, ctim) == 56, "witx calculated offset");
1090
1091/**
1092 * User-provided value that may be attached to objects that is retained when
1093 * extracted from the implementation.
1094 */
1095typedef uint64_t __wasi_userdata_t;
1096
1097_Static_assert(sizeof(__wasi_userdata_t) == 8, "witx calculated size");
1098_Static_assert(_Alignof(__wasi_userdata_t) == 8, "witx calculated align");
1099
1100/**
1101 * Type of a subscription to an event or its occurrence.
1102 */
1103typedef uint8_t __wasi_eventtype_t;
1104
1105/**
1106 * The time value of clock `subscription_clock::id` has
1107 * reached timestamp `subscription_clock::timeout`.
1108 */
1109#define __WASI_EVENTTYPE_CLOCK (UINT8_C(0))
1110
1111/**
1112 * File descriptor `subscription_fd_readwrite::file_descriptor` has data
1113 * available for reading. This event always triggers for regular files.
1114 */
1115#define __WASI_EVENTTYPE_FD_READ (UINT8_C(1))
1116
1117/**
1118 * File descriptor `subscription_fd_readwrite::file_descriptor` has capacity
1119 * available for writing. This event always triggers for regular files.
1120 */
1121#define __WASI_EVENTTYPE_FD_WRITE (UINT8_C(2))
1122
1123_Static_assert(sizeof(__wasi_eventtype_t) == 1, "witx calculated size");
1124_Static_assert(_Alignof(__wasi_eventtype_t) == 1, "witx calculated align");
1125
1126/**
1127 * The state of the file descriptor subscribed to with
1128 * `eventtype::fd_read` or `eventtype::fd_write`.
1129 */
1130typedef uint16_t __wasi_eventrwflags_t;
1131
1132/**
1133 * The peer of this socket has closed or disconnected.
1134 */
1135#define __WASI_EVENTRWFLAGS_FD_READWRITE_HANGUP ((__wasi_eventrwflags_t)(1 << 0))
1136
1137/**
1138 * The contents of an `event` when type is `eventtype::fd_read` or
1139 * `eventtype::fd_write`.
1140 */
1141typedef struct __wasi_event_fd_readwrite_t {
1142    /**
1143     * The number of bytes available for reading or writing.
1144     */
1145    __wasi_filesize_t nbytes;
1146
1147    /**
1148     * The state of the file descriptor.
1149     */
1150    __wasi_eventrwflags_t flags;
1151
1152} __wasi_event_fd_readwrite_t;
1153
1154_Static_assert(sizeof(__wasi_event_fd_readwrite_t) == 16, "witx calculated size");
1155_Static_assert(_Alignof(__wasi_event_fd_readwrite_t) == 8, "witx calculated align");
1156_Static_assert(offsetof(__wasi_event_fd_readwrite_t, nbytes) == 0, "witx calculated offset");
1157_Static_assert(offsetof(__wasi_event_fd_readwrite_t, flags) == 8, "witx calculated offset");
1158
1159/**
1160 * An event that occurred.
1161 */
1162typedef struct __wasi_event_t {
1163    /**
1164     * User-provided value that got attached to `subscription::userdata`.
1165     */
1166    __wasi_userdata_t userdata;
1167
1168    /**
1169     * If non-zero, an error that occurred while processing the subscription request.
1170     */
1171    __wasi_errno_t error;
1172
1173    /**
1174     * The type of event that occured
1175     */
1176    __wasi_eventtype_t type;
1177
1178    /**
1179     * The contents of the event, if it is an `eventtype::fd_read` or
1180     * `eventtype::fd_write`. `eventtype::clock` events ignore this field.
1181     */
1182    __wasi_event_fd_readwrite_t fd_readwrite;
1183
1184} __wasi_event_t;
1185
1186_Static_assert(sizeof(__wasi_event_t) == 32, "witx calculated size");
1187_Static_assert(_Alignof(__wasi_event_t) == 8, "witx calculated align");
1188_Static_assert(offsetof(__wasi_event_t, userdata) == 0, "witx calculated offset");
1189_Static_assert(offsetof(__wasi_event_t, error) == 8, "witx calculated offset");
1190_Static_assert(offsetof(__wasi_event_t, type) == 10, "witx calculated offset");
1191_Static_assert(offsetof(__wasi_event_t, fd_readwrite) == 16, "witx calculated offset");
1192
1193/**
1194 * Flags determining how to interpret the timestamp provided in
1195 * `subscription_clock::timeout`.
1196 */
1197typedef uint16_t __wasi_subclockflags_t;
1198
1199/**
1200 * If set, treat the timestamp provided in
1201 * `subscription_clock::timeout` as an absolute timestamp of clock
1202 * `subscription_clock::id`. If clear, treat the timestamp
1203 * provided in `subscription_clock::timeout` relative to the
1204 * current time value of clock `subscription_clock::id`.
1205 */
1206#define __WASI_SUBCLOCKFLAGS_SUBSCRIPTION_CLOCK_ABSTIME ((__wasi_subclockflags_t)(1 << 0))
1207
1208/**
1209 * The contents of a `subscription` when type is `eventtype::clock`.
1210 */
1211typedef struct __wasi_subscription_clock_t {
1212    /**
1213     * The clock against which to compare the timestamp.
1214     */
1215    __wasi_clockid_t id;
1216
1217    /**
1218     * The absolute or relative timestamp.
1219     */
1220    __wasi_timestamp_t timeout;
1221
1222    /**
1223     * The amount of time that the implementation may wait additionally
1224     * to coalesce with other events.
1225     */
1226    __wasi_timestamp_t precision;
1227
1228    /**
1229     * Flags specifying whether the timeout is absolute or relative
1230     */
1231    __wasi_subclockflags_t flags;
1232
1233} __wasi_subscription_clock_t;
1234
1235_Static_assert(sizeof(__wasi_subscription_clock_t) == 32, "witx calculated size");
1236_Static_assert(_Alignof(__wasi_subscription_clock_t) == 8, "witx calculated align");
1237_Static_assert(offsetof(__wasi_subscription_clock_t, id) == 0, "witx calculated offset");
1238_Static_assert(offsetof(__wasi_subscription_clock_t, timeout) == 8, "witx calculated offset");
1239_Static_assert(offsetof(__wasi_subscription_clock_t, precision) == 16, "witx calculated offset");
1240_Static_assert(offsetof(__wasi_subscription_clock_t, flags) == 24, "witx calculated offset");
1241
1242/**
1243 * The contents of a `subscription` when type is type is
1244 * `eventtype::fd_read` or `eventtype::fd_write`.
1245 */
1246typedef struct __wasi_subscription_fd_readwrite_t {
1247    /**
1248     * The file descriptor on which to wait for it to become ready for reading or writing.
1249     */
1250    __wasi_fd_t file_descriptor;
1251
1252} __wasi_subscription_fd_readwrite_t;
1253
1254_Static_assert(sizeof(__wasi_subscription_fd_readwrite_t) == 4, "witx calculated size");
1255_Static_assert(_Alignof(__wasi_subscription_fd_readwrite_t) == 4, "witx calculated align");
1256_Static_assert(offsetof(__wasi_subscription_fd_readwrite_t, file_descriptor) == 0, "witx calculated offset");
1257
1258/**
1259 * The contents of a `subscription`.
1260 */
1261typedef union __wasi_subscription_u_u_t {
1262    __wasi_subscription_clock_t clock;
1263    __wasi_subscription_fd_readwrite_t fd_read;
1264    __wasi_subscription_fd_readwrite_t fd_write;
1265} __wasi_subscription_u_u_t;
1266typedef struct __wasi_subscription_u_t {
1267    uint8_t tag;
1268    __wasi_subscription_u_u_t u;
1269} __wasi_subscription_u_t;
1270
1271_Static_assert(sizeof(__wasi_subscription_u_t) == 40, "witx calculated size");
1272_Static_assert(_Alignof(__wasi_subscription_u_t) == 8, "witx calculated align");
1273
1274/**
1275 * Subscription to an event.
1276 */
1277typedef struct __wasi_subscription_t {
1278    /**
1279     * User-provided value that is attached to the subscription in the
1280     * implementation and returned through `event::userdata`.
1281     */
1282    __wasi_userdata_t userdata;
1283
1284    /**
1285     * The type of the event to which to subscribe, and its contents
1286     */
1287    __wasi_subscription_u_t u;
1288
1289} __wasi_subscription_t;
1290
1291_Static_assert(sizeof(__wasi_subscription_t) == 48, "witx calculated size");
1292_Static_assert(_Alignof(__wasi_subscription_t) == 8, "witx calculated align");
1293_Static_assert(offsetof(__wasi_subscription_t, userdata) == 0, "witx calculated offset");
1294_Static_assert(offsetof(__wasi_subscription_t, u) == 8, "witx calculated offset");
1295
1296/**
1297 * Exit code generated by a process when exiting.
1298 */
1299typedef uint32_t __wasi_exitcode_t;
1300
1301_Static_assert(sizeof(__wasi_exitcode_t) == 4, "witx calculated size");
1302_Static_assert(_Alignof(__wasi_exitcode_t) == 4, "witx calculated align");
1303
1304/**
1305 * Flags provided to `sock_recv`.
1306 */
1307typedef uint16_t __wasi_riflags_t;
1308
1309/**
1310 * Returns the message without removing it from the socket's receive queue.
1311 */
1312#define __WASI_RIFLAGS_RECV_PEEK ((__wasi_riflags_t)(1 << 0))
1313
1314/**
1315 * On byte-stream sockets, block until the full amount of data can be returned.
1316 */
1317#define __WASI_RIFLAGS_RECV_WAITALL ((__wasi_riflags_t)(1 << 1))
1318
1319/**
1320 * Flags returned by `sock_recv`.
1321 */
1322typedef uint16_t __wasi_roflags_t;
1323
1324/**
1325 * Returned by `sock_recv`: Message data has been truncated.
1326 */
1327#define __WASI_ROFLAGS_RECV_DATA_TRUNCATED ((__wasi_roflags_t)(1 << 0))
1328
1329/**
1330 * Flags provided to `sock_send`. As there are currently no flags
1331 * defined, it must be set to zero.
1332 */
1333typedef uint16_t __wasi_siflags_t;
1334
1335_Static_assert(sizeof(__wasi_siflags_t) == 2, "witx calculated size");
1336_Static_assert(_Alignof(__wasi_siflags_t) == 2, "witx calculated align");
1337
1338/**
1339 * Which channels on a socket to shut down.
1340 */
1341typedef uint8_t __wasi_sdflags_t;
1342
1343/**
1344 * Disables further receive operations.
1345 */
1346#define __WASI_SDFLAGS_RD ((__wasi_sdflags_t)(1 << 0))
1347
1348/**
1349 * Disables further send operations.
1350 */
1351#define __WASI_SDFLAGS_WR ((__wasi_sdflags_t)(1 << 1))
1352
1353/**
1354 * Identifiers for preopened capabilities.
1355 */
1356typedef uint8_t __wasi_preopentype_t;
1357
1358/**
1359 * A pre-opened directory.
1360 */
1361#define __WASI_PREOPENTYPE_DIR (UINT8_C(0))
1362
1363_Static_assert(sizeof(__wasi_preopentype_t) == 1, "witx calculated size");
1364_Static_assert(_Alignof(__wasi_preopentype_t) == 1, "witx calculated align");
1365
1366/**
1367 * The contents of a $prestat when type is `preopentype::dir`.
1368 */
1369typedef struct __wasi_prestat_dir_t {
1370    /**
1371     * The length of the directory name for use with `fd_prestat_dir_name`.
1372     */
1373    __wasi_size_t pr_name_len;
1374
1375} __wasi_prestat_dir_t;
1376
1377_Static_assert(sizeof(__wasi_prestat_dir_t) == 4, "witx calculated size");
1378_Static_assert(_Alignof(__wasi_prestat_dir_t) == 4, "witx calculated align");
1379_Static_assert(offsetof(__wasi_prestat_dir_t, pr_name_len) == 0, "witx calculated offset");
1380
1381/**
1382 * Information about a pre-opened capability.
1383 */
1384typedef union __wasi_prestat_u_t {
1385    __wasi_prestat_dir_t dir;
1386} __wasi_prestat_u_t;
1387typedef struct __wasi_prestat_t {
1388    uint8_t tag;
1389    __wasi_prestat_u_t u;
1390} __wasi_prestat_t;
1391
1392_Static_assert(sizeof(__wasi_prestat_t) == 8, "witx calculated size");
1393_Static_assert(_Alignof(__wasi_prestat_t) == 4, "witx calculated align");
1394
1395/**
1396 * @defgroup wasi_snapshot_preview1
1397 * @{
1398 */
1399
1400/**
1401 * Read command-line argument data.
1402 * The size of the array should match that returned by `args_sizes_get`.
1403 * Each argument is expected to be `\0` terminated.
1404 */
1405__wasi_errno_t __wasi_args_get(
1406    uint8_t * * argv,
1407    uint8_t * argv_buf
1408) __attribute__((__warn_unused_result__));
1409/**
1410 * Return command-line argument data sizes.
1411 * @return
1412 * Returns the number of arguments and the size of the argument string
1413 * data, or an error.
1414 */
1415__wasi_errno_t __wasi_args_sizes_get(
1416    __wasi_size_t *retptr0,
1417    __wasi_size_t *retptr1
1418) __attribute__((__warn_unused_result__));
1419/**
1420 * Read environment variable data.
1421 * The sizes of the buffers should match that returned by `environ_sizes_get`.
1422 * Key/value pairs are expected to be joined with `=`s, and terminated with `\0`s.
1423 */
1424__wasi_errno_t __wasi_environ_get(
1425    uint8_t * * environ,
1426    uint8_t * environ_buf
1427) __attribute__((__warn_unused_result__));
1428/**
1429 * Return environment variable data sizes.
1430 * @return
1431 * Returns the number of environment variable arguments and the size of the
1432 * environment variable data.
1433 */
1434__wasi_errno_t __wasi_environ_sizes_get(
1435    __wasi_size_t *retptr0,
1436    __wasi_size_t *retptr1
1437) __attribute__((__warn_unused_result__));
1438/**
1439 * Return the resolution of a clock.
1440 * Implementations are required to provide a non-zero value for supported clocks. For unsupported clocks,
1441 * return `errno::inval`.
1442 * Note: This is similar to `clock_getres` in POSIX.
1443 * @return
1444 * The resolution of the clock, or an error if one happened.
1445 */
1446__wasi_errno_t __wasi_clock_res_get(
1447    /**
1448     * The clock for which to return the resolution.
1449     */
1450    __wasi_clockid_t id,
1451    __wasi_timestamp_t *retptr0
1452) __attribute__((__warn_unused_result__));
1453/**
1454 * Return the time value of a clock.
1455 * Note: This is similar to `clock_gettime` in POSIX.
1456 * @return
1457 * The time value of the clock.
1458 */
1459__wasi_errno_t __wasi_clock_time_get(
1460    /**
1461     * The clock for which to return the time.
1462     */
1463    __wasi_clockid_t id,
1464    /**
1465     * The maximum lag (exclusive) that the returned time value may have, compared to its actual value.
1466     */
1467    __wasi_timestamp_t precision,
1468    __wasi_timestamp_t *retptr0
1469) __attribute__((__warn_unused_result__));
1470/**
1471 * Provide file advisory information on a file descriptor.
1472 * Note: This is similar to `posix_fadvise` in POSIX.
1473 */
1474__wasi_errno_t __wasi_fd_advise(
1475    __wasi_fd_t fd,
1476    /**
1477     * The offset within the file to which the advisory applies.
1478     */
1479    __wasi_filesize_t offset,
1480    /**
1481     * The length of the region to which the advisory applies.
1482     */
1483    __wasi_filesize_t len,
1484    /**
1485     * The advice.
1486     */
1487    __wasi_advice_t advice
1488) __attribute__((__warn_unused_result__));
1489/**
1490 * Force the allocation of space in a file.
1491 * Note: This is similar to `posix_fallocate` in POSIX.
1492 */
1493__wasi_errno_t __wasi_fd_allocate(
1494    __wasi_fd_t fd,
1495    /**
1496     * The offset at which to start the allocation.
1497     */
1498    __wasi_filesize_t offset,
1499    /**
1500     * The length of the area that is allocated.
1501     */
1502    __wasi_filesize_t len
1503) __attribute__((__warn_unused_result__));
1504/**
1505 * Close a file descriptor.
1506 * Note: This is similar to `close` in POSIX.
1507 */
1508__wasi_errno_t __wasi_fd_close(
1509    __wasi_fd_t fd
1510) __attribute__((__warn_unused_result__));
1511/**
1512 * Synchronize the data of a file to disk.
1513 * Note: This is similar to `fdatasync` in POSIX.
1514 */
1515__wasi_errno_t __wasi_fd_datasync(
1516    __wasi_fd_t fd
1517) __attribute__((__warn_unused_result__));
1518/**
1519 * Get the attributes of a file descriptor.
1520 * Note: This returns similar flags to `fsync(fd, F_GETFL)` in POSIX, as well as additional fields.
1521 * @return
1522 * The buffer where the file descriptor's attributes are stored.
1523 */
1524__wasi_errno_t __wasi_fd_fdstat_get(
1525    __wasi_fd_t fd,
1526    __wasi_fdstat_t *retptr0
1527) __attribute__((__warn_unused_result__));
1528/**
1529 * Adjust the flags associated with a file descriptor.
1530 * Note: This is similar to `fcntl(fd, F_SETFL, flags)` in POSIX.
1531 */
1532__wasi_errno_t __wasi_fd_fdstat_set_flags(
1533    __wasi_fd_t fd,
1534    /**
1535     * The desired values of the file descriptor flags.
1536     */
1537    __wasi_fdflags_t flags
1538) __attribute__((__warn_unused_result__));
1539/**
1540 * Adjust the rights associated with a file descriptor.
1541 * This can only be used to remove rights, and returns `errno::notcapable` if called in a way that would attempt to add rights
1542 */
1543__wasi_errno_t __wasi_fd_fdstat_set_rights(
1544    __wasi_fd_t fd,
1545    /**
1546     * The desired rights of the file descriptor.
1547     */
1548    __wasi_rights_t fs_rights_base,
1549    __wasi_rights_t fs_rights_inheriting
1550) __attribute__((__warn_unused_result__));
1551/**
1552 * Return the attributes of an open file.
1553 * @return
1554 * The buffer where the file's attributes are stored.
1555 */
1556__wasi_errno_t __wasi_fd_filestat_get(
1557    __wasi_fd_t fd,
1558    __wasi_filestat_t *retptr0
1559) __attribute__((__warn_unused_result__));
1560/**
1561 * Adjust the size of an open file. If this increases the file's size, the extra bytes are filled with zeros.
1562 * Note: This is similar to `ftruncate` in POSIX.
1563 */
1564__wasi_errno_t __wasi_fd_filestat_set_size(
1565    __wasi_fd_t fd,
1566    /**
1567     * The desired file size.
1568     */
1569    __wasi_filesize_t size
1570) __attribute__((__warn_unused_result__));
1571/**
1572 * Adjust the timestamps of an open file or directory.
1573 * Note: This is similar to `futimens` in POSIX.
1574 */
1575__wasi_errno_t __wasi_fd_filestat_set_times(
1576    __wasi_fd_t fd,
1577    /**
1578     * The desired values of the data access timestamp.
1579     */
1580    __wasi_timestamp_t atim,
1581    /**
1582     * The desired values of the data modification timestamp.
1583     */
1584    __wasi_timestamp_t mtim,
1585    /**
1586     * A bitmask indicating which timestamps to adjust.
1587     */
1588    __wasi_fstflags_t fst_flags
1589) __attribute__((__warn_unused_result__));
1590/**
1591 * Read from a file descriptor, without using and updating the file descriptor's offset.
1592 * Note: This is similar to `preadv` in POSIX.
1593 * @return
1594 * The number of bytes read.
1595 */
1596__wasi_errno_t __wasi_fd_pread(
1597    __wasi_fd_t fd,
1598    /**
1599     * List of scatter/gather vectors in which to store data.
1600     */
1601    const __wasi_iovec_t *iovs,
1602    /**
1603     * The length of the array pointed to by `iovs`.
1604     */
1605    size_t iovs_len,
1606    /**
1607     * The offset within the file at which to read.
1608     */
1609    __wasi_filesize_t offset,
1610    __wasi_size_t *retptr0
1611) __attribute__((__warn_unused_result__));
1612/**
1613 * Return a description of the given preopened file descriptor.
1614 * @return
1615 * The buffer where the description is stored.
1616 */
1617__wasi_errno_t __wasi_fd_prestat_get(
1618    __wasi_fd_t fd,
1619    __wasi_prestat_t *retptr0
1620) __attribute__((__warn_unused_result__));
1621/**
1622 * Return a description of the given preopened file descriptor.
1623 */
1624__wasi_errno_t __wasi_fd_prestat_dir_name(
1625    __wasi_fd_t fd,
1626    /**
1627     * A buffer into which to write the preopened directory name.
1628     */
1629    uint8_t * path,
1630    __wasi_size_t path_len
1631) __attribute__((__warn_unused_result__));
1632/**
1633 * Write to a file descriptor, without using and updating the file descriptor's offset.
1634 * Note: This is similar to `pwritev` in POSIX.
1635 * @return
1636 * The number of bytes written.
1637 */
1638__wasi_errno_t __wasi_fd_pwrite(
1639    __wasi_fd_t fd,
1640    /**
1641     * List of scatter/gather vectors from which to retrieve data.
1642     */
1643    const __wasi_ciovec_t *iovs,
1644    /**
1645     * The length of the array pointed to by `iovs`.
1646     */
1647    size_t iovs_len,
1648    /**
1649     * The offset within the file at which to write.
1650     */
1651    __wasi_filesize_t offset,
1652    __wasi_size_t *retptr0
1653) __attribute__((__warn_unused_result__));
1654/**
1655 * Read from a file descriptor.
1656 * Note: This is similar to `readv` in POSIX.
1657 * @return
1658 * The number of bytes read.
1659 */
1660__wasi_errno_t __wasi_fd_read(
1661    __wasi_fd_t fd,
1662    /**
1663     * List of scatter/gather vectors to which to store data.
1664     */
1665    const __wasi_iovec_t *iovs,
1666    /**
1667     * The length of the array pointed to by `iovs`.
1668     */
1669    size_t iovs_len,
1670    __wasi_size_t *retptr0
1671) __attribute__((__warn_unused_result__));
1672/**
1673 * Read directory entries from a directory.
1674 * When successful, the contents of the output buffer consist of a sequence of
1675 * directory entries. Each directory entry consists of a `dirent` object,
1676 * followed by `dirent::d_namlen` bytes holding the name of the directory
1677 * entry.
1678 * This function fills the output buffer as much as possible, potentially
1679 * truncating the last directory entry. This allows the caller to grow its
1680 * read buffer size in case it's too small to fit a single large directory
1681 * entry, or skip the oversized directory entry.
1682 * @return
1683 * 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.
1684 */
1685__wasi_errno_t __wasi_fd_readdir(
1686    __wasi_fd_t fd,
1687    /**
1688     * The buffer where directory entries are stored
1689     */
1690    uint8_t * buf,
1691    __wasi_size_t buf_len,
1692    /**
1693     * The location within the directory to start reading
1694     */
1695    __wasi_dircookie_t cookie,
1696    __wasi_size_t *retptr0
1697) __attribute__((__warn_unused_result__));
1698/**
1699 * Atomically replace a file descriptor by renumbering another file descriptor.
1700 * Due to the strong focus on thread safety, this environment does not provide
1701 * a mechanism to duplicate or renumber a file descriptor to an arbitrary
1702 * number, like `dup2()`. This would be prone to race conditions, as an actual
1703 * file descriptor with the same number could be allocated by a different
1704 * thread at the same time.
1705 * This function provides a way to atomically renumber file descriptors, which
1706 * would disappear if `dup2()` were to be removed entirely.
1707 */
1708__wasi_errno_t __wasi_fd_renumber(
1709    __wasi_fd_t fd,
1710    /**
1711     * The file descriptor to overwrite.
1712     */
1713    __wasi_fd_t to
1714) __attribute__((__warn_unused_result__));
1715/**
1716 * Move the offset of a file descriptor.
1717 * Note: This is similar to `lseek` in POSIX.
1718 * @return
1719 * The new offset of the file descriptor, relative to the start of the file.
1720 */
1721__wasi_errno_t __wasi_fd_seek(
1722    __wasi_fd_t fd,
1723    /**
1724     * The number of bytes to move.
1725     */
1726    __wasi_filedelta_t offset,
1727    /**
1728     * The base from which the offset is relative.
1729     */
1730    __wasi_whence_t whence,
1731    __wasi_filesize_t *retptr0
1732) __attribute__((__warn_unused_result__));
1733/**
1734 * Synchronize the data and metadata of a file to disk.
1735 * Note: This is similar to `fsync` in POSIX.
1736 */
1737__wasi_errno_t __wasi_fd_sync(
1738    __wasi_fd_t fd
1739) __attribute__((__warn_unused_result__));
1740/**
1741 * Return the current offset of a file descriptor.
1742 * Note: This is similar to `lseek(fd, 0, SEEK_CUR)` in POSIX.
1743 * @return
1744 * The current offset of the file descriptor, relative to the start of the file.
1745 */
1746__wasi_errno_t __wasi_fd_tell(
1747    __wasi_fd_t fd,
1748    __wasi_filesize_t *retptr0
1749) __attribute__((__warn_unused_result__));
1750/**
1751 * Write to a file descriptor.
1752 * Note: This is similar to `writev` in POSIX.
1753 */
1754__wasi_errno_t __wasi_fd_write(
1755    __wasi_fd_t fd,
1756    /**
1757     * List of scatter/gather vectors from which to retrieve data.
1758     */
1759    const __wasi_ciovec_t *iovs,
1760    /**
1761     * The length of the array pointed to by `iovs`.
1762     */
1763    size_t iovs_len,
1764    __wasi_size_t *retptr0
1765) __attribute__((__warn_unused_result__));
1766/**
1767 * Create a directory.
1768 * Note: This is similar to `mkdirat` in POSIX.
1769 */
1770__wasi_errno_t __wasi_path_create_directory(
1771    __wasi_fd_t fd,
1772    /**
1773     * The path at which to create the directory.
1774     */
1775    const char *path
1776) __attribute__((__warn_unused_result__));
1777/**
1778 * Return the attributes of a file or directory.
1779 * Note: This is similar to `stat` in POSIX.
1780 * @return
1781 * The buffer where the file's attributes are stored.
1782 */
1783__wasi_errno_t __wasi_path_filestat_get(
1784    __wasi_fd_t fd,
1785    /**
1786     * Flags determining the method of how the path is resolved.
1787     */
1788    __wasi_lookupflags_t flags,
1789    /**
1790     * The path of the file or directory to inspect.
1791     */
1792    const char *path,
1793    __wasi_filestat_t *retptr0
1794) __attribute__((__warn_unused_result__));
1795/**
1796 * Adjust the timestamps of a file or directory.
1797 * Note: This is similar to `utimensat` in POSIX.
1798 */
1799__wasi_errno_t __wasi_path_filestat_set_times(
1800    __wasi_fd_t fd,
1801    /**
1802     * Flags determining the method of how the path is resolved.
1803     */
1804    __wasi_lookupflags_t flags,
1805    /**
1806     * The path of the file or directory to operate on.
1807     */
1808    const char *path,
1809    /**
1810     * The desired values of the data access timestamp.
1811     */
1812    __wasi_timestamp_t atim,
1813    /**
1814     * The desired values of the data modification timestamp.
1815     */
1816    __wasi_timestamp_t mtim,
1817    /**
1818     * A bitmask indicating which timestamps to adjust.
1819     */
1820    __wasi_fstflags_t fst_flags
1821) __attribute__((__warn_unused_result__));
1822/**
1823 * Create a hard link.
1824 * Note: This is similar to `linkat` in POSIX.
1825 */
1826__wasi_errno_t __wasi_path_link(
1827    __wasi_fd_t old_fd,
1828    /**
1829     * Flags determining the method of how the path is resolved.
1830     */
1831    __wasi_lookupflags_t old_flags,
1832    /**
1833     * The source path from which to link.
1834     */
1835    const char *old_path,
1836    /**
1837     * The working directory at which the resolution of the new path starts.
1838     */
1839    __wasi_fd_t new_fd,
1840    /**
1841     * The destination path at which to create the hard link.
1842     */
1843    const char *new_path
1844) __attribute__((__warn_unused_result__));
1845/**
1846 * Open a file or directory.
1847 * The returned file descriptor is not guaranteed to be the lowest-numbered
1848 * file descriptor not currently open; it is randomized to prevent
1849 * applications from depending on making assumptions about indexes, since this
1850 * is error-prone in multi-threaded contexts. The returned file descriptor is
1851 * guaranteed to be less than 2**31.
1852 * Note: This is similar to `openat` in POSIX.
1853 * @return
1854 * The file descriptor of the file that has been opened.
1855 */
1856__wasi_errno_t __wasi_path_open(
1857    __wasi_fd_t fd,
1858    /**
1859     * Flags determining the method of how the path is resolved.
1860     */
1861    __wasi_lookupflags_t dirflags,
1862    /**
1863     * The relative path of the file or directory to open, relative to the
1864     * `path_open::fd` directory.
1865     */
1866    const char *path,
1867    /**
1868     * The method by which to open the file.
1869     */
1870    __wasi_oflags_t oflags,
1871    /**
1872     * The initial rights of the newly created file descriptor. The
1873     * implementation is allowed to return a file descriptor with fewer rights
1874     * than specified, if and only if those rights do not apply to the type of
1875     * file being opened.
1876     * The *base* rights are rights that will apply to operations using the file
1877     * descriptor itself, while the *inheriting* rights are rights that apply to
1878     * file descriptors derived from it.
1879     */
1880    __wasi_rights_t fs_rights_base,
1881    __wasi_rights_t fs_rights_inheriting,
1882    __wasi_fdflags_t fdflags,
1883    __wasi_fd_t *retptr0
1884) __attribute__((__warn_unused_result__));
1885/**
1886 * Read the contents of a symbolic link.
1887 * Note: This is similar to `readlinkat` in POSIX.
1888 * @return
1889 * The number of bytes placed in the buffer.
1890 */
1891__wasi_errno_t __wasi_path_readlink(
1892    __wasi_fd_t fd,
1893    /**
1894     * The path of the symbolic link from which to read.
1895     */
1896    const char *path,
1897    /**
1898     * The buffer to which to write the contents of the symbolic link.
1899     */
1900    uint8_t * buf,
1901    __wasi_size_t buf_len,
1902    __wasi_size_t *retptr0
1903) __attribute__((__warn_unused_result__));
1904/**
1905 * Remove a directory.
1906 * Return `errno::notempty` if the directory is not empty.
1907 * Note: This is similar to `unlinkat(fd, path, AT_REMOVEDIR)` in POSIX.
1908 */
1909__wasi_errno_t __wasi_path_remove_directory(
1910    __wasi_fd_t fd,
1911    /**
1912     * The path to a directory to remove.
1913     */
1914    const char *path
1915) __attribute__((__warn_unused_result__));
1916/**
1917 * Rename a file or directory.
1918 * Note: This is similar to `renameat` in POSIX.
1919 */
1920__wasi_errno_t __wasi_path_rename(
1921    __wasi_fd_t fd,
1922    /**
1923     * The source path of the file or directory to rename.
1924     */
1925    const char *old_path,
1926    /**
1927     * The working directory at which the resolution of the new path starts.
1928     */
1929    __wasi_fd_t new_fd,
1930    /**
1931     * The destination path to which to rename the file or directory.
1932     */
1933    const char *new_path
1934) __attribute__((__warn_unused_result__));
1935/**
1936 * Create a symbolic link.
1937 * Note: This is similar to `symlinkat` in POSIX.
1938 */
1939__wasi_errno_t __wasi_path_symlink(
1940    /**
1941     * The contents of the symbolic link.
1942     */
1943    const char *old_path,
1944    __wasi_fd_t fd,
1945    /**
1946     * The destination path at which to create the symbolic link.
1947     */
1948    const char *new_path
1949) __attribute__((__warn_unused_result__));
1950/**
1951 * Unlink a file.
1952 * Return `errno::isdir` if the path refers to a directory.
1953 * Note: This is similar to `unlinkat(fd, path, 0)` in POSIX.
1954 */
1955__wasi_errno_t __wasi_path_unlink_file(
1956    __wasi_fd_t fd,
1957    /**
1958     * The path to a file to unlink.
1959     */
1960    const char *path
1961) __attribute__((__warn_unused_result__));
1962/**
1963 * Concurrently poll for the occurrence of a set of events.
1964 * @return
1965 * The number of events stored.
1966 */
1967__wasi_errno_t __wasi_poll_oneoff(
1968    /**
1969     * The events to which to subscribe.
1970     */
1971    const __wasi_subscription_t * in,
1972    /**
1973     * The events that have occurred.
1974     */
1975    __wasi_event_t * out,
1976    /**
1977     * Both the number of subscriptions and events.
1978     */
1979    __wasi_size_t nsubscriptions,
1980    __wasi_size_t *retptr0
1981) __attribute__((__warn_unused_result__));
1982/**
1983 * Terminate the process normally. An exit code of 0 indicates successful
1984 * termination of the program. The meanings of other values is dependent on
1985 * the environment.
1986 */
1987_Noreturn void __wasi_proc_exit(
1988    /**
1989     * The exit code returned by the process.
1990     */
1991    __wasi_exitcode_t rval
1992);
1993/**
1994 * Temporarily yield execution of the calling thread.
1995 * Note: This is similar to `sched_yield` in POSIX.
1996 */
1997__wasi_errno_t __wasi_sched_yield(
1998    void
1999) __attribute__((__warn_unused_result__));
2000/**
2001 * Write high-quality random data into a buffer.
2002 * This function blocks when the implementation is unable to immediately
2003 * provide sufficient high-quality random data.
2004 * This function may execute slowly, so when large mounts of random data are
2005 * required, it's advisable to use this function to seed a pseudo-random
2006 * number generator, rather than to provide the random data directly.
2007 */
2008__wasi_errno_t __wasi_random_get(
2009    /**
2010     * The buffer to fill with random data.
2011     */
2012    uint8_t * buf,
2013    __wasi_size_t buf_len
2014) __attribute__((__warn_unused_result__));
2015/**
2016 * Accept a new incoming connection.
2017 * Note: This is similar to `accept` in POSIX.
2018 * @return
2019 * New socket connection
2020 */
2021__wasi_errno_t __wasi_sock_accept(
2022    /**
2023     * The listening socket.
2024     */
2025    __wasi_fd_t fd,
2026    /**
2027     * The desired values of the file descriptor flags.
2028     */
2029    __wasi_fdflags_t flags,
2030    __wasi_fd_t *retptr0
2031) __attribute__((__warn_unused_result__));
2032/**
2033 * Receive a message from a socket.
2034 * Note: This is similar to `recv` in POSIX, though it also supports reading
2035 * the data into multiple buffers in the manner of `readv`.
2036 * @return
2037 * Number of bytes stored in ri_data and message flags.
2038 */
2039__wasi_errno_t __wasi_sock_recv(
2040    __wasi_fd_t fd,
2041    /**
2042     * List of scatter/gather vectors to which to store data.
2043     */
2044    const __wasi_iovec_t *ri_data,
2045    /**
2046     * The length of the array pointed to by `ri_data`.
2047     */
2048    size_t ri_data_len,
2049    /**
2050     * Message flags.
2051     */
2052    __wasi_riflags_t ri_flags,
2053    __wasi_size_t *retptr0,
2054    __wasi_roflags_t *retptr1
2055) __attribute__((__warn_unused_result__));
2056/**
2057 * Send a message on a socket.
2058 * Note: This is similar to `send` in POSIX, though it also supports writing
2059 * the data from multiple buffers in the manner of `writev`.
2060 * @return
2061 * Number of bytes transmitted.
2062 */
2063__wasi_errno_t __wasi_sock_send(
2064    __wasi_fd_t fd,
2065    /**
2066     * List of scatter/gather vectors to which to retrieve data
2067     */
2068    const __wasi_ciovec_t *si_data,
2069    /**
2070     * The length of the array pointed to by `si_data`.
2071     */
2072    size_t si_data_len,
2073    /**
2074     * Message flags.
2075     */
2076    __wasi_siflags_t si_flags,
2077    __wasi_size_t *retptr0
2078) __attribute__((__warn_unused_result__));
2079/**
2080 * Shut down socket send and receive channels.
2081 * Note: This is similar to `shutdown` in POSIX.
2082 */
2083__wasi_errno_t __wasi_sock_shutdown(
2084    __wasi_fd_t fd,
2085    /**
2086     * Which channels on the socket to shut down.
2087     */
2088    __wasi_sdflags_t how
2089) __attribute__((__warn_unused_result__));
2090/** @} */
2091
2092#ifdef _REENTRANT
2093/**
2094 * Request a new thread to be created by the host.
2095 *
2096 * The host will create a new instance of the current module sharing its
2097 * memory, find an exported entry function--`wasi_thread_start`--, and call the
2098 * entry function with `start_arg` in the new thread.
2099 *
2100 * @see https://github.com/WebAssembly/wasi-threads/#readme
2101 */
2102int32_t __wasi_thread_spawn(
2103    /**
2104     * A pointer to an opaque struct to be passed to the module's entry
2105     * function.
2106     */
2107    void *start_arg
2108)  __attribute__((__warn_unused_result__));
2109#endif
2110
2111#ifdef __cplusplus
2112}
2113#endif
2114
2115#endif