Merge branch 'master' into fix-3197

This commit is contained in:
Felix Schütt
2022-10-11 11:48:56 +02:00
committed by GitHub
60 changed files with 14308 additions and 4499 deletions

496
Cargo.lock generated
View File

@@ -46,15 +46,6 @@ dependencies = [
"libc",
]
[[package]]
name = "ansi_term"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
dependencies = [
"winapi",
]
[[package]]
name = "anyhow"
version = "1.0.65"
@@ -96,6 +87,17 @@ dependencies = [
"wait-timeout",
]
[[package]]
name = "async-trait"
version = "0.1.57"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "76464446b8bc32758d7e88ee1a804d9914cd9b1cb264c029899680b0be29826f"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "atty"
version = "0.2.14"
@@ -149,34 +151,11 @@ dependencies = [
"serde",
]
[[package]]
name = "bindgen"
version = "0.56.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2da379dbebc0b76ef63ca68d8fc6e71c0f13e59432e0987e508c1820e6ab5239"
dependencies = [
"bitflags",
"cexpr",
"clang-sys",
"clap 2.34.0",
"env_logger",
"lazy_static",
"lazycell",
"log",
"peeking_take_while",
"proc-macro2",
"quote",
"regex",
"rustc-hash",
"shlex",
"which",
]
[[package]]
name = "bitflags"
version = "1.2.1"
version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "blake3"
@@ -280,7 +259,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a6358dedf60f4d9b8db43ad187391afe959746101346fe51bb978126bec61dfb"
dependencies = [
"clap 3.2.21",
"heck",
"heck 0.4.0",
"indexmap",
"log",
"proc-macro2",
@@ -301,15 +280,6 @@ dependencies = [
"jobserver",
]
[[package]]
name = "cexpr"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4aedb84272dbe89af497cf81375129abda4fc0a9e7c5d317498c15cc30c0d27"
dependencies = [
"nom 5.1.2",
]
[[package]]
name = "cfg-if"
version = "0.1.10"
@@ -336,30 +306,15 @@ dependencies = [
"winapi",
]
[[package]]
name = "clang-sys"
version = "1.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a050e2153c5be08febd6734e29298e844fdb0fa21aeddd63b4eb7baa106c69b"
dependencies = [
"glob",
"libc",
"libloading",
]
[[package]]
name = "clap"
version = "2.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
dependencies = [
"ansi_term",
"atty",
"bitflags",
"strsim 0.8.0",
"textwrap 0.11.0",
"unicode-width",
"vec_map",
]
[[package]]
@@ -374,7 +329,7 @@ dependencies = [
"clap_lex",
"indexmap",
"once_cell",
"strsim 0.10.0",
"strsim",
"termcolor",
"textwrap 0.15.0",
]
@@ -385,7 +340,7 @@ version = "3.2.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ea0c8bce528c4be4da13ea6fead8965e95b6073585a2f05204bd8f4119f82a65"
dependencies = [
"heck",
"heck 0.4.0",
"proc-macro-error",
"proc-macro2",
"quote",
@@ -487,6 +442,12 @@ version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
[[package]]
name = "convert_case"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb4a24b1aaf0fd0ce8b45161144d6f42cd91677fd5940fd431183eb023b3a2b8"
[[package]]
name = "core-foundation-sys"
version = "0.8.3"
@@ -844,6 +805,15 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d9d8664cf849d7d0f3114a3a387d2f5e4303176d746d5a951aaddc66dfe9240"
[[package]]
name = "dlib"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac1b7517328c04c2aa68422fc60a41b92208182142ed04a25879c26c8f878794"
dependencies = [
"libloading",
]
[[package]]
name = "doc-comment"
version = "0.3.3"
@@ -929,19 +899,6 @@ dependencies = [
"syn",
]
[[package]]
name = "env_logger"
version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3"
dependencies = [
"atty",
"humantime",
"log",
"regex",
"termcolor",
]
[[package]]
name = "erased-serde"
version = "0.3.23"
@@ -1013,6 +970,95 @@ version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
name = "futures"
version = "0.3.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f21eda599937fba36daeb58a22e8f5cee2d14c4a17b5b7739c7c8e5e3b8230c"
dependencies = [
"futures-channel",
"futures-core",
"futures-executor",
"futures-io",
"futures-sink",
"futures-task",
"futures-util",
]
[[package]]
name = "futures-channel"
version = "0.3.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30bdd20c28fadd505d0fd6712cdfcb0d4b5648baf45faef7f852afb2399bb050"
dependencies = [
"futures-core",
"futures-sink",
]
[[package]]
name = "futures-core"
version = "0.3.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e5aa3de05362c3fb88de6531e6296e85cde7739cccad4b9dfeeb7f6ebce56bf"
[[package]]
name = "futures-executor"
version = "0.3.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ff63c23854bee61b6e9cd331d523909f238fc7636290b96826e9cfa5faa00ab"
dependencies = [
"futures-core",
"futures-task",
"futures-util",
]
[[package]]
name = "futures-io"
version = "0.3.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbf4d2a7a308fd4578637c0b17c7e1c7ba127b8f6ba00b29f717e9655d85eb68"
[[package]]
name = "futures-macro"
version = "0.3.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42cd15d1c7456c04dbdf7e88bcd69760d74f3a798d6444e16974b505b0e62f17"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "futures-sink"
version = "0.3.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "21b20ba5a92e727ba30e72834706623d94ac93a725410b6a6b6fbc1b07f7ba56"
[[package]]
name = "futures-task"
version = "0.3.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a6508c467c73851293f390476d4491cf4d227dbabcd4170f3bb6044959b294f1"
[[package]]
name = "futures-util"
version = "0.3.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "44fb6cb1be61cc1d2e43b262516aafcf63b241cffdb1d3fa115f91d9c7b09c90"
dependencies = [
"futures-channel",
"futures-core",
"futures-io",
"futures-macro",
"futures-sink",
"futures-task",
"memchr",
"pin-project-lite",
"pin-utils",
"slab",
]
[[package]]
name = "fxhash"
version = "0.2.1"
@@ -1136,6 +1182,15 @@ dependencies = [
"ahash",
]
[[package]]
name = "heck"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c"
dependencies = [
"unicode-segmentation",
]
[[package]]
name = "heck"
version = "0.4.0"
@@ -1169,12 +1224,6 @@ dependencies = [
"webpki-roots",
]
[[package]]
name = "humantime"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
[[package]]
name = "iana-time-zone"
version = "0.1.48"
@@ -1189,6 +1238,12 @@ dependencies = [
"winapi",
]
[[package]]
name = "id-arena"
version = "2.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005"
[[package]]
name = "ident_case"
version = "1.0.1"
@@ -1267,6 +1322,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
dependencies = [
"cfg-if 1.0.0",
"js-sys",
"wasm-bindgen",
"web-sys",
]
[[package]]
@@ -1324,12 +1382,6 @@ version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "lazycell"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
[[package]]
name = "leb128"
version = "0.2.5"
@@ -1449,21 +1501,28 @@ dependencies = [
[[package]]
name = "minifb"
version = "0.19.3"
version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b6e41119d1667465608d36488fa5dcd228057a26c156e25f17f492f38435124"
checksum = "d9e21c5f89bb820c7878c300c5b944e65de0f1b2a75e0be92ce670b95943740e"
dependencies = [
"cc",
"dlib",
"futures",
"instant",
"js-sys",
"lazy_static",
"libc",
"orbclient",
"raw-window-handle 0.3.4",
"raw-window-handle 0.4.3",
"serde",
"serde_derive",
"tempfile",
"wasm-bindgen-futures",
"wayland-client",
"wayland-cursor",
"wayland-protocols",
"winapi",
"x11-dl",
"xkb",
"xkbcommon-sys",
]
[[package]]
@@ -1498,25 +1557,28 @@ checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389"
[[package]]
name = "nix"
version = "0.20.2"
version = "0.24.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f5e06129fb611568ef4e868c14b326274959aa70ff7776e9d55323531c374945"
checksum = "195cdbc1741b8134346d515b3a56a1c94b0912758009cfd53f99ea0f57b065fc"
dependencies = [
"bitflags",
"cc",
"cfg-if 1.0.0",
"libc",
"memoffset",
]
[[package]]
name = "nom"
version = "5.1.2"
name = "nix"
version = "0.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af"
checksum = "e322c04a9e3440c327fca7b6c8a63e6890a32fa2ad689db972425f07e0d22abb"
dependencies = [
"memchr",
"version_check",
"autocfg",
"bitflags",
"cfg-if 1.0.0",
"libc",
"memoffset",
"pin-utils",
]
[[package]]
@@ -1658,12 +1720,6 @@ version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1de2e551fb905ac83f73f7aedf2f0cb4a0da7e35efa24a202a936269f1f18e1"
[[package]]
name = "peeking_take_while"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
[[package]]
name = "pest"
version = "2.3.1"
@@ -1680,6 +1736,12 @@ version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
[[package]]
name = "pin-utils"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
[[package]]
name = "pkg-config"
version = "0.3.25"
@@ -1845,6 +1907,17 @@ dependencies = [
"syn",
]
[[package]]
name = "pulldown-cmark"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ffade02495f22453cd593159ea2f59827aae7f53fa8323f756799b670881dcf8"
dependencies = [
"bitflags",
"memchr",
"unicase",
]
[[package]]
name = "quote"
version = "1.0.21"
@@ -1877,9 +1950,9 @@ dependencies = [
[[package]]
name = "rand_core"
version = "0.6.3"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [
"getrandom",
]
@@ -2068,12 +2141,6 @@ version = "0.1.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342"
[[package]]
name = "rustc-hash"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
[[package]]
name = "rustc_version"
version = "0.2.3"
@@ -2335,12 +2402,6 @@ dependencies = [
"lazy_static",
]
[[package]]
name = "shlex"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2"
[[package]]
name = "slab"
version = "0.4.7"
@@ -2432,12 +2493,6 @@ version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0"
[[package]]
name = "strsim"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
[[package]]
name = "strsim"
version = "0.10.0"
@@ -2637,6 +2692,21 @@ dependencies = [
"serde_json",
]
[[package]]
name = "tinyvec"
version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
dependencies = [
"tinyvec_macros",
]
[[package]]
name = "tinyvec_macros"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
[[package]]
name = "toml"
version = "0.5.9"
@@ -2771,12 +2841,33 @@ version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dcc811dc4066ac62f84f11307873c4850cb653bfa9b1719cee2bd2204a4bc5dd"
[[package]]
name = "unicode-normalization"
version = "0.1.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "854cbdc4f7bc6ae19c820d44abdc3277ac3e1b2b93db20a636825d9322fb60e6"
dependencies = [
"tinyvec",
]
[[package]]
name = "unicode-segmentation"
version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a"
[[package]]
name = "unicode-width"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
[[package]]
name = "unicode-xid"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
[[package]]
name = "unix_mode"
version = "0.1.3"
@@ -2789,12 +2880,6 @@ version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
[[package]]
name = "vec_map"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
[[package]]
name = "version-compare"
version = "0.1.0"
@@ -2845,6 +2930,14 @@ dependencies = [
"wast 24.0.0",
]
[[package]]
name = "wasi-types-generator-extra"
version = "0.1.0"
dependencies = [
"convert_case",
"wasmer-wit-parser",
]
[[package]]
name = "wasm-bindgen"
version = "0.2.83"
@@ -3399,7 +3492,7 @@ name = "wasmer-wasi-experimental-io-devices"
version = "3.0.0-beta.2"
dependencies = [
"minifb",
"nix",
"nix 0.25.0",
"ref_thread_local",
"serde",
"tracing",
@@ -3422,10 +3515,16 @@ name = "wasmer-wasi-types"
version = "3.0.0-beta.2"
dependencies = [
"byteorder",
"pretty_assertions",
"serde",
"time",
"wasmer",
"wasmer-derive",
"wasmer-types",
"wasmer-wit-bindgen-gen-core",
"wasmer-wit-bindgen-gen-rust-wasm",
"wasmer-wit-bindgen-rust",
"wasmer-wit-parser",
]
[[package]]
@@ -3442,6 +3541,73 @@ dependencies = [
"wast 38.0.1",
]
[[package]]
name = "wasmer-wit-bindgen-gen-core"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ff8aa5be5ae5d61f5e151dc2c0e603093fe28395d2083b65ef7a3547844054fe"
dependencies = [
"anyhow",
"wasmer-wit-parser",
]
[[package]]
name = "wasmer-wit-bindgen-gen-rust"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "438bce7c4589842bf100cc9b312443a9b5fc6440e58ab0b8c114e460219c3c3b"
dependencies = [
"heck 0.3.3",
"wasmer-wit-bindgen-gen-core",
]
[[package]]
name = "wasmer-wit-bindgen-gen-rust-wasm"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "505f5168cfee591840e13e158a5c5e2f95d6df1df710839021564f36bee7bafc"
dependencies = [
"heck 0.3.3",
"wasmer-wit-bindgen-gen-core",
"wasmer-wit-bindgen-gen-rust",
]
[[package]]
name = "wasmer-wit-bindgen-rust"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "968747f1271f74aab9b70d9c5d4921db9bd13b4ec3ba5506506e6e7dc58c918c"
dependencies = [
"async-trait",
"bitflags",
"wasmer-wit-bindgen-rust-impl",
]
[[package]]
name = "wasmer-wit-bindgen-rust-impl"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd26fe00d08bd2119870b017d13413dfbd51e7750b6634d649fc7a7bbc057b85"
dependencies = [
"proc-macro2",
"syn",
"wasmer-wit-bindgen-gen-core",
"wasmer-wit-bindgen-gen-rust-wasm",
]
[[package]]
name = "wasmer-wit-parser"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f46c9a15086be8a2eb3790613902b9d3a9a687833b17cd021de263a20378585a"
dependencies = [
"anyhow",
"id-arena",
"pulldown-cmark",
"unicode-normalization",
"unicode-xid",
]
[[package]]
name = "wasmer-workspace"
version = "3.0.0-beta.2"
@@ -3540,14 +3706,15 @@ dependencies = [
[[package]]
name = "wayland-client"
version = "0.28.6"
version = "0.29.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e3ab332350e502f159382201394a78e3cc12d0f04db863429260164ea40e0355"
checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715"
dependencies = [
"bitflags",
"downcast-rs",
"libc",
"nix",
"nix 0.24.2",
"scoped-tls",
"wayland-commons",
"wayland-scanner",
"wayland-sys",
@@ -3555,11 +3722,11 @@ dependencies = [
[[package]]
name = "wayland-commons"
version = "0.28.6"
version = "0.29.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a21817947c7011bbd0a27e11b17b337bfd022e8544b071a2641232047966fbda"
checksum = "8691f134d584a33a6606d9d717b95c4fa20065605f798a3f350d78dced02a902"
dependencies = [
"nix",
"nix 0.24.2",
"once_cell",
"smallvec",
"wayland-sys",
@@ -3567,20 +3734,20 @@ dependencies = [
[[package]]
name = "wayland-cursor"
version = "0.28.6"
version = "0.29.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be610084edd1586d45e7bdd275fe345c7c1873598caa464c4fb835dee70fa65a"
checksum = "6865c6b66f13d6257bef1cd40cbfe8ef2f150fb8ebbdb1e8e873455931377661"
dependencies = [
"nix",
"nix 0.24.2",
"wayland-client",
"xcursor",
]
[[package]]
name = "wayland-protocols"
version = "0.28.6"
version = "0.29.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "286620ea4d803bacf61fa087a4242ee316693099ee5a140796aaba02b29f861f"
checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6"
dependencies = [
"bitflags",
"wayland-client",
@@ -3590,9 +3757,9 @@ dependencies = [
[[package]]
name = "wayland-scanner"
version = "0.28.6"
version = "0.29.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ce923eb2deb61de332d1f356ec7b6bf37094dc5573952e1c8936db03b54c03f1"
checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53"
dependencies = [
"proc-macro2",
"quote",
@@ -3601,10 +3768,12 @@ dependencies = [
[[package]]
name = "wayland-sys"
version = "0.28.6"
version = "0.29.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d841fca9aed7febf9bed2e9796c49bf58d4152ceda8ac949ebe00868d8f0feb8"
checksum = "be12ce1a3c39ec7dba25594b97b42cb3195d54953ddb9d3d95a7c3902bc6e9d4"
dependencies = [
"dlib",
"lazy_static",
"pkg-config",
]
@@ -3637,15 +3806,6 @@ dependencies = [
"webpki",
]
[[package]]
name = "which"
version = "3.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d011071ae14a2f6671d0b74080ae0cd8ebf3a6f8c9589a2cd45f23126fe29724"
dependencies = [
"libc",
]
[[package]]
name = "winapi"
version = "0.3.9"
@@ -3780,29 +3940,7 @@ version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "463705a63313cd4301184381c5e8042f0a7e9b4bb63653f216311d4ae74690b7"
dependencies = [
"nom 7.1.1",
]
[[package]]
name = "xkb"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aec02bc5de902aa579f3d2f2c522edaf40fa42963cbaffe645b058ddcc68fdb2"
dependencies = [
"bitflags",
"libc",
"xkbcommon-sys",
]
[[package]]
name = "xkbcommon-sys"
version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "59a001b79d45b0b4541c228a501177f2b35db976bf7ee3f7fce8fa2381554ab5"
dependencies = [
"bindgen",
"libc",
"pkg-config",
"nom",
]
[[package]]

View File

@@ -45,6 +45,7 @@ members = [
"lib/vm",
"lib/wasi",
"lib/wasi-types",
"lib/wasi-types/wasi-types-generator-extra",
"lib/wasi-experimental-io-devices",
"lib/wasi-local-networking",
"lib/c-api/tests/wasmer-c-api-test-runner",

View File

@@ -58,6 +58,35 @@ impl<'a> MemoryView<'a> {
self.size
}
// TODO: do we want a proper implementation here instead?
/// Retrieve a slice of the memory contents.
///
/// # Safety
///
/// Until the returned slice is dropped, it is undefined behaviour to
/// modify the memory contents in any way including by calling a wasm
/// function that writes to the memory or by resizing the memory.
#[doc(hidden)]
pub unsafe fn data_unchecked(&self) -> &[u8] {
unimplemented!("direct data pointer access is not possible in JavaScript");
}
// TODO: do we want a proper implementation here instead?
/// Retrieve a mutable slice of the memory contents.
///
/// # Safety
///
/// This method provides interior mutability without an UnsafeCell. Until
/// the returned value is dropped, it is undefined behaviour to read or
/// write to the pointed-to memory in any way except through this slice,
/// including by calling a wasm function that reads the memory contents or
/// by resizing this Memory.
#[allow(clippy::mut_from_ref)]
#[doc(hidden)]
pub unsafe fn data_unchecked_mut(&self) -> &mut [u8] {
unimplemented!("direct data pointer access is not possible in JavaScript");
}
/// Returns the size (in [`Pages`]) of the `Memory`.
///
/// # Example

View File

@@ -234,7 +234,9 @@ impl Module {
}
/// Serializes a module into a binary representation that the `Engine`
/// can later process via [`Module::deserialize`].
/// can later process via
#[cfg_attr(feature = "compiler", doc = "[`Module::deserialize`].")]
#[cfg_attr(not(feature = "compiler"), doc = "`Module::deserialize`.")]
///
/// # Usage
///
@@ -252,7 +254,9 @@ impl Module {
}
/// Serializes a module into a file that the `Engine`
/// can later process via [`Module::deserialize_from_file`].
/// can later process via
#[cfg_attr(feature = "compiler", doc = "[`Module::deserialize_from_file`].")]
#[cfg_attr(not(feature = "compiler"), doc = "`Module::deserialize_from_file`.")]
///
/// # Usage
///

View File

@@ -26,7 +26,9 @@ pub(crate) struct StoreInner {
///
/// The `Store` holds the engine (that is —amongst many things— used to compile
/// the Wasm bytes into a valid module artifact), in addition to the
/// [`Tunables`] (that are used to create the memories, tables and globals).
#[cfg_attr(feature = "compiler", doc = "[`Tunables`]")]
#[cfg_attr(not(feature = "compiler"), doc = "`Tunables`")]
/// (that are used to create the memories, tables and globals).
///
/// Spec: <https://webassembly.github.io/spec/core/exec/runtime.html#store>
pub struct Store {

View File

@@ -178,11 +178,12 @@ mod tests {
use std::cell::UnsafeCell;
use std::ptr::NonNull;
use wasmer_types::{MemoryError, MemoryStyle, MemoryType, Pages, WASM_PAGE_SIZE};
use wasmer_vm::{LinearMemory, MaybeInstanceOwned};
use wasmer_vm::LinearMemory;
#[derive(Debug)]
struct VMTinyMemory {
mem: [u8; WASM_PAGE_SIZE],
mem: Vec<u8>,
memory_definition: Option<UnsafeCell<VMMemoryDefinition>>,
}
unsafe impl Send for VMTinyMemory {}
@@ -190,26 +191,35 @@ mod tests {
impl VMTinyMemory {
pub fn new() -> Result<Self, MemoryError> {
Ok(VMTinyMemory {
mem: [0; WASM_PAGE_SIZE],
})
let sz = 18 * WASM_PAGE_SIZE;
let mut memory = Vec::new();
memory.resize(sz, 0);
let mut ret = VMTinyMemory {
mem: memory,
memory_definition: None,
};
ret.memory_definition = Some(UnsafeCell::new(VMMemoryDefinition {
base: ret.mem.as_ptr() as _,
current_length: sz,
}));
Ok(ret)
}
}
impl LinearMemory for VMTinyMemory {
fn ty(&self) -> MemoryType {
MemoryType {
minimum: Pages::from(1u32),
maximum: Some(Pages::from(1u32)),
minimum: Pages::from(18u32),
maximum: Some(Pages::from(18u32)),
shared: false,
}
}
fn size(&self) -> Pages {
Pages::from(1u32)
Pages::from(18u32)
}
fn style(&self) -> MemoryStyle {
MemoryStyle::Static {
bound: Pages::from(1u32),
bound: Pages::from(18u32),
offset_guard_size: 0,
}
}
@@ -220,15 +230,28 @@ mod tests {
})
}
fn vmmemory(&self) -> NonNull<VMMemoryDefinition> {
MaybeInstanceOwned::Host(Box::new(UnsafeCell::new(VMMemoryDefinition {
base: self.mem.as_ptr() as _,
current_length: WASM_PAGE_SIZE,
})))
.as_ptr()
unsafe {
NonNull::new(
self.memory_definition
.as_ref()
.unwrap()
.get()
.as_mut()
.unwrap() as _,
)
.unwrap()
}
}
fn try_clone(&self) -> Option<Box<dyn LinearMemory + 'static>> {
None
}
/*
// this code allow custom memory to be ignoring init_memory
use wasmer_vm::Trap;
unsafe fn initialize_with_data(&self, _start: usize, _data: &[u8]) -> Result<(), Trap> {
Ok(())
}
*/
}
impl From<VMTinyMemory> for wasmer_vm::VMMemory {
@@ -241,7 +264,7 @@ mod tests {
impl Tunables for TinyTunables {
fn memory_style(&self, _memory: &MemoryType) -> MemoryStyle {
MemoryStyle::Static {
bound: Pages::from(1u32),
bound: Pages::from(18u32),
offset_guard_size: 0,
}
}
@@ -262,9 +285,16 @@ mod tests {
&self,
_ty: &MemoryType,
_style: &MemoryStyle,
_vm_definition_location: NonNull<VMMemoryDefinition>,
vm_definition_location: NonNull<VMMemoryDefinition>,
) -> Result<VMMemory, MemoryError> {
let memory = VMTinyMemory::new().unwrap();
// now, it's important to update vm_definition_location with the memory information!
let mut ptr = vm_definition_location;
let md = ptr.as_mut();
let unsafecell = memory.memory_definition.as_ref().unwrap();
let def = unsafecell.get().as_ref().unwrap();
md.base = def.base;
md.current_length = def.current_length;
Ok(memory.into())
}
@@ -293,13 +323,13 @@ mod tests {
let vmmemory = tunables.create_host_memory(
&MemoryType::new(1u32, Some(100u32), true),
&MemoryStyle::Static {
bound: Pages::from(1u32),
bound: Pages::from(18u32),
offset_guard_size: 0u64,
},
);
let mut vmmemory = vmmemory.unwrap();
assert!(vmmemory.grow(Pages::from(2u32)).is_err());
assert_eq!(vmmemory.size(), Pages::from(1u32));
assert!(vmmemory.grow(Pages::from(50u32)).is_err());
assert_eq!(vmmemory.size(), Pages::from(18u32));
assert_eq!(
vmmemory.grow(Pages::from(0u32)).err().unwrap(),
MemoryError::CouldNotGrow {
@@ -308,4 +338,42 @@ mod tests {
}
);
}
#[test]
fn check_customtunables() -> Result<(), Box<dyn std::error::Error>> {
use crate::{imports, wat2wasm, Instance, Memory, Module, Store};
use wasmer_compiler_cranelift::Cranelift;
let wasm_bytes = wat2wasm(
br#"(module
(memory (;0;) 18)
(global (;0;) (mut i32) i32.const 1048576)
(export "memory" (memory 0))
(data (;0;) (i32.const 1048576) "*\00\00\00")
)"#,
)?;
let compiler = Cranelift::default();
let tunables = TinyTunables {};
let mut store = Store::new_with_tunables(compiler, tunables);
//let mut store = Store::new(compiler);
let module = Module::new(&store, wasm_bytes)?;
let import_object = imports! {};
let instance = Instance::new(&mut store, &module, &import_object)?;
let mut memories: Vec<Memory> = instance
.exports
.iter()
.memories()
.map(|pair| pair.1.clone())
.collect();
assert_eq!(memories.len(), 1);
let first_memory = memories.pop().unwrap();
assert_eq!(first_memory.ty(&store).maximum.unwrap(), Pages(18));
let view = first_memory.view(&store);
let x = unsafe { view.data_unchecked_mut() }[0];
assert_eq!(x, 0);
Ok(())
}
}

View File

@@ -98,6 +98,7 @@ macro_rules! primitives {
)*)
}
primitives! {
bool
i8 u8
i16 u16
i32 u32

View File

@@ -206,6 +206,7 @@ impl Instance {
unsafe { self.vmctx_plus_offset(self.offsets.vmctx_tables_begin()) }
}
#[allow(dead_code)]
/// Get a locally defined or imported memory.
fn get_memory(&self, index: MemoryIndex) -> VMMemoryDefinition {
if let Some(local_index) = self.module.local_memory_index(index) {
@@ -240,6 +241,21 @@ impl Instance {
unsafe { self.vmctx_plus_offset(self.offsets.vmctx_memories_begin()) }
}
/// Get a locally defined or imported memory.
fn get_vmmemory(&self, index: MemoryIndex) -> &VMMemory {
if let Some(local_index) = self.module.local_memory_index(index) {
unsafe {
self.memories
.get(local_index)
.unwrap()
.get(self.context.as_ref().unwrap())
}
} else {
let import = self.imported_memory(index);
unsafe { import.handle.get(self.context.as_ref().unwrap()) }
}
}
/// Return the indexed `VMGlobalDefinition`.
fn global(&self, index: LocalGlobalIndex) -> VMGlobalDefinition {
unsafe { self.global_ptr(index).as_ref().clone() }
@@ -701,29 +717,22 @@ impl Instance {
) -> Result<(), Trap> {
// https://webassembly.github.io/bulk-memory-operations/core/exec/instructions.html#exec-memory-init
let memory = self.get_memory(memory_index);
let memory = self.get_vmmemory(memory_index);
let passive_data = self.passive_data.borrow();
let data = passive_data.get(&data_index).map_or(&[][..], |d| &**d);
let current_length = unsafe { memory.vmmemory().as_ref().current_length };
if src
.checked_add(len)
.map_or(true, |n| n as usize > data.len())
|| dst.checked_add(len).map_or(true, |m| {
usize::try_from(m).unwrap() > memory.current_length
})
|| dst
.checked_add(len)
.map_or(true, |m| usize::try_from(m).unwrap() > current_length)
{
return Err(Trap::lib(TrapCode::HeapAccessOutOfBounds));
}
let src_slice = &data[src as usize..(src + len) as usize];
unsafe {
let dst_start = memory.base.add(dst as usize);
let dst_slice = slice::from_raw_parts_mut(dst_start, len as usize);
dst_slice.copy_from_slice(src_slice);
}
Ok(())
unsafe { memory.initialize_with_data(dst as usize, src_slice) }
}
/// Drop the given data segment, truncating its length to zero.
@@ -1147,6 +1156,7 @@ fn get_memory_init_start(init: &DataInitializer<'_>, instance: &Instance) -> usi
}
#[allow(clippy::mut_from_ref)]
#[allow(dead_code)]
/// Return a byte-slice view of a memory's data.
unsafe fn get_memory_slice<'instance>(
init: &DataInitializer<'_>,
@@ -1242,21 +1252,18 @@ fn initialize_memories(
data_initializers: &[DataInitializer<'_>],
) -> Result<(), Trap> {
for init in data_initializers {
let memory = instance.get_memory(init.location.memory_index);
let memory = instance.get_vmmemory(init.location.memory_index);
let start = get_memory_init_start(init, instance);
unsafe {
let current_length = memory.vmmemory().as_ref().current_length;
if start
.checked_add(init.data.len())
.map_or(true, |end| end > memory.current_length)
.map_or(true, |end| end > current_length)
{
return Err(Trap::lib(TrapCode::HeapAccessOutOfBounds));
}
unsafe {
let mem_slice = get_memory_slice(init, instance);
let end = start + init.data.len();
let to_init = &mut mem_slice[start..end];
to_init.copy_from_slice(init.data);
memory.initialize_with_data(start, init.data)?;
}
}

View File

@@ -45,7 +45,7 @@ pub use crate::function_env::VMFunctionEnvironment;
pub use crate::global::*;
pub use crate::imports::Imports;
pub use crate::instance::{InstanceAllocator, InstanceHandle};
pub use crate::memory::{LinearMemory, VMMemory};
pub use crate::memory::{initialize_memory_with_data, LinearMemory, VMMemory};
pub use crate::mmap::Mmap;
pub use crate::probestack::PROBESTACK;
pub use crate::sig_registry::SignatureRegistry;

View File

@@ -5,11 +5,13 @@
//!
//! `Memory` is to WebAssembly linear memories what `Table` is to WebAssembly tables.
use crate::trap::Trap;
use crate::{mmap::Mmap, store::MaybeInstanceOwned, vmcontext::VMMemoryDefinition};
use more_asserts::assert_ge;
use std::cell::UnsafeCell;
use std::convert::TryInto;
use std::ptr::NonNull;
use std::slice;
use wasmer_types::{Bytes, MemoryError, MemoryStyle, MemoryType, Pages};
// The memory mapped area
@@ -342,6 +344,11 @@ impl LinearMemory for VMMemory {
fn try_clone(&self) -> Option<Box<dyn LinearMemory + 'static>> {
self.0.try_clone()
}
/// Initialize memory with data
unsafe fn initialize_with_data(&self, start: usize, data: &[u8]) -> Result<(), Trap> {
self.0.initialize_with_data(start, data)
}
}
impl VMMemory {
@@ -385,6 +392,21 @@ impl VMMemory {
}
}
#[doc(hidden)]
/// Default implementation to initialize memory with data
pub unsafe fn initialize_memory_with_data(
memory: &VMMemoryDefinition,
start: usize,
data: &[u8],
) -> Result<(), Trap> {
let mem_slice = slice::from_raw_parts_mut(memory.base, memory.current_length);
let end = start + data.len();
let to_init = &mut mem_slice[start..end];
to_init.copy_from_slice(data);
Ok(())
}
/// Represents memory that is used by the WebAsssembly module
pub trait LinearMemory
where
@@ -410,4 +432,14 @@ where
/// Attempts to clone this memory (if its clonable)
fn try_clone(&self) -> Option<Box<dyn LinearMemory + 'static>>;
#[doc(hidden)]
/// # Safety
/// This function is unsafe because WebAssembly specification requires that data is always set at initialization time.
/// It should be the implementors responsibility to make sure this respects the spec
unsafe fn initialize_with_data(&self, start: usize, data: &[u8]) -> Result<(), Trap> {
let memory = self.vmmemory().as_ref();
initialize_memory_with_data(memory, start, data)
}
}

View File

@@ -16,8 +16,8 @@ maintenance = { status = "experimental" }
[dependencies]
wasmer-wasi = { version = "=3.0.0-beta.2", path = "../wasi", default-features=false }
tracing = "0.1"
minifb = { version = "0.19", optional = true }
nix = "0.20.2"
minifb = { version = "0.23", optional = true }
nix = "0.25.0"
ref_thread_local = "0.1"
serde = "1"
typetag = "0.1"

View File

@@ -5,7 +5,10 @@ use std::collections::{BTreeSet, VecDeque};
use std::convert::TryInto;
use std::io::{Read, Seek, SeekFrom, Write};
use tracing::debug;
use wasmer_wasi::{types::*, WasiInodes};
use wasmer_wasi::{
types::{wasi::Filesize, *},
WasiInodes,
};
use wasmer_wasi::{Fd, VirtualFile, WasiFs, WasiFsError, ALL_RIGHTS, VIRTUAL_ROOT_FD};
use minifb::{Key, KeyRepeat, MouseButton, Scale, Window, WindowOptions};
@@ -417,7 +420,7 @@ impl VirtualFile for FrameBuffer {
fn size(&self) -> u64 {
0
}
fn set_len(&mut self, _new_size: __wasi_filesize_t) -> Result<(), WasiFsError> {
fn set_len(&mut self, _new_size: Filesize) -> Result<(), WasiFsError> {
Ok(())
}
fn unlink(&mut self) -> Result<(), WasiFsError> {

1
lib/wasi-types/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
wit-bindgen/

View File

@@ -10,12 +10,24 @@ license = "MIT"
readme = "README.md"
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
wasmer = { default-features = false, path = "../api", version = "3.0.0-beta" }
wit-bindgen-rust = { package = "wasmer-wit-bindgen-rust", version = "0.1.1" }
wit-bindgen-rust-wasm = { package = "wasmer-wit-bindgen-gen-rust-wasm", version = "0.1.1" }
wit-bindgen-core = { package = "wasmer-wit-bindgen-gen-core", version = "0.1.1" }
wit-parser = { package = "wasmer-wit-parser", version = "0.1.1" }
wasmer-types = { path = "../types", version = "=3.0.0-beta.2" }
wasmer-derive = { path = "../derive", version = "=3.0.0-beta.2" }
serde = { version = "1.0", features = ["derive"], optional = true }
byteorder = "1.3"
time = "0.2"
[dev-dependencies.pretty_assertions]
version = "1.3.0"
[features]
enable-serde = ["serde", "wasmer-types/serde"]
js = ["wasmer/js"]
sys = ["wasmer/sys"]

View File

@@ -1,3 +1,11 @@
# `wasmer-wasi-types` [![Build Status](https://github.com/wasmerio/wasmer/workflows/build/badge.svg?style=flat-square)](https://github.com/wasmerio/wasmer/actions?query=workflow%3Abuild) [![Join Wasmer Slack](https://img.shields.io/static/v1?label=Slack&message=join%20chat&color=brighgreen&style=flat-square)](https://slack.wasmer.io) [![MIT License](https://img.shields.io/github/license/wasmerio/wasmer.svg?style=flat-square)](https://github.com/wasmerio/wasmer/blob/master/LICENSE) [![crates.io](https://img.shields.io/crates/v/wasmer-wasi-types.svg)](https://crates.io/crates/wasmer-wasi-types)
This crate contains the WASI types necessary for `wasmer-wasi`. Please check this crate to learn more!
---
Run `regenerate.sh` to regenerate the wasi-types from
the `wasi-clean/typenames.wit` into the final Rust bindings.
The `wasi-types-generator-extra` generates some extra code
that wit-bindgen currently can't provide.

33
lib/wasi-types/regenerate.sh Executable file
View File

@@ -0,0 +1,33 @@
#!/bin/bash
BASEDIR=$(dirname "$0")
rm -f \
"$BASEDIR"/src/bindings.rs \
"$BASEDIR"/src/*/bindings.rs
cat "$BASEDIR"/wit-clean/typenames.wit "$BASEDIR"/wit-clean/wasi_unstable.wit > "$BASEDIR"/wit-clean/output.wit
git clone https://github.com/wasmerio/wit-bindgen --branch force-generate-structs --single-branch
git pull origin force-generate-structs
cd wit-bindgen
cargo build
cd ..
./wit-bindgen/target/debug/wit-bindgen rust-wasm \
--import "$BASEDIR"/wit-clean/output.wit \
--force-generate-structs \
--out-dir "$BASEDIR"/src/wasi \
awk '{sub(/mod output/,"pub mod output")}1' src/wasi/bindings.rs > src/wasi/bindings2.rs
cargo fmt --all
cp src/wasi/bindings2.rs src/wasi/bindings.rs
rm src/wasi/bindings2.rs
cd ./wasi-types-generator-extra
cargo build
pwd
../../../target/debug/wasi-types-generator-extra
cd ..
cargo fmt --all

View File

@@ -1,7 +0,0 @@
pub type __wasi_advice_t = u8;
pub const __WASI_ADVICE_NORMAL: u8 = 0;
pub const __WASI_ADVICE_SEQUENTIAL: u8 = 1;
pub const __WASI_ADVICE_RANDOM: u8 = 2;
pub const __WASI_ADVICE_WILLNEED: u8 = 3;
pub const __WASI_ADVICE_DONTNEED: u8 = 4;
pub const __WASI_ADVICE_NOREUSE: u8 = 5;

View File

@@ -1,113 +0,0 @@
use super::*;
use wasmer_derive::ValueType;
use wasmer_types::MemorySize;
pub type __wasi_busdataformat_t = u8;
pub const __WASI_BUS_DATA_FORMAT_RAW: __wasi_busdataformat_t = 0;
pub const __WASI_BUS_DATA_FORMAT_BINCODE: __wasi_busdataformat_t = 1;
pub const __WASI_BUS_DATA_FORMAT_MESSAGE_PACK: __wasi_busdataformat_t = 2;
pub const __WASI_BUS_DATA_FORMAT_JSON: __wasi_busdataformat_t = 3;
pub const __WASI_BUS_DATA_FORMAT_YAML: __wasi_busdataformat_t = 4;
pub const __WASI_BUS_DATA_FORMAT_XML: __wasi_busdataformat_t = 5;
pub const __WASI_BUS_DATA_FORMAT_RKYV: __wasi_busdataformat_t = 6;
pub type __wasi_buseventtype_t = u8;
pub const __WASI_BUS_EVENT_TYPE_NOOP: __wasi_buseventtype_t = 0;
pub const __WASI_BUS_EVENT_TYPE_EXIT: __wasi_buseventtype_t = 1;
pub const __WASI_BUS_EVENT_TYPE_CALL: __wasi_buseventtype_t = 2;
pub const __WASI_BUS_EVENT_TYPE_RESULT: __wasi_buseventtype_t = 3;
pub const __WASI_BUS_EVENT_TYPE_FAULT: __wasi_buseventtype_t = 4;
pub const __WASI_BUS_EVENT_TYPE_CLOSE: __wasi_buseventtype_t = 5;
pub type __wasi_bid_t = u32;
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_option_bid_t {
pub tag: __wasi_option_t,
pub bid: __wasi_bid_t,
}
pub type __wasi_cid_t = u8;
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_option_fd_t {
pub tag: __wasi_option_t,
pub fd: __wasi_fd_t,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_option_cid_t {
pub tag: __wasi_option_t,
pub cid: __wasi_cid_t,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_bus_handles_t {
pub bid: __wasi_bid_t,
pub stdin: __wasi_option_fd_t,
pub stdout: __wasi_option_fd_t,
pub stderr: __wasi_option_fd_t,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_busevent_exit_t {
pub bid: __wasi_bid_t,
pub rval: __wasi_exitcode_t,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_busevent_call_t<M: MemorySize> {
pub parent: __wasi_option_cid_t,
pub cid: __wasi_cid_t,
pub format: __wasi_busdataformat_t,
pub topic_ptr: M::Offset,
pub topic_len: M::Offset,
pub buf_ptr: M::Offset,
pub buf_len: M::Offset,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_busevent_result_t<M: MemorySize> {
pub format: __wasi_busdataformat_t,
pub cid: __wasi_cid_t,
pub buf_ptr: M::Offset,
pub buf_len: M::Offset,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_busevent_fault_t {
pub cid: __wasi_cid_t,
pub err: __bus_errno_t,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_busevent_close_t {
pub cid: __wasi_cid_t,
}
#[derive(Copy, Clone)]
#[repr(C)]
pub union __wasi_busevent_u<M: MemorySize> {
pub noop: u8,
pub exit: __wasi_busevent_exit_t,
pub call: __wasi_busevent_call_t<M>,
pub result: __wasi_busevent_result_t<M>,
pub fault: __wasi_busevent_fault_t,
pub close: __wasi_busevent_close_t,
}
#[derive(Copy, Clone)]
#[repr(C)]
pub struct __wasi_busevent_t<M: MemorySize> {
pub tag: __wasi_buseventtype_t,
pub u: __wasi_busevent_u<M>,
}

View File

@@ -1,60 +0,0 @@
use crate::*;
use std::mem;
use wasmer_derive::ValueType;
pub type __wasi_dircookie_t = u64;
pub const __WASI_DIRCOOKIE_START: u64 = 0;
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_dirent_t {
pub d_next: __wasi_dircookie_t,
pub d_ino: __wasi_inode_t,
pub d_namlen: u32,
pub d_type: __wasi_filetype_t,
}
pub fn dirent_to_le_bytes(ent: &__wasi_dirent_t) -> Vec<u8> {
let out: Vec<u8> = std::iter::empty()
.chain(ent.d_next.to_le_bytes())
.chain(ent.d_ino.to_le_bytes())
.chain(ent.d_namlen.to_le_bytes())
.chain(u32::from(ent.d_type).to_le_bytes())
.collect();
assert_eq!(out.len(), mem::size_of::<__wasi_dirent_t>());
out
}
#[cfg(test)]
mod tests {
use super::{__wasi_dirent_t, dirent_to_le_bytes};
#[test]
fn test_dirent_to_le_bytes() {
let s = __wasi_dirent_t {
d_next: 0x0123456789abcdef,
d_ino: 0xfedcba9876543210,
d_namlen: 0xaabbccdd,
d_type: 0x99,
};
assert_eq!(
vec![
// d_next
0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01,
//
// d_ino
0x10, 0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe,
//
// d_namelen
0xdd, 0xcc, 0xbb, 0xaa,
//
// d_type
// plus padding
0x99, 0x00, 0x00, 0x00,
],
dirent_to_le_bytes(&s)
);
}
}

View File

@@ -1,100 +0,0 @@
pub type __wasi_errno_t = u16;
pub const __WASI_ESUCCESS: u16 = 0;
pub const __WASI_E2BIG: u16 = 1;
pub const __WASI_EACCES: u16 = 2;
pub const __WASI_EADDRINUSE: u16 = 3;
pub const __WASI_EADDRNOTAVAIL: u16 = 4;
pub const __WASI_EAFNOSUPPORT: u16 = 5;
pub const __WASI_EAGAIN: u16 = 6;
pub const __WASI_EALREADY: u16 = 7;
pub const __WASI_EBADF: u16 = 8;
pub const __WASI_EBADMSG: u16 = 9;
pub const __WASI_EBUSY: u16 = 10;
pub const __WASI_ECANCELED: u16 = 11;
pub const __WASI_ECHILD: u16 = 12;
pub const __WASI_ECONNABORTED: u16 = 13;
pub const __WASI_ECONNREFUSED: u16 = 14;
pub const __WASI_ECONNRESET: u16 = 15;
pub const __WASI_EDEADLK: u16 = 16;
pub const __WASI_EDESTADDRREQ: u16 = 17;
pub const __WASI_EDOM: u16 = 18;
pub const __WASI_EDQUOT: u16 = 19;
pub const __WASI_EEXIST: u16 = 20;
pub const __WASI_EFAULT: u16 = 21;
pub const __WASI_EFBIG: u16 = 22;
pub const __WASI_EHOSTUNREACH: u16 = 23;
pub const __WASI_EIDRM: u16 = 24;
pub const __WASI_EILSEQ: u16 = 25;
pub const __WASI_EINPROGRESS: u16 = 26;
pub const __WASI_EINTR: u16 = 27;
pub const __WASI_EINVAL: u16 = 28;
pub const __WASI_EIO: u16 = 29;
pub const __WASI_EISCONN: u16 = 30;
pub const __WASI_EISDIR: u16 = 31;
pub const __WASI_ELOOP: u16 = 32;
pub const __WASI_EMFILE: u16 = 33;
pub const __WASI_EMLINK: u16 = 34;
pub const __WASI_EMSGSIZE: u16 = 35;
pub const __WASI_EMULTIHOP: u16 = 36;
pub const __WASI_ENAMETOOLONG: u16 = 37;
pub const __WASI_ENETDOWN: u16 = 38;
pub const __WASI_ENETRESET: u16 = 39;
pub const __WASI_ENETUNREACH: u16 = 40;
pub const __WASI_ENFILE: u16 = 41;
pub const __WASI_ENOBUFS: u16 = 42;
pub const __WASI_ENODEV: u16 = 43;
pub const __WASI_ENOENT: u16 = 44;
pub const __WASI_ENOEXEC: u16 = 45;
pub const __WASI_ENOLCK: u16 = 46;
pub const __WASI_ENOLINK: u16 = 47;
pub const __WASI_ENOMEM: u16 = 48;
pub const __WASI_ENOMSG: u16 = 49;
pub const __WASI_ENOPROTOOPT: u16 = 50;
pub const __WASI_ENOSPC: u16 = 51;
pub const __WASI_ENOSYS: u16 = 52;
pub const __WASI_ENOTCONN: u16 = 53;
pub const __WASI_ENOTDIR: u16 = 54;
pub const __WASI_ENOTEMPTY: u16 = 55;
pub const __WASI_ENOTRECOVERABLE: u16 = 56;
pub const __WASI_ENOTSOCK: u16 = 57;
pub const __WASI_ENOTSUP: u16 = 58;
pub const __WASI_ENOTTY: u16 = 59;
pub const __WASI_ENXIO: u16 = 60;
pub const __WASI_EOVERFLOW: u16 = 61;
pub const __WASI_EOWNERDEAD: u16 = 62;
pub const __WASI_EPERM: u16 = 63;
pub const __WASI_EPIPE: u16 = 64;
pub const __WASI_EPROTO: u16 = 65;
pub const __WASI_EPROTONOSUPPORT: u16 = 66;
pub const __WASI_EPROTOTYPE: u16 = 67;
pub const __WASI_ERANGE: u16 = 68;
pub const __WASI_EROFS: u16 = 69;
pub const __WASI_ESPIPE: u16 = 70;
pub const __WASI_ESRCH: u16 = 71;
pub const __WASI_ESTALE: u16 = 72;
pub const __WASI_ETIMEDOUT: u16 = 73;
pub const __WASI_ETXTBSY: u16 = 74;
pub const __WASI_EXDEV: u16 = 75;
pub const __WASI_ENOTCAPABLE: u16 = 76;
pub type __bus_errno_t = u32;
pub const __BUS_ESUCCESS: u32 = 0;
pub const __BUS_ESER: u32 = 1;
pub const __BUS_EDES: u32 = 2;
pub const __BUS_EWAPM: u32 = 3;
pub const __BUS_EFETCH: u32 = 4;
pub const __BUS_ECOMPILE: u32 = 5;
pub const __BUS_EABI: u32 = 6;
pub const __BUS_EABORTED: u32 = 7;
pub const __BUS_EBADHANDLE: u32 = 8;
pub const __BUS_ETOPIC: u32 = 9;
pub const __BUS_EBADCB: u32 = 10;
pub const __BUS_EUNSUPPORTED: u32 = 11;
pub const __BUS_EBADREQUEST: u32 = 12;
pub const __BUS_EDENIED: u32 = 13;
pub const __BUS_EINTERNAL: u32 = 14;
pub const __BUS_EALLOC: u32 = 15;
pub const __BUS_EINVOKE: u32 = 16;
pub const __BUS_ECONSUMED: u32 = 17;
pub const __BUS_EMEMVIOLATION: u32 = 18;
pub const __BUS_EUNKNOWN: u32 = 19;

View File

@@ -1,126 +0,0 @@
use crate::*;
use std::{
fmt,
mem::{self, MaybeUninit},
};
use wasmer_derive::ValueType;
use wasmer_types::ValueType;
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_event_fd_readwrite_t {
pub nbytes: __wasi_filesize_t,
pub flags: __wasi_eventrwflags_t,
}
#[derive(Copy, Clone)]
#[repr(C)]
pub union __wasi_event_u {
pub fd_readwrite: __wasi_event_fd_readwrite_t,
}
// TODO: remove this implementation of Debug when `__wasi_event_u` gets more than 1 variant
impl fmt::Debug for __wasi_event_u {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("__wasi_event_u")
.field("fd_readwrite", unsafe { &self.fd_readwrite })
.finish()
}
}
#[derive(Debug, Copy, Clone)]
pub enum EventEnum {
FdReadWrite {
nbytes: __wasi_filesize_t,
flags: __wasi_eventrwflags_t,
},
}
impl EventEnum {
pub fn untagged(self) -> __wasi_event_u {
match self {
EventEnum::FdReadWrite { nbytes, flags } => __wasi_event_u {
fd_readwrite: __wasi_event_fd_readwrite_t { nbytes, flags },
},
}
}
}
#[derive(Debug, Copy, Clone)]
#[repr(C)]
pub struct __wasi_event_t {
pub userdata: __wasi_userdata_t,
pub error: __wasi_errno_t,
pub type_: __wasi_eventtype_t,
pub u: __wasi_event_u,
}
impl __wasi_event_t {
pub fn tagged(&self) -> Option<EventEnum> {
match self.type_ {
__WASI_EVENTTYPE_FD_READ | __WASI_EVENTTYPE_FD_WRITE => Some(EventEnum::FdReadWrite {
nbytes: unsafe { self.u.fd_readwrite.nbytes },
flags: unsafe { self.u.fd_readwrite.flags },
}),
_ => None,
}
}
}
unsafe impl ValueType for __wasi_event_t {
fn zero_padding_bytes(&self, bytes: &mut [MaybeUninit<u8>]) {
macro_rules! field {
($($f:tt)*) => {
&self.$($f)* as *const _ as usize - self as *const _ as usize
};
}
macro_rules! field_end {
($($f:tt)*) => {
field!($($f)*) + mem::size_of_val(&self.$($f)*)
};
}
macro_rules! zero {
($start:expr, $end:expr) => {
for i in $start..$end {
bytes[i] = MaybeUninit::new(0);
}
};
}
self.userdata
.zero_padding_bytes(&mut bytes[field!(userdata)..field_end!(userdata)]);
zero!(field_end!(userdata), field!(error));
self.error
.zero_padding_bytes(&mut bytes[field!(error)..field_end!(error)]);
zero!(field_end!(error), field!(type_));
self.type_
.zero_padding_bytes(&mut bytes[field!(type_)..field_end!(type_)]);
zero!(field_end!(type_), field!(u));
match self.type_ {
__WASI_EVENTTYPE_FD_READ | __WASI_EVENTTYPE_FD_WRITE => unsafe {
self.u.fd_readwrite.zero_padding_bytes(
&mut bytes[field!(u.fd_readwrite)..field_end!(u.fd_readwrite)],
);
zero!(field_end!(u.fd_readwrite), field_end!(u));
},
_ => zero!(field!(u), field_end!(u)),
}
zero!(field_end!(u), mem::size_of_val(self));
}
}
pub type __wasi_eventrwflags_t = u16;
pub const __WASI_EVENT_FD_READWRITE_HANGUP: u16 = 1 << 0;
pub type __wasi_eventtype_t = u8;
pub const __WASI_EVENTTYPE_CLOCK: u8 = 0;
pub const __WASI_EVENTTYPE_FD_READ: u8 = 1;
pub const __WASI_EVENTTYPE_FD_WRITE: u8 = 2;
pub fn eventtype_to_str(event_type: __wasi_eventtype_t) -> &'static str {
match event_type {
__WASI_EVENTTYPE_CLOCK => "__WASI_EVENTTYPE_CLOCK",
__WASI_EVENTTYPE_FD_READ => "__WASI_EVENTTYPE_FD_READ",
__WASI_EVENTTYPE_FD_WRITE => "__WASI_EVENTTYPE_FD_WRITE",
_ => "INVALID EVENTTYPE",
}
}

View File

@@ -1,337 +0,0 @@
use crate::*;
#[cfg(feature = "enable-serde")]
use serde::{Deserialize, Serialize};
use std::{
fmt,
mem::{self, MaybeUninit},
};
use wasmer_derive::ValueType;
use wasmer_types::ValueType;
pub type __wasi_device_t = u64;
pub type __wasi_fd_t = u32;
pub const __WASI_STDIN_FILENO: __wasi_fd_t = 0;
pub const __WASI_STDOUT_FILENO: __wasi_fd_t = 1;
pub const __WASI_STDERR_FILENO: __wasi_fd_t = 2;
pub type __wasi_pid_t = u32;
pub type __wasi_tid_t = u32;
pub type __wasi_fdflags_t = u16;
pub const __WASI_FDFLAG_APPEND: __wasi_fdflags_t = 1 << 0;
pub const __WASI_FDFLAG_DSYNC: __wasi_fdflags_t = 1 << 1;
pub const __WASI_FDFLAG_NONBLOCK: __wasi_fdflags_t = 1 << 2;
pub const __WASI_FDFLAG_RSYNC: __wasi_fdflags_t = 1 << 3;
pub const __WASI_FDFLAG_SYNC: __wasi_fdflags_t = 1 << 4;
pub type __wasi_eventfdflags = u16;
pub const __WASI_EVENTFDFLAGS_SEMAPHORE: __wasi_eventfdflags = 1 << 0;
pub type __wasi_preopentype_t = u8;
pub const __WASI_PREOPENTYPE_DIR: __wasi_preopentype_t = 0;
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_prestat_u_dir_t {
pub pr_name_len: u32,
}
#[derive(Copy, Clone)]
#[repr(C)]
pub union __wasi_prestat_u {
dir: __wasi_prestat_u_dir_t,
}
impl fmt::Debug for __wasi_prestat_u {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "__wasi_prestat_u")
}
}
#[derive(Debug, Copy, Clone)]
#[repr(C)]
pub struct __wasi_prestat_t {
pub pr_type: __wasi_preopentype_t,
pub u: __wasi_prestat_u,
}
#[derive(Copy, Clone)]
pub enum PrestatEnum {
Dir { pr_name_len: u32 },
}
impl PrestatEnum {
pub fn untagged(self) -> __wasi_prestat_u {
match self {
PrestatEnum::Dir { pr_name_len } => __wasi_prestat_u {
dir: __wasi_prestat_u_dir_t { pr_name_len },
},
}
}
}
impl __wasi_prestat_t {
#[allow(clippy::trivially_copy_pass_by_ref)]
pub fn tagged(&self) -> Option<PrestatEnum> {
match self.pr_type {
__WASI_PREOPENTYPE_DIR => Some(PrestatEnum::Dir {
pr_name_len: unsafe { self.u.dir.pr_name_len },
}),
_ => None,
}
}
}
unsafe impl ValueType for __wasi_prestat_t {
fn zero_padding_bytes(&self, bytes: &mut [MaybeUninit<u8>]) {
macro_rules! field {
($($f:tt)*) => {
&self.$($f)* as *const _ as usize - self as *const _ as usize
};
}
macro_rules! field_end {
($($f:tt)*) => {
field!($($f)*) + mem::size_of_val(&self.$($f)*)
};
}
macro_rules! zero {
($start:expr, $end:expr) => {
for i in $start..$end {
bytes[i] = MaybeUninit::new(0);
}
};
}
self.pr_type
.zero_padding_bytes(&mut bytes[field!(pr_type)..field_end!(pr_type)]);
zero!(field_end!(pr_type), field!(u));
match self.pr_type {
__WASI_PREOPENTYPE_DIR => unsafe {
self.u
.dir
.zero_padding_bytes(&mut bytes[field!(u.dir)..field_end!(u.dir)]);
zero!(field_end!(u.dir), field_end!(u));
},
_ => zero!(field!(u), field_end!(u)),
}
zero!(field_end!(u), mem::size_of_val(self));
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_fdstat_t {
pub fs_filetype: __wasi_filetype_t,
pub fs_flags: __wasi_fdflags_t,
pub fs_rights_base: __wasi_rights_t,
pub fs_rights_inheriting: __wasi_rights_t,
}
pub type __wasi_filedelta_t = i64;
pub type __wasi_filesize_t = u64;
#[derive(Copy, Clone, PartialEq, Eq, ValueType)]
#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
#[repr(C)]
pub struct __wasi_filestat_t {
pub st_dev: __wasi_device_t,
pub st_ino: __wasi_inode_t,
pub st_filetype: __wasi_filetype_t,
pub st_nlink: __wasi_linkcount_t,
pub st_size: __wasi_filesize_t,
pub st_atim: __wasi_timestamp_t,
pub st_mtim: __wasi_timestamp_t,
pub st_ctim: __wasi_timestamp_t,
}
impl Default for __wasi_filestat_t {
fn default() -> Self {
__wasi_filestat_t {
st_dev: Default::default(),
st_ino: Default::default(),
st_filetype: __WASI_FILETYPE_UNKNOWN,
st_nlink: 1,
st_size: Default::default(),
st_atim: Default::default(),
st_mtim: Default::default(),
st_ctim: Default::default(),
}
}
}
impl fmt::Debug for __wasi_filestat_t {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let convert_ts_into_time_string = |ts| {
let tspec = ::time::OffsetDateTime::from_unix_timestamp_nanos(ts);
format!("{} ({})", tspec.format("%a, %d %b %Y %T %z"), ts)
};
f.debug_struct("__wasi_filestat_t")
.field("st_dev", &self.st_dev)
.field("st_ino", &self.st_ino)
.field(
"st_filetype",
&format!(
"{} ({})",
wasi_filetype_to_name(self.st_filetype),
self.st_filetype,
),
)
.field("st_nlink", &self.st_nlink)
.field("st_size", &self.st_size)
.field(
"st_atim",
&convert_ts_into_time_string(self.st_atim as i128),
)
.field(
"st_mtim",
&convert_ts_into_time_string(self.st_mtim as i128),
)
.field(
"st_ctim",
&convert_ts_into_time_string(self.st_ctim as i128),
)
.finish()
}
}
pub fn wasi_filetype_to_name(ft: __wasi_filetype_t) -> &'static str {
match ft {
__WASI_FILETYPE_UNKNOWN => "Unknown",
__WASI_FILETYPE_BLOCK_DEVICE => "Block device",
__WASI_FILETYPE_CHARACTER_DEVICE => "Character device",
__WASI_FILETYPE_DIRECTORY => "Directory",
__WASI_FILETYPE_REGULAR_FILE => "Regular file",
__WASI_FILETYPE_SOCKET_DGRAM => "Socket dgram",
__WASI_FILETYPE_SOCKET_STREAM => "Socket stream",
__WASI_FILETYPE_SYMBOLIC_LINK => "Symbolic link",
_ => "Invalid",
}
}
pub type __wasi_filetype_t = u8;
pub const __WASI_FILETYPE_UNKNOWN: __wasi_filetype_t = 0;
pub const __WASI_FILETYPE_BLOCK_DEVICE: __wasi_filetype_t = 1;
pub const __WASI_FILETYPE_CHARACTER_DEVICE: __wasi_filetype_t = 2;
pub const __WASI_FILETYPE_DIRECTORY: __wasi_filetype_t = 3;
pub const __WASI_FILETYPE_REGULAR_FILE: __wasi_filetype_t = 4;
pub const __WASI_FILETYPE_SOCKET_DGRAM: __wasi_filetype_t = 5;
pub const __WASI_FILETYPE_SOCKET_STREAM: __wasi_filetype_t = 6;
pub const __WASI_FILETYPE_SYMBOLIC_LINK: __wasi_filetype_t = 7;
pub const __WASI_FILETYPE_SOCKET_RAW: __wasi_filetype_t = 8;
pub const __WASI_FILETYPE_SOCKET_SEQPACKET: __wasi_filetype_t = 9;
pub type __wasi_fstflags_t = u16;
pub const __WASI_FILESTAT_SET_ATIM: __wasi_fstflags_t = 1 << 0;
pub const __WASI_FILESTAT_SET_ATIM_NOW: __wasi_fstflags_t = 1 << 1;
pub const __WASI_FILESTAT_SET_MTIM: __wasi_fstflags_t = 1 << 2;
pub const __WASI_FILESTAT_SET_MTIM_NOW: __wasi_fstflags_t = 1 << 3;
pub type __wasi_inode_t = u64;
pub type __wasi_linkcount_t = u64;
pub type __wasi_lookupflags_t = u32;
pub const __WASI_LOOKUP_SYMLINK_FOLLOW: __wasi_lookupflags_t = 1 << 0;
pub type __wasi_oflags_t = u16;
pub const __WASI_O_CREAT: __wasi_oflags_t = 1 << 0;
pub const __WASI_O_DIRECTORY: __wasi_oflags_t = 1 << 1;
pub const __WASI_O_EXCL: __wasi_oflags_t = 1 << 2;
pub const __WASI_O_TRUNC: __wasi_oflags_t = 1 << 3;
pub type __wasi_rights_t = u64;
pub const __WASI_RIGHT_FD_DATASYNC: __wasi_rights_t = 1 << 0;
pub const __WASI_RIGHT_FD_READ: __wasi_rights_t = 1 << 1;
pub const __WASI_RIGHT_FD_SEEK: __wasi_rights_t = 1 << 2;
pub const __WASI_RIGHT_FD_FDSTAT_SET_FLAGS: __wasi_rights_t = 1 << 3;
pub const __WASI_RIGHT_FD_SYNC: __wasi_rights_t = 1 << 4;
pub const __WASI_RIGHT_FD_TELL: __wasi_rights_t = 1 << 5;
pub const __WASI_RIGHT_FD_WRITE: __wasi_rights_t = 1 << 6;
pub const __WASI_RIGHT_FD_ADVISE: __wasi_rights_t = 1 << 7;
pub const __WASI_RIGHT_FD_ALLOCATE: __wasi_rights_t = 1 << 8;
pub const __WASI_RIGHT_PATH_CREATE_DIRECTORY: __wasi_rights_t = 1 << 9;
pub const __WASI_RIGHT_PATH_CREATE_FILE: __wasi_rights_t = 1 << 10;
pub const __WASI_RIGHT_PATH_LINK_SOURCE: __wasi_rights_t = 1 << 11;
pub const __WASI_RIGHT_PATH_LINK_TARGET: __wasi_rights_t = 1 << 12;
pub const __WASI_RIGHT_PATH_OPEN: __wasi_rights_t = 1 << 13;
pub const __WASI_RIGHT_FD_READDIR: __wasi_rights_t = 1 << 14;
pub const __WASI_RIGHT_PATH_READLINK: __wasi_rights_t = 1 << 15;
pub const __WASI_RIGHT_PATH_RENAME_SOURCE: __wasi_rights_t = 1 << 16;
pub const __WASI_RIGHT_PATH_RENAME_TARGET: __wasi_rights_t = 1 << 17;
pub const __WASI_RIGHT_PATH_FILESTAT_GET: __wasi_rights_t = 1 << 18;
pub const __WASI_RIGHT_PATH_FILESTAT_SET_SIZE: __wasi_rights_t = 1 << 19;
pub const __WASI_RIGHT_PATH_FILESTAT_SET_TIMES: __wasi_rights_t = 1 << 20;
pub const __WASI_RIGHT_FD_FILESTAT_GET: __wasi_rights_t = 1 << 21;
pub const __WASI_RIGHT_FD_FILESTAT_SET_SIZE: __wasi_rights_t = 1 << 22;
pub const __WASI_RIGHT_FD_FILESTAT_SET_TIMES: __wasi_rights_t = 1 << 23;
pub const __WASI_RIGHT_PATH_SYMLINK: __wasi_rights_t = 1 << 24;
pub const __WASI_RIGHT_PATH_REMOVE_DIRECTORY: __wasi_rights_t = 1 << 25;
pub const __WASI_RIGHT_PATH_UNLINK_FILE: __wasi_rights_t = 1 << 26;
pub const __WASI_RIGHT_POLL_FD_READWRITE: __wasi_rights_t = 1 << 27;
pub const __WASI_RIGHT_SOCK_SHUTDOWN: __wasi_rights_t = 1 << 28;
pub const __WASI_RIGHT_SOCK_ACCEPT: __wasi_rights_t = 1 << 29;
pub const __WASI_RIGHT_SOCK_CONNECT: __wasi_rights_t = 1 << 30;
pub const __WASI_RIGHT_SOCK_LISTEN: __wasi_rights_t = 1 << 31;
pub const __WASI_RIGHT_SOCK_BIND: __wasi_rights_t = 1 << 32;
pub const __WASI_RIGHT_SOCK_RECV: __wasi_rights_t = 1 << 33;
pub const __WASI_RIGHT_SOCK_SEND: __wasi_rights_t = 1 << 34;
pub const __WASI_RIGHT_SOCK_ADDR_LOCAL: __wasi_rights_t = 1 << 35;
pub const __WASI_RIGHT_SOCK_ADDR_REMOTE: __wasi_rights_t = 1 << 36;
pub const __WASI_RIGHT_SOCK_RECV_FROM: __wasi_rights_t = 1 << 37;
pub const __WASI_RIGHT_SOCK_SEND_TO: __wasi_rights_t = 1 << 38;
/// function for debugging rights issues
#[allow(dead_code)]
pub fn print_right_set(rights: __wasi_rights_t) {
// BTreeSet for consistent order
let mut right_set = std::collections::BTreeSet::new();
for i in 0..28 {
let cur_right = rights & (1 << i);
if cur_right != 0 {
right_set.insert(right_to_string(cur_right).unwrap_or("INVALID RIGHT"));
}
}
println!("{:#?}", right_set);
}
/// expects a single right, returns None if out of bounds or > 1 bit set
pub fn right_to_string(right: __wasi_rights_t) -> Option<&'static str> {
Some(match right {
__WASI_RIGHT_FD_DATASYNC => "__WASI_RIGHT_FD_DATASYNC",
__WASI_RIGHT_FD_READ => "__WASI_RIGHT_FD_READ",
__WASI_RIGHT_FD_SEEK => "__WASI_RIGHT_FD_SEEK",
__WASI_RIGHT_FD_FDSTAT_SET_FLAGS => "__WASI_RIGHT_FD_FDSTAT_SET_FLAGS",
__WASI_RIGHT_FD_SYNC => "__WASI_RIGHT_FD_SYNC",
__WASI_RIGHT_FD_TELL => "__WASI_RIGHT_FD_TELL",
__WASI_RIGHT_FD_WRITE => "__WASI_RIGHT_FD_WRITE",
__WASI_RIGHT_FD_ADVISE => "__WASI_RIGHT_FD_ADVISE",
__WASI_RIGHT_FD_ALLOCATE => "__WASI_RIGHT_FD_ALLOCATE",
__WASI_RIGHT_PATH_CREATE_DIRECTORY => "__WASI_RIGHT_PATH_CREATE_DIRECTORY",
__WASI_RIGHT_PATH_CREATE_FILE => "__WASI_RIGHT_PATH_CREATE_FILE",
__WASI_RIGHT_PATH_LINK_SOURCE => "__WASI_RIGHT_PATH_LINK_SOURCE",
__WASI_RIGHT_PATH_LINK_TARGET => "__WASI_RIGHT_PATH_LINK_TARGET",
__WASI_RIGHT_PATH_OPEN => "__WASI_RIGHT_PATH_OPEN",
__WASI_RIGHT_FD_READDIR => "__WASI_RIGHT_FD_READDIR",
__WASI_RIGHT_PATH_READLINK => "__WASI_RIGHT_PATH_READLINK",
__WASI_RIGHT_PATH_RENAME_SOURCE => "__WASI_RIGHT_PATH_RENAME_SOURCE",
__WASI_RIGHT_PATH_RENAME_TARGET => "__WASI_RIGHT_PATH_RENAME_TARGET",
__WASI_RIGHT_PATH_FILESTAT_GET => "__WASI_RIGHT_PATH_FILESTAT_GET",
__WASI_RIGHT_PATH_FILESTAT_SET_SIZE => "__WASI_RIGHT_PATH_FILESTAT_SET_SIZE",
__WASI_RIGHT_PATH_FILESTAT_SET_TIMES => "__WASI_RIGHT_PATH_FILESTAT_SET_TIMES",
__WASI_RIGHT_FD_FILESTAT_GET => "__WASI_RIGHT_FD_FILESTAT_GET",
__WASI_RIGHT_FD_FILESTAT_SET_SIZE => "__WASI_RIGHT_FD_FILESTAT_SET_SIZE",
__WASI_RIGHT_FD_FILESTAT_SET_TIMES => "__WASI_RIGHT_FD_FILESTAT_SET_TIMES",
__WASI_RIGHT_PATH_SYMLINK => "__WASI_RIGHT_PATH_SYMLINK",
__WASI_RIGHT_PATH_UNLINK_FILE => "__WASI_RIGHT_PATH_UNLINK_FILE",
__WASI_RIGHT_PATH_REMOVE_DIRECTORY => "__WASI_RIGHT_PATH_REMOVE_DIRECTORY",
__WASI_RIGHT_POLL_FD_READWRITE => "__WASI_RIGHT_POLL_FD_READWRITE",
__WASI_RIGHT_SOCK_SHUTDOWN => "__WASI_RIGHT_SOCK_SHUTDOWN",
_ => return None,
})
}
pub type __wasi_whence_t = u8;
pub const __WASI_WHENCE_SET: __wasi_whence_t = 0;
pub const __WASI_WHENCE_CUR: __wasi_whence_t = 1;
pub const __WASI_WHENCE_END: __wasi_whence_t = 2;

View File

@@ -1,55 +0,0 @@
use wasmer_derive::ValueType;
use wasmer_types::MemorySize;
use crate::__wasi_fd_t;
pub type __wasi_count_t = u32;
pub type __wasi_option_t = u8;
pub const __WASI_OPTION_NONE: __wasi_option_t = 0;
pub const __WASI_OPTION_SOME: __wasi_option_t = 1;
pub type __wasi_bool_t = u8;
pub const __WASI_BOOL_FALSE: __wasi_bool_t = 0;
pub const __WASI_BOOL_TRUE: __wasi_bool_t = 1;
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_ciovec_t<M: MemorySize> {
pub buf: M::Offset,
pub buf_len: M::Offset,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_iovec_t<M: MemorySize> {
pub buf: M::Offset,
pub buf_len: M::Offset,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_tty_t {
pub cols: u32,
pub rows: u32,
pub width: u32,
pub height: u32,
pub stdin_tty: __wasi_bool_t,
pub stdout_tty: __wasi_bool_t,
pub stderr_tty: __wasi_bool_t,
pub echo: __wasi_bool_t,
pub line_buffered: __wasi_bool_t,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_pipe_handles_t {
pub pipe: __wasi_fd_t,
pub other: __wasi_fd_t,
}
pub type __wasi_stdiomode_t = u8;
pub const __WASI_STDIO_MODE_PIPED: __wasi_stdiomode_t = 1;
pub const __WASI_STDIO_MODE_INHERIT: __wasi_stdiomode_t = 2;
pub const __WASI_STDIO_MODE_NULL: __wasi_stdiomode_t = 3;
pub const __WASI_STDIO_MODE_LOG: __wasi_stdiomode_t = 4;

View File

@@ -1,42 +1,43 @@
#![deny(unused_mut)]
#![doc(html_favicon_url = "https://wasmer.io/images/icons/favicon-32x32.png")]
#![doc(html_logo_url = "https://github.com/wasmerio.png?size=200")]
#![allow(non_camel_case_types, clippy::identity_op)]
pub mod types;
pub mod wasi;
//! Wasmer's WASI types implementation.
//!
//! Those types aim at being used by [the `wasmer-wasi`
//! crate](https://github.com/wasmerio/wasmer/blob/master/lib/wasi).
// Prevent the CI from passing if the wasi/bindings.rs is not
// up to date with the output.wit file
#[test]
#[cfg(feature = "sys")]
fn fail_if_wit_files_arent_up_to_date() {
use wit_bindgen_core::Generator;
// Needed for #[derive(ValueType)]
extern crate wasmer_types as wasmer;
mod advice;
mod bus;
mod directory;
mod error;
mod event;
mod file;
mod io;
mod net;
mod signal;
mod subscription;
mod time;
mod versions;
pub use crate::time::*;
pub use advice::*;
pub use bus::*;
pub use directory::*;
pub use error::*;
pub use event::*;
pub use file::*;
pub use io::*;
pub use net::*;
pub use signal::*;
pub use subscription::*;
pub use versions::*;
pub type __wasi_exitcode_t = u32;
pub type __wasi_userdata_t = u64;
let output_wit = concat!(env!("CARGO_MANIFEST_DIR"), "/wit-clean/output.wit");
let bindings_target =
include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/wasi/bindings.rs"));
let mut generator = wit_bindgen_rust_wasm::Opts {
..wit_bindgen_rust_wasm::Opts::default()
}
.build();
let output_wit_parsed = wit_parser::Interface::parse_file(output_wit).unwrap();
let imports = vec![output_wit_parsed];
let exports = vec![];
let mut files = Default::default();
generator.generate_all(
&imports, &exports, &mut files, /* generate_structs */ true,
);
let generated = files
.iter()
.filter_map(|(k, v)| if k == "bindings.rs" { Some(v) } else { None })
.next()
.unwrap();
let generated_str = String::from_utf8_lossy(generated);
let generated_str = generated_str
.lines()
.map(|s| s.to_string())
.collect::<Vec<String>>()
.join("\r\n");
let generated_str = generated_str.replace("mod output {", "pub mod output {");
let bindings_target = bindings_target
.lines()
.map(|s| s.to_string())
.collect::<Vec<String>>()
.join("\r\n");
pretty_assertions::assert_eq!(generated_str, bindings_target); // output.wit out of date? regenerate bindings.rs
}

View File

@@ -1,494 +0,0 @@
use super::*;
use wasmer_derive::ValueType;
use crate::__wasi_option_timestamp_t;
pub type __wasi_socktype_t = u16;
pub const __WASI_SOCK_TYPE_DGRAM: __wasi_socktype_t = 0;
pub const __WASI_SOCK_TYPE_STREAM: __wasi_socktype_t = 1;
pub const __WASI_SOCK_TYPE_RAW: __wasi_socktype_t = 2;
pub const __WASI_SOCK_TYPE_SEQPACKET: __wasi_socktype_t = 3;
pub type __wasi_sockstatus_t = u8;
pub const __WASI_SOCK_STATUS_OPENING: __wasi_sockstatus_t = 0;
pub const __WASI_SOCK_STATUS_OPENED: __wasi_sockstatus_t = 1;
pub const __WASI_SOCK_STATUS_CLOSED: __wasi_sockstatus_t = 2;
pub const __WASI_SOCK_STATUS_FAILED: __wasi_sockstatus_t = 3;
pub type __wasi_sockoption_t = u8;
pub const __WASI_SOCK_OPTION_NOOP: __wasi_sockoption_t = 0;
pub const __WASI_SOCK_OPTION_REUSE_PORT: __wasi_sockoption_t = 1;
pub const __WASI_SOCK_OPTION_REUSE_ADDR: __wasi_sockoption_t = 2;
pub const __WASI_SOCK_OPTION_NO_DELAY: __wasi_sockoption_t = 3;
pub const __WASI_SOCK_OPTION_DONT_ROUTE: __wasi_sockoption_t = 4;
pub const __WASI_SOCK_OPTION_ONLY_V6: __wasi_sockoption_t = 5;
pub const __WASI_SOCK_OPTION_BROADCAST: __wasi_sockoption_t = 6;
pub const __WASI_SOCK_OPTION_MULTICAST_LOOP_V4: __wasi_sockoption_t = 7;
pub const __WASI_SOCK_OPTION_MULTICAST_LOOP_V6: __wasi_sockoption_t = 8;
pub const __WASI_SOCK_OPTION_PROMISCUOUS: __wasi_sockoption_t = 9;
pub const __WASI_SOCK_OPTION_LISTENING: __wasi_sockoption_t = 10;
pub const __WASI_SOCK_OPTION_LAST_ERROR: __wasi_sockoption_t = 11;
pub const __WASI_SOCK_OPTION_KEEP_ALIVE: __wasi_sockoption_t = 12;
pub const __WASI_SOCK_OPTION_LINGER: __wasi_sockoption_t = 13;
pub const __WASI_SOCK_OPTION_OOB_INLINE: __wasi_sockoption_t = 14;
pub const __WASI_SOCK_OPTION_RECV_BUF_SIZE: __wasi_sockoption_t = 15;
pub const __WASI_SOCK_OPTION_SEND_BUF_SIZE: __wasi_sockoption_t = 16;
pub const __WASI_SOCK_OPTION_RECV_LOWAT: __wasi_sockoption_t = 17;
pub const __WASI_SOCK_OPTION_SEND_LOWAT: __wasi_sockoption_t = 18;
pub const __WASI_SOCK_OPTION_RECV_TIMEOUT: __wasi_sockoption_t = 19;
pub const __WASI_SOCK_OPTION_SEND_TIMEOUT: __wasi_sockoption_t = 20;
pub const __WASI_SOCK_OPTION_CONNECT_TIMEOUT: __wasi_sockoption_t = 21;
pub const __WASI_SOCK_OPTION_ACCEPT_TIMEOUT: __wasi_sockoption_t = 22;
pub const __WASI_SOCK_OPTION_TTL: __wasi_sockoption_t = 23;
pub const __WASI_SOCK_OPTION_MULTICAST_TTL_V4: __wasi_sockoption_t = 24;
pub const __WASI_SOCK_OPTION_TYPE: __wasi_sockoption_t = 25;
pub const __WASI_SOCK_OPTION_PROTO: __wasi_sockoption_t = 26;
pub type __wasi_streamsecurity_t = u8;
pub const __WASI_STREAM_SECURITY_UNENCRYPTED: __wasi_streamsecurity_t = 0;
pub const __WASI_STREAM_SECURITY_ANY_ENCRYPTION: __wasi_streamsecurity_t = 1;
pub const __WASI_STREAM_SECURITY_CLASSIC_ENCRYPTION: __wasi_streamsecurity_t = 2;
pub const __WASI_STREAM_SECURITY_DOUBLE_ENCRYPTION: __wasi_streamsecurity_t = 3;
pub type __wasi_sockproto_t = u16;
pub const __WASI_SOCK_PROTO_IP: __wasi_sockproto_t = 0;
pub const __WASI_SOCK_PROTO_ICMP: __wasi_sockproto_t = 1;
pub const __WASI_SOCK_PROTO_IGMP: __wasi_sockproto_t = 2;
pub const __WASI_SOCK_PROTO_PROTO_3: __wasi_sockproto_t = 3;
pub const __WASI_SOCK_PROTO_IPIP: __wasi_sockproto_t = 4;
pub const __WASI_SOCK_PROTO_PROTO_5: __wasi_sockproto_t = 5;
pub const __WASI_SOCK_PROTO_TCP: __wasi_sockproto_t = 6;
pub const __WASI_SOCK_PROTO_PROTO_7: __wasi_sockproto_t = 7;
pub const __WASI_SOCK_PROTO_EGP: __wasi_sockproto_t = 8;
pub const __WASI_SOCK_PROTO_PROTO_9: __wasi_sockproto_t = 9;
pub const __WASI_SOCK_PROTO_PROTO_10: __wasi_sockproto_t = 10;
pub const __WASI_SOCK_PROTO_PROTO_11: __wasi_sockproto_t = 11;
pub const __WASI_SOCK_PROTO_PUP: __wasi_sockproto_t = 12;
pub const __WASI_SOCK_PROTO_PROTO_13: __wasi_sockproto_t = 13;
pub const __WASI_SOCK_PROTO_PROTO_14: __wasi_sockproto_t = 14;
pub const __WASI_SOCK_PROTO_PROTO_15: __wasi_sockproto_t = 15;
pub const __WASI_SOCK_PROTO_PROTO_16: __wasi_sockproto_t = 16;
pub const __WASI_SOCK_PROTO_UDP: __wasi_sockproto_t = 17;
pub const __WASI_SOCK_PROTO_PROTO_18: __wasi_sockproto_t = 18;
pub const __WASI_SOCK_PROTO_PROTO_19: __wasi_sockproto_t = 19;
pub const __WASI_SOCK_PROTO_PROTO_20: __wasi_sockproto_t = 20;
pub const __WASI_SOCK_PROTO_PROTO_21: __wasi_sockproto_t = 21;
pub const __WASI_SOCK_PROTO_IDP: __wasi_sockproto_t = 22;
pub const __WASI_SOCK_PROTO_PROTO_23: __wasi_sockproto_t = 23;
pub const __WASI_SOCK_PROTO_PROTO_24: __wasi_sockproto_t = 24;
pub const __WASI_SOCK_PROTO_PROTO_25: __wasi_sockproto_t = 25;
pub const __WASI_SOCK_PROTO_PROTO_26: __wasi_sockproto_t = 26;
pub const __WASI_SOCK_PROTO_PROTO_27: __wasi_sockproto_t = 27;
pub const __WASI_SOCK_PROTO_PROTO_28: __wasi_sockproto_t = 28;
pub const __WASI_SOCK_PROTO_PROTO_TP: __wasi_sockproto_t = 29;
pub const __WASI_SOCK_PROTO_PROTO_30: __wasi_sockproto_t = 30;
pub const __WASI_SOCK_PROTO_PROTO_31: __wasi_sockproto_t = 31;
pub const __WASI_SOCK_PROTO_PROTO_32: __wasi_sockproto_t = 32;
pub const __WASI_SOCK_PROTO_DCCP: __wasi_sockproto_t = 33;
pub const __WASI_SOCK_PROTO_PROTO_34: __wasi_sockproto_t = 34;
pub const __WASI_SOCK_PROTO_PROTO_35: __wasi_sockproto_t = 35;
pub const __WASI_SOCK_PROTO_PROTO_36: __wasi_sockproto_t = 36;
pub const __WASI_SOCK_PROTO_PROTO_37: __wasi_sockproto_t = 37;
pub const __WASI_SOCK_PROTO_PROTO_38: __wasi_sockproto_t = 38;
pub const __WASI_SOCK_PROTO_PROTO_39: __wasi_sockproto_t = 39;
pub const __WASI_SOCK_PROTO_PROTO_40: __wasi_sockproto_t = 40;
pub const __WASI_SOCK_PROTO_IPV6: __wasi_sockproto_t = 41;
pub const __WASI_SOCK_PROTO_PROTO_42: __wasi_sockproto_t = 42;
pub const __WASI_SOCK_PROTO_ROUTING: __wasi_sockproto_t = 43;
pub const __WASI_SOCK_PROTO_FRAGMENT: __wasi_sockproto_t = 44;
pub const __WASI_SOCK_PROTO_PROTO_45: __wasi_sockproto_t = 45;
pub const __WASI_SOCK_PROTO_RSVP: __wasi_sockproto_t = 46;
pub const __WASI_SOCK_PROTO_GRE: __wasi_sockproto_t = 47;
pub const __WASI_SOCK_PROTO_PROTO_48: __wasi_sockproto_t = 48;
pub const __WASI_SOCK_PROTO_PROTO_49: __wasi_sockproto_t = 49;
pub const __WASI_SOCK_PROTO_ESP: __wasi_sockproto_t = 50;
pub const __WASI_SOCK_PROTO_AH: __wasi_sockproto_t = 51;
pub const __WASI_SOCK_PROTO_PROTO_52: __wasi_sockproto_t = 52;
pub const __WASI_SOCK_PROTO_PROTO_53: __wasi_sockproto_t = 53;
pub const __WASI_SOCK_PROTO_PROTO_54: __wasi_sockproto_t = 54;
pub const __WASI_SOCK_PROTO_PROTO_55: __wasi_sockproto_t = 55;
pub const __WASI_SOCK_PROTO_PROTO_56: __wasi_sockproto_t = 56;
pub const __WASI_SOCK_PROTO_PROTO_57: __wasi_sockproto_t = 57;
pub const __WASI_SOCK_PROTO_ICMPV6: __wasi_sockproto_t = 58;
pub const __WASI_SOCK_PROTO_NONE: __wasi_sockproto_t = 59;
pub const __WASI_SOCK_PROTO_DSTOPTS: __wasi_sockproto_t = 60;
pub const __WASI_SOCK_PROTO_PROTO_61: __wasi_sockproto_t = 61;
pub const __WASI_SOCK_PROTO_PROTO_62: __wasi_sockproto_t = 62;
pub const __WASI_SOCK_PROTO_PROTO_63: __wasi_sockproto_t = 63;
pub const __WASI_SOCK_PROTO_PROTO_64: __wasi_sockproto_t = 64;
pub const __WASI_SOCK_PROTO_PROTO_65: __wasi_sockproto_t = 65;
pub const __WASI_SOCK_PROTO_PROTO_66: __wasi_sockproto_t = 66;
pub const __WASI_SOCK_PROTO_PROTO_67: __wasi_sockproto_t = 67;
pub const __WASI_SOCK_PROTO_PROTO_68: __wasi_sockproto_t = 68;
pub const __WASI_SOCK_PROTO_PROTO_69: __wasi_sockproto_t = 69;
pub const __WASI_SOCK_PROTO_PROTO_70: __wasi_sockproto_t = 70;
pub const __WASI_SOCK_PROTO_PROTO_71: __wasi_sockproto_t = 71;
pub const __WASI_SOCK_PROTO_PROTO_72: __wasi_sockproto_t = 72;
pub const __WASI_SOCK_PROTO_PROTO_73: __wasi_sockproto_t = 73;
pub const __WASI_SOCK_PROTO_PROTO_74: __wasi_sockproto_t = 74;
pub const __WASI_SOCK_PROTO_PROTO_75: __wasi_sockproto_t = 75;
pub const __WASI_SOCK_PROTO_PROTO_76: __wasi_sockproto_t = 76;
pub const __WASI_SOCK_PROTO_PROTO_77: __wasi_sockproto_t = 77;
pub const __WASI_SOCK_PROTO_PROTO_78: __wasi_sockproto_t = 78;
pub const __WASI_SOCK_PROTO_PROTO_79: __wasi_sockproto_t = 79;
pub const __WASI_SOCK_PROTO_PROTO_80: __wasi_sockproto_t = 80;
pub const __WASI_SOCK_PROTO_PROTO_81: __wasi_sockproto_t = 81;
pub const __WASI_SOCK_PROTO_PROTO_82: __wasi_sockproto_t = 82;
pub const __WASI_SOCK_PROTO_PROTO_83: __wasi_sockproto_t = 83;
pub const __WASI_SOCK_PROTO_PROTO_84: __wasi_sockproto_t = 84;
pub const __WASI_SOCK_PROTO_PROTO_85: __wasi_sockproto_t = 85;
pub const __WASI_SOCK_PROTO_PROTO_86: __wasi_sockproto_t = 86;
pub const __WASI_SOCK_PROTO_PROTO_87: __wasi_sockproto_t = 87;
pub const __WASI_SOCK_PROTO_PROTO_88: __wasi_sockproto_t = 88;
pub const __WASI_SOCK_PROTO_PROTO_89: __wasi_sockproto_t = 89;
pub const __WASI_SOCK_PROTO_PROTO_90: __wasi_sockproto_t = 90;
pub const __WASI_SOCK_PROTO_PROTO_91: __wasi_sockproto_t = 91;
pub const __WASI_SOCK_PROTO_MTP: __wasi_sockproto_t = 92;
pub const __WASI_SOCK_PROTO_PROTO_93: __wasi_sockproto_t = 93;
pub const __WASI_SOCK_PROTO_BEETPH: __wasi_sockproto_t = 94;
pub const __WASI_SOCK_PROTO_PROTO_95: __wasi_sockproto_t = 95;
pub const __WASI_SOCK_PROTO_PROTO_96: __wasi_sockproto_t = 96;
pub const __WASI_SOCK_PROTO_PROTO_97: __wasi_sockproto_t = 97;
pub const __WASI_SOCK_PROTO_ENCAP: __wasi_sockproto_t = 98;
pub const __WASI_SOCK_PROTO_PROTO_99: __wasi_sockproto_t = 99;
pub const __WASI_SOCK_PROTO_PROTO_100: __wasi_sockproto_t = 100;
pub const __WASI_SOCK_PROTO_PROTO_101: __wasi_sockproto_t = 101;
pub const __WASI_SOCK_PROTO_PROTO_102: __wasi_sockproto_t = 102;
pub const __WASI_SOCK_PROTO_PIM: __wasi_sockproto_t = 103;
pub const __WASI_SOCK_PROTO_PROTO_104: __wasi_sockproto_t = 104;
pub const __WASI_SOCK_PROTO_PROTO_105: __wasi_sockproto_t = 105;
pub const __WASI_SOCK_PROTO_PROTO_106: __wasi_sockproto_t = 106;
pub const __WASI_SOCK_PROTO_PROTO_107: __wasi_sockproto_t = 107;
pub const __WASI_SOCK_PROTO_COMP: __wasi_sockproto_t = 108;
pub const __WASI_SOCK_PROTO_PROTO_109: __wasi_sockproto_t = 109;
pub const __WASI_SOCK_PROTO_PROTO_110: __wasi_sockproto_t = 110;
pub const __WASI_SOCK_PROTO_PROTO_111: __wasi_sockproto_t = 111;
pub const __WASI_SOCK_PROTO_PROTO_112: __wasi_sockproto_t = 112;
pub const __WASI_SOCK_PROTO_PROTO_113: __wasi_sockproto_t = 113;
pub const __WASI_SOCK_PROTO_PROTO_114: __wasi_sockproto_t = 114;
pub const __WASI_SOCK_PROTO_PROTO_115: __wasi_sockproto_t = 115;
pub const __WASI_SOCK_PROTO_PROTO_116: __wasi_sockproto_t = 116;
pub const __WASI_SOCK_PROTO_PROTO_117: __wasi_sockproto_t = 117;
pub const __WASI_SOCK_PROTO_PROTO_118: __wasi_sockproto_t = 118;
pub const __WASI_SOCK_PROTO_PROTO_119: __wasi_sockproto_t = 119;
pub const __WASI_SOCK_PROTO_PROTO_120: __wasi_sockproto_t = 120;
pub const __WASI_SOCK_PROTO_PROTO_121: __wasi_sockproto_t = 121;
pub const __WASI_SOCK_PROTO_PROTO_122: __wasi_sockproto_t = 122;
pub const __WASI_SOCK_PROTO_PROTO_123: __wasi_sockproto_t = 123;
pub const __WASI_SOCK_PROTO_PROTO_124: __wasi_sockproto_t = 124;
pub const __WASI_SOCK_PROTO_PROTO_125: __wasi_sockproto_t = 125;
pub const __WASI_SOCK_PROTO_PROTO_126: __wasi_sockproto_t = 126;
pub const __WASI_SOCK_PROTO_PROTO_127: __wasi_sockproto_t = 127;
pub const __WASI_SOCK_PROTO_PROTO_128: __wasi_sockproto_t = 128;
pub const __WASI_SOCK_PROTO_PROTO_129: __wasi_sockproto_t = 129;
pub const __WASI_SOCK_PROTO_PROTO_130: __wasi_sockproto_t = 130;
pub const __WASI_SOCK_PROTO_PROTO_131: __wasi_sockproto_t = 131;
pub const __WASI_SOCK_PROTO_SCTP: __wasi_sockproto_t = 132;
pub const __WASI_SOCK_PROTO_PROTO_133: __wasi_sockproto_t = 133;
pub const __WASI_SOCK_PROTO_PROTO_134: __wasi_sockproto_t = 134;
pub const __WASI_SOCK_PROTO_MH: __wasi_sockproto_t = 135;
pub const __WASI_SOCK_PROTO_UDPLITE: __wasi_sockproto_t = 136;
pub const __WASI_SOCK_PROTO_MPLS: __wasi_sockproto_t = 137;
pub const __WASI_SOCK_PROTO_PROTO_138: __wasi_sockproto_t = 138;
pub const __WASI_SOCK_PROTO_PROTO_139: __wasi_sockproto_t = 139;
pub const __WASI_SOCK_PROTO_PROTO_140: __wasi_sockproto_t = 140;
pub const __WASI_SOCK_PROTO_PROTO_141: __wasi_sockproto_t = 141;
pub const __WASI_SOCK_PROTO_PROTO_142: __wasi_sockproto_t = 142;
pub const __WASI_SOCK_PROTO_ETHERNET: __wasi_sockproto_t = 143;
pub const __WASI_SOCK_PROTO_PROTO_144: __wasi_sockproto_t = 144;
pub const __WASI_SOCK_PROTO_PROTO_145: __wasi_sockproto_t = 145;
pub const __WASI_SOCK_PROTO_PROTO_146: __wasi_sockproto_t = 146;
pub const __WASI_SOCK_PROTO_PROTO_147: __wasi_sockproto_t = 147;
pub const __WASI_SOCK_PROTO_PROTO_148: __wasi_sockproto_t = 148;
pub const __WASI_SOCK_PROTO_PROTO_149: __wasi_sockproto_t = 149;
pub const __WASI_SOCK_PROTO_PROTO_150: __wasi_sockproto_t = 150;
pub const __WASI_SOCK_PROTO_PROTO_151: __wasi_sockproto_t = 151;
pub const __WASI_SOCK_PROTO_PROTO_152: __wasi_sockproto_t = 152;
pub const __WASI_SOCK_PROTO_PROTO_153: __wasi_sockproto_t = 153;
pub const __WASI_SOCK_PROTO_PROTO_154: __wasi_sockproto_t = 154;
pub const __WASI_SOCK_PROTO_PROTO_155: __wasi_sockproto_t = 155;
pub const __WASI_SOCK_PROTO_PROTO_156: __wasi_sockproto_t = 156;
pub const __WASI_SOCK_PROTO_PROTO_157: __wasi_sockproto_t = 157;
pub const __WASI_SOCK_PROTO_PROTO_158: __wasi_sockproto_t = 158;
pub const __WASI_SOCK_PROTO_PROTO_159: __wasi_sockproto_t = 159;
pub const __WASI_SOCK_PROTO_PROTO_160: __wasi_sockproto_t = 160;
pub const __WASI_SOCK_PROTO_PROTO_161: __wasi_sockproto_t = 161;
pub const __WASI_SOCK_PROTO_PROTO_162: __wasi_sockproto_t = 162;
pub const __WASI_SOCK_PROTO_PROTO_163: __wasi_sockproto_t = 163;
pub const __WASI_SOCK_PROTO_PROTO_164: __wasi_sockproto_t = 164;
pub const __WASI_SOCK_PROTO_PROTO_165: __wasi_sockproto_t = 165;
pub const __WASI_SOCK_PROTO_PROTO_166: __wasi_sockproto_t = 166;
pub const __WASI_SOCK_PROTO_PROTO_167: __wasi_sockproto_t = 167;
pub const __WASI_SOCK_PROTO_PROTO_168: __wasi_sockproto_t = 168;
pub const __WASI_SOCK_PROTO_PROTO_169: __wasi_sockproto_t = 169;
pub const __WASI_SOCK_PROTO_PROTO_170: __wasi_sockproto_t = 170;
pub const __WASI_SOCK_PROTO_PROTO_171: __wasi_sockproto_t = 171;
pub const __WASI_SOCK_PROTO_PROTO_172: __wasi_sockproto_t = 172;
pub const __WASI_SOCK_PROTO_PROTO_173: __wasi_sockproto_t = 173;
pub const __WASI_SOCK_PROTO_PROTO_174: __wasi_sockproto_t = 174;
pub const __WASI_SOCK_PROTO_PROTO_175: __wasi_sockproto_t = 175;
pub const __WASI_SOCK_PROTO_PROTO_176: __wasi_sockproto_t = 176;
pub const __WASI_SOCK_PROTO_PROTO_177: __wasi_sockproto_t = 177;
pub const __WASI_SOCK_PROTO_PROTO_178: __wasi_sockproto_t = 178;
pub const __WASI_SOCK_PROTO_PROTO_179: __wasi_sockproto_t = 179;
pub const __WASI_SOCK_PROTO_PROTO_180: __wasi_sockproto_t = 180;
pub const __WASI_SOCK_PROTO_PROTO_181: __wasi_sockproto_t = 181;
pub const __WASI_SOCK_PROTO_PROTO_182: __wasi_sockproto_t = 182;
pub const __WASI_SOCK_PROTO_PROTO_183: __wasi_sockproto_t = 183;
pub const __WASI_SOCK_PROTO_PROTO_184: __wasi_sockproto_t = 184;
pub const __WASI_SOCK_PROTO_PROTO_185: __wasi_sockproto_t = 185;
pub const __WASI_SOCK_PROTO_PROTO_186: __wasi_sockproto_t = 186;
pub const __WASI_SOCK_PROTO_PROTO_187: __wasi_sockproto_t = 187;
pub const __WASI_SOCK_PROTO_PROTO_188: __wasi_sockproto_t = 188;
pub const __WASI_SOCK_PROTO_PROTO_189: __wasi_sockproto_t = 189;
pub const __WASI_SOCK_PROTO_PROTO_190: __wasi_sockproto_t = 190;
pub const __WASI_SOCK_PROTO_PROTO_191: __wasi_sockproto_t = 191;
pub const __WASI_SOCK_PROTO_PROTO_192: __wasi_sockproto_t = 192;
pub const __WASI_SOCK_PROTO_PROTO_193: __wasi_sockproto_t = 193;
pub const __WASI_SOCK_PROTO_PROTO_194: __wasi_sockproto_t = 194;
pub const __WASI_SOCK_PROTO_PROTO_195: __wasi_sockproto_t = 195;
pub const __WASI_SOCK_PROTO_PROTO_196: __wasi_sockproto_t = 196;
pub const __WASI_SOCK_PROTO_PROTO_197: __wasi_sockproto_t = 197;
pub const __WASI_SOCK_PROTO_PROTO_198: __wasi_sockproto_t = 198;
pub const __WASI_SOCK_PROTO_PROTO_199: __wasi_sockproto_t = 199;
pub const __WASI_SOCK_PROTO_PROTO_200: __wasi_sockproto_t = 200;
pub const __WASI_SOCK_PROTO_PROTO_201: __wasi_sockproto_t = 201;
pub const __WASI_SOCK_PROTO_PROTO_202: __wasi_sockproto_t = 202;
pub const __WASI_SOCK_PROTO_PROTO_203: __wasi_sockproto_t = 203;
pub const __WASI_SOCK_PROTO_PROTO_204: __wasi_sockproto_t = 204;
pub const __WASI_SOCK_PROTO_PROTO_205: __wasi_sockproto_t = 205;
pub const __WASI_SOCK_PROTO_PROTO_206: __wasi_sockproto_t = 206;
pub const __WASI_SOCK_PROTO_PROTO_207: __wasi_sockproto_t = 207;
pub const __WASI_SOCK_PROTO_PROTO_208: __wasi_sockproto_t = 208;
pub const __WASI_SOCK_PROTO_PROTO_209: __wasi_sockproto_t = 209;
pub const __WASI_SOCK_PROTO_PROTO_210: __wasi_sockproto_t = 210;
pub const __WASI_SOCK_PROTO_PROTO_211: __wasi_sockproto_t = 211;
pub const __WASI_SOCK_PROTO_PROTO_212: __wasi_sockproto_t = 212;
pub const __WASI_SOCK_PROTO_PROTO_213: __wasi_sockproto_t = 213;
pub const __WASI_SOCK_PROTO_PROTO_214: __wasi_sockproto_t = 214;
pub const __WASI_SOCK_PROTO_PROTO_215: __wasi_sockproto_t = 215;
pub const __WASI_SOCK_PROTO_PROTO_216: __wasi_sockproto_t = 216;
pub const __WASI_SOCK_PROTO_PROTO_217: __wasi_sockproto_t = 217;
pub const __WASI_SOCK_PROTO_PROTO_218: __wasi_sockproto_t = 218;
pub const __WASI_SOCK_PROTO_PROTO_219: __wasi_sockproto_t = 219;
pub const __WASI_SOCK_PROTO_PROTO_220: __wasi_sockproto_t = 220;
pub const __WASI_SOCK_PROTO_PROTO_221: __wasi_sockproto_t = 221;
pub const __WASI_SOCK_PROTO_PROTO_222: __wasi_sockproto_t = 222;
pub const __WASI_SOCK_PROTO_PROTO_223: __wasi_sockproto_t = 223;
pub const __WASI_SOCK_PROTO_PROTO_224: __wasi_sockproto_t = 224;
pub const __WASI_SOCK_PROTO_PROTO_225: __wasi_sockproto_t = 225;
pub const __WASI_SOCK_PROTO_PROTO_226: __wasi_sockproto_t = 226;
pub const __WASI_SOCK_PROTO_PROTO_227: __wasi_sockproto_t = 227;
pub const __WASI_SOCK_PROTO_PROTO_228: __wasi_sockproto_t = 228;
pub const __WASI_SOCK_PROTO_PROTO_229: __wasi_sockproto_t = 229;
pub const __WASI_SOCK_PROTO_PROTO_230: __wasi_sockproto_t = 230;
pub const __WASI_SOCK_PROTO_PROTO_231: __wasi_sockproto_t = 231;
pub const __WASI_SOCK_PROTO_PROTO_232: __wasi_sockproto_t = 232;
pub const __WASI_SOCK_PROTO_PROTO_233: __wasi_sockproto_t = 233;
pub const __WASI_SOCK_PROTO_PROTO_234: __wasi_sockproto_t = 234;
pub const __WASI_SOCK_PROTO_PROTO_235: __wasi_sockproto_t = 235;
pub const __WASI_SOCK_PROTO_PROTO_236: __wasi_sockproto_t = 236;
pub const __WASI_SOCK_PROTO_PROTO_237: __wasi_sockproto_t = 237;
pub const __WASI_SOCK_PROTO_PROTO_238: __wasi_sockproto_t = 238;
pub const __WASI_SOCK_PROTO_PROTO_239: __wasi_sockproto_t = 239;
pub const __WASI_SOCK_PROTO_PROTO_240: __wasi_sockproto_t = 240;
pub const __WASI_SOCK_PROTO_PROTO_241: __wasi_sockproto_t = 241;
pub const __WASI_SOCK_PROTO_PROTO_242: __wasi_sockproto_t = 242;
pub const __WASI_SOCK_PROTO_PROTO_243: __wasi_sockproto_t = 243;
pub const __WASI_SOCK_PROTO_PROTO_244: __wasi_sockproto_t = 244;
pub const __WASI_SOCK_PROTO_PROTO_245: __wasi_sockproto_t = 245;
pub const __WASI_SOCK_PROTO_PROTO_246: __wasi_sockproto_t = 246;
pub const __WASI_SOCK_PROTO_PROTO_247: __wasi_sockproto_t = 247;
pub const __WASI_SOCK_PROTO_PROTO_248: __wasi_sockproto_t = 248;
pub const __WASI_SOCK_PROTO_PROTO_249: __wasi_sockproto_t = 249;
pub const __WASI_SOCK_PROTO_PROTO_250: __wasi_sockproto_t = 250;
pub const __WASI_SOCK_PROTO_PROTO_251: __wasi_sockproto_t = 251;
pub const __WASI_SOCK_PROTO_PROTO_252: __wasi_sockproto_t = 252;
pub const __WASI_SOCK_PROTO_PROTO_253: __wasi_sockproto_t = 253;
pub const __WASI_SOCK_PROTO_PROTO_254: __wasi_sockproto_t = 254;
pub const __WASI_SOCK_PROTO_PROTO_RAW: __wasi_sockproto_t = 255;
pub const __WASI_SOCK_PROTO_PROTO_256: __wasi_sockproto_t = 256;
pub const __WASI_SOCK_PROTO_PROTO_257: __wasi_sockproto_t = 257;
pub const __WASI_SOCK_PROTO_PROTO_258: __wasi_sockproto_t = 258;
pub const __WASI_SOCK_PROTO_PROTO_259: __wasi_sockproto_t = 259;
pub const __WASI_SOCK_PROTO_PROTO_260: __wasi_sockproto_t = 260;
pub const __WASI_SOCK_PROTO_PROTO_261: __wasi_sockproto_t = 261;
pub const __WASI_SOCK_PROTO_MPTCP: __wasi_sockproto_t = 262;
pub const __WASI_SOCK_PROTO_MAX: __wasi_sockproto_t = 263;
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_hardwareaddress_t {
pub octs: [u8; 6],
}
pub type __wasi_addressfamily_t = u16;
pub const __WASI_ADDRESS_FAMILY_UNSPEC: __wasi_addressfamily_t = 0;
pub const __WASI_ADDRESS_FAMILY_INET4: __wasi_addressfamily_t = 1;
pub const __WASI_ADDRESS_FAMILY_INET6: __wasi_addressfamily_t = 2;
pub const __WASI_ADDRESS_FAMILY_UNIX: __wasi_addressfamily_t = 3;
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_addr_unspec_t {
pub n0: u8,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_addr_unspec_port_t {
pub port: u16,
pub addr: __wasi_addr_unspec_t,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_cidr_unspec_t {
pub addr: __wasi_addr_unspec_t,
pub prefix: u8,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_addr_ip4_t {
pub octs: [u8; 4],
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_addr_ip4_port_t {
pub port: u16,
pub ip: __wasi_addr_ip4_t,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_cidr_ip4_t {
pub ip: __wasi_addr_ip4_t,
pub prefix: u8,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_addr_unix_t {
pub octs: [u8; 16],
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_addr_unix_port_t {
pub port: u16,
pub unix: __wasi_addr_unix_t,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_cidr_unix_t {
pub unix: __wasi_addr_unix_t,
pub prefix: u8,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_addr_ip6_t {
pub segs: [u8; 16],
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_addr_ip6_port_t {
pub port: u16,
pub ip: __wasi_addr_ip6_t,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_cidr_ip6_t {
pub ip: __wasi_addr_ip6_t,
pub prefix: u8,
}
#[derive(Debug, Copy, Clone, ValueType)]
#[repr(C)]
pub struct __wasi_addr_u {
pub octs: [u8; 16],
}
#[derive(Debug, Copy, Clone, ValueType)]
#[repr(C)]
pub struct __wasi_addr_t {
pub tag: __wasi_addressfamily_t,
pub u: __wasi_addr_u,
}
#[derive(Debug, Copy, Clone, ValueType)]
#[repr(C)]
pub struct __wasi_addr_port_u {
pub octs: [u8; 18],
}
#[derive(Debug, Copy, Clone, ValueType)]
#[repr(C)]
pub struct __wasi_addr_port_t {
pub tag: __wasi_addressfamily_t,
pub u: __wasi_addr_port_u,
}
#[derive(Debug, Copy, Clone, ValueType)]
#[repr(C)]
pub struct __wasi_cidr_u {
pub octs: [u8; 17],
}
#[derive(Debug, Copy, Clone, ValueType)]
#[repr(C)]
pub struct __wasi_cidr_t {
pub tag: __wasi_addressfamily_t,
pub u: __wasi_cidr_u,
}
#[derive(Debug, Copy, Clone, ValueType)]
#[repr(C)]
pub struct __wasi_route_t {
pub cidr: __wasi_cidr_t,
pub via_router: __wasi_addr_t,
pub preferred_until: __wasi_option_timestamp_t,
pub expires_at: __wasi_option_timestamp_t,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_http_handles_t {
pub req: __wasi_fd_t,
pub res: __wasi_fd_t,
pub hdr: __wasi_fd_t,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_http_status_t {
pub ok: __wasi_bool_t,
pub redirect: __wasi_bool_t,
pub size: __wasi_filesize_t,
pub status: u16,
}
pub type __wasi_riflags_t = u16;
pub const __WASI_SOCK_RECV_INPUT_PEEK: __wasi_riflags_t = 1 << 0;
pub const __WASI_SOCK_RECV_INPUT_WAITALL: __wasi_riflags_t = 1 << 1;
pub const __WASI_SOCK_RECV_INPUT_DATA_TRUNCATED: __wasi_riflags_t = 1 << 2;
pub type __wasi_roflags_t = u16;
pub const __WASI_SOCK_RECV_OUTPUT_DATA_TRUNCATED: __wasi_roflags_t = 1 << 0;
pub type __wasi_sdflags_t = u8;
pub const __WASI_SHUT_RD: __wasi_sdflags_t = 1 << 0;
pub const __WASI_SHUT_WR: __wasi_sdflags_t = 1 << 1;
pub type __wasi_siflags_t = u16;
pub type __wasi_timeout_t = u8;
pub const __WASI_TIMEOUT_READ: __wasi_timeout_t = 0;
pub const __WASI_TIMEOUT_WRITE: __wasi_timeout_t = 1;
pub const __WASI_TIMEOUT_CONNECT: __wasi_timeout_t = 2;
pub const __WASI_TIMEOUT_ACCEPT: __wasi_timeout_t = 3;

View File

@@ -1,31 +0,0 @@
pub type __wasi_signal_t = u8;
pub const __WASI_SIGHUP: u8 = 1;
pub const __WASI_SIGINT: u8 = 2;
pub const __WASI_SIGQUIT: u8 = 3;
pub const __WASI_SIGILL: u8 = 4;
pub const __WASI_SIGTRAP: u8 = 5;
pub const __WASI_SIGABRT: u8 = 6;
pub const __WASI_SIGBUS: u8 = 7;
pub const __WASI_SIGFPE: u8 = 8;
pub const __WASI_SIGKILL: u8 = 9;
pub const __WASI_SIGUSR1: u8 = 10;
pub const __WASI_SIGSEGV: u8 = 11;
pub const __WASI_SIGUSR2: u8 = 12;
pub const __WASI_SIGPIPE: u8 = 13;
pub const __WASI_SIGALRM: u8 = 14;
pub const __WASI_SIGTERM: u8 = 15;
pub const __WASI_SIGCHLD: u8 = 16;
pub const __WASI_SIGCONT: u8 = 17;
pub const __WASI_SIGSTOP: u8 = 18;
pub const __WASI_SIGTSTP: u8 = 19;
pub const __WASI_SIGTTIN: u8 = 20;
pub const __WASI_SIGTTOU: u8 = 21;
pub const __WASI_SIGURG: u8 = 22;
pub const __WASI_SIGXCPU: u8 = 23;
pub const __WASI_SIGXFSZ: u8 = 24;
pub const __WASI_SIGVTALRM: u8 = 25;
pub const __WASI_SIGPROF: u8 = 26;
pub const __WASI_SIGWINCH: u8 = 27;
pub const __WASI_SIGPOLL: u8 = 28;
pub const __WASI_SIGPWR: u8 = 29;
pub const __WASI_SIGSYS: u8 = 30;

View File

@@ -1,188 +0,0 @@
use crate::*;
use std::convert::TryFrom;
use std::fmt;
use std::mem::{self, MaybeUninit};
use wasmer_derive::ValueType;
use wasmer_types::ValueType;
pub type __wasi_subclockflags_t = u16;
pub const __WASI_SUBSCRIPTION_CLOCK_ABSTIME: u16 = 1 << 0;
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_subscription_clock_t {
pub clock_id: __wasi_clockid_t,
pub timeout: __wasi_timestamp_t,
pub precision: __wasi_timestamp_t,
pub flags: __wasi_subclockflags_t,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_subscription_fs_readwrite_t {
pub fd: __wasi_fd_t,
}
#[derive(Copy, Clone)]
#[repr(C)]
pub union __wasi_subscription_u {
pub clock: __wasi_subscription_clock_t,
pub fd_readwrite: __wasi_subscription_fs_readwrite_t,
}
#[derive(Copy, Clone)]
#[repr(C)]
pub struct __wasi_subscription_t {
pub userdata: __wasi_userdata_t,
pub type_: __wasi_eventtype_t,
pub u: __wasi_subscription_u,
}
/// Safe Rust wrapper around `__wasi_subscription_t::type_` and `__wasi_subscription_t::u`
#[derive(Debug, Clone)]
pub enum EventType {
Clock(__wasi_subscription_clock_t),
Read(__wasi_subscription_fs_readwrite_t),
Write(__wasi_subscription_fs_readwrite_t),
}
impl EventType {
pub fn raw_tag(&self) -> __wasi_eventtype_t {
match self {
EventType::Clock(_) => __WASI_EVENTTYPE_CLOCK,
EventType::Read(_) => __WASI_EVENTTYPE_FD_READ,
EventType::Write(_) => __WASI_EVENTTYPE_FD_WRITE,
}
}
}
/// Safe Rust wrapper around `__wasi_subscription_t`
#[derive(Debug, Clone)]
pub struct WasiSubscription {
pub user_data: __wasi_userdata_t,
pub event_type: EventType,
}
impl TryFrom<__wasi_subscription_t> for WasiSubscription {
type Error = __wasi_errno_t;
fn try_from(ws: __wasi_subscription_t) -> Result<Self, Self::Error> {
Ok(Self {
user_data: ws.userdata,
event_type: match ws.type_ {
__WASI_EVENTTYPE_CLOCK => EventType::Clock(unsafe { ws.u.clock }),
__WASI_EVENTTYPE_FD_READ => EventType::Read(unsafe { ws.u.fd_readwrite }),
__WASI_EVENTTYPE_FD_WRITE => EventType::Write(unsafe { ws.u.fd_readwrite }),
_ => return Err(__WASI_EINVAL),
},
})
}
}
impl TryFrom<WasiSubscription> for __wasi_subscription_t {
type Error = __wasi_errno_t;
fn try_from(ws: WasiSubscription) -> Result<Self, Self::Error> {
#[allow(unreachable_patterns)]
let (type_, u) = match ws.event_type {
EventType::Clock(c) => (__WASI_EVENTTYPE_CLOCK, __wasi_subscription_u { clock: c }),
EventType::Read(rw) => (
__WASI_EVENTTYPE_FD_READ,
__wasi_subscription_u { fd_readwrite: rw },
),
EventType::Write(rw) => (
__WASI_EVENTTYPE_FD_WRITE,
__wasi_subscription_u { fd_readwrite: rw },
),
_ => return Err(__WASI_EINVAL),
};
Ok(Self {
userdata: ws.user_data,
type_,
u,
})
}
}
impl fmt::Debug for __wasi_subscription_t {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("__wasi_subscription_t")
.field("userdata", &self.userdata)
.field("type", &eventtype_to_str(self.type_))
.field(
"u",
match self.type_ {
__WASI_EVENTTYPE_CLOCK => unsafe { &self.u.clock },
__WASI_EVENTTYPE_FD_READ | __WASI_EVENTTYPE_FD_WRITE => unsafe {
&self.u.fd_readwrite
},
_ => &"INVALID EVENTTYPE",
},
)
.finish()
}
}
unsafe impl ValueType for __wasi_subscription_t {
fn zero_padding_bytes(&self, bytes: &mut [MaybeUninit<u8>]) {
macro_rules! field {
($($f:tt)*) => {
&self.$($f)* as *const _ as usize - self as *const _ as usize
};
}
macro_rules! field_end {
($($f:tt)*) => {
field!($($f)*) + mem::size_of_val(&self.$($f)*)
};
}
macro_rules! zero {
($start:expr, $end:expr) => {
for i in $start..$end {
bytes[i] = MaybeUninit::new(0);
}
};
}
self.userdata
.zero_padding_bytes(&mut bytes[field!(userdata)..field_end!(userdata)]);
zero!(field_end!(userdata), field!(type_));
self.type_
.zero_padding_bytes(&mut bytes[field!(type_)..field_end!(type_)]);
zero!(field_end!(type_), field!(u));
match self.type_ {
__WASI_EVENTTYPE_FD_READ | __WASI_EVENTTYPE_FD_WRITE => unsafe {
self.u.fd_readwrite.zero_padding_bytes(
&mut bytes[field!(u.fd_readwrite)..field_end!(u.fd_readwrite)],
);
zero!(field_end!(u.fd_readwrite), field_end!(u));
},
__WASI_EVENTTYPE_CLOCK => unsafe {
self.u
.clock
.zero_padding_bytes(&mut bytes[field!(u.clock)..field_end!(u.clock)]);
zero!(field_end!(u.clock), field_end!(u));
},
_ => zero!(field!(u), field_end!(u)),
}
zero!(field_end!(u), mem::size_of_val(self));
}
}
pub enum SubscriptionEnum {
Clock(__wasi_subscription_clock_t),
FdReadWrite(__wasi_subscription_fs_readwrite_t),
}
impl __wasi_subscription_t {
pub fn tagged(&self) -> Option<SubscriptionEnum> {
match self.type_ {
__WASI_EVENTTYPE_CLOCK => Some(SubscriptionEnum::Clock(unsafe { self.u.clock })),
__WASI_EVENTTYPE_FD_READ | __WASI_EVENTTYPE_FD_WRITE => {
Some(SubscriptionEnum::FdReadWrite(unsafe {
self.u.fd_readwrite
}))
}
_ => None,
}
}
}

View File

@@ -1,17 +0,0 @@
use super::io::__wasi_option_t;
use wasmer_derive::ValueType;
pub type __wasi_clockid_t = u32;
pub const __WASI_CLOCK_REALTIME: __wasi_clockid_t = 0;
pub const __WASI_CLOCK_MONOTONIC: __wasi_clockid_t = 1;
pub const __WASI_CLOCK_PROCESS_CPUTIME_ID: __wasi_clockid_t = 2;
pub const __WASI_CLOCK_THREAD_CPUTIME_ID: __wasi_clockid_t = 3;
pub type __wasi_timestamp_t = u64;
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_option_timestamp_t {
pub tag: __wasi_option_t,
pub u: __wasi_timestamp_t,
}

347
lib/wasi-types/src/types.rs Normal file
View File

@@ -0,0 +1,347 @@
#![deny(unused_mut)]
#![doc(html_favicon_url = "https://wasmer.io/images/icons/favicon-32x32.png")]
#![doc(html_logo_url = "https://github.com/wasmerio.png?size=200")]
#![allow(non_camel_case_types, clippy::identity_op)]
//! Wasmer's WASI types implementation.
//!
//! Those types aim at being used by [the `wasmer-wasi`
//! crate](https://github.com/wasmerio/wasmer/blob/master/lib/wasi).
// Needed for #[derive(ValueType)]
extern crate wasmer_types as wasmer;
pub use crate::types::time::*;
pub use bus::*;
pub use directory::*;
pub use file::*;
pub use io::*;
pub use net::*;
pub use signal::*;
pub use subscription::*;
pub type __wasi_exitcode_t = u32;
pub type __wasi_userdata_t = u64;
pub mod bus {
use crate::wasi::{
BusDataFormat, BusEventClose, BusEventExit, BusEventFault, BusEventType, Cid, OptionCid,
};
use wasmer_derive::ValueType;
use wasmer_types::MemorySize;
// Not sure how to port these types to .wit with generics ...
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_busevent_call_t<M: MemorySize> {
pub parent: OptionCid,
pub cid: Cid,
pub format: BusDataFormat,
pub topic_ptr: M::Offset,
pub topic_len: M::Offset,
pub buf_ptr: M::Offset,
pub buf_len: M::Offset,
}
#[derive(Copy, Clone)]
#[repr(C)]
pub union __wasi_busevent_u<M: MemorySize> {
pub noop: u8,
pub exit: BusEventExit,
pub call: __wasi_busevent_call_t<M>,
pub result: __wasi_busevent_result_t<M>,
pub fault: BusEventFault,
pub close: BusEventClose,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_busevent_result_t<M: MemorySize> {
pub format: BusDataFormat,
pub cid: Cid,
pub buf_ptr: M::Offset,
pub buf_len: M::Offset,
}
#[derive(Copy, Clone)]
#[repr(C)]
pub struct __wasi_busevent_t<M: MemorySize> {
pub tag: BusEventType,
pub u: __wasi_busevent_u<M>,
}
}
pub mod file {
use crate::wasi::{Fd, Rights};
pub use crate::wasi::{EventFdFlags, FileDelta, LookupFlags, Oflags};
pub const __WASI_STDIN_FILENO: Fd = 0;
pub const __WASI_STDOUT_FILENO: Fd = 1;
pub const __WASI_STDERR_FILENO: Fd = 2;
pub const EVENT_FD_FLAGS_SEMAPHORE: EventFdFlags = 1;
pub const __WASI_LOOKUP_SYMLINK_FOLLOW: LookupFlags = 1;
/// function for debugging rights issues
#[allow(dead_code)]
pub fn print_right_set(rights: Rights) {
// BTreeSet for consistent order
let mut right_set = std::collections::BTreeSet::new();
for i in 0..28 {
let cur_right = rights & Rights::from_bits(1 << i).unwrap();
if !cur_right.is_empty() {
right_set.insert(cur_right.to_str().unwrap_or("INVALID RIGHT"));
}
}
println!("{:#?}", right_set);
}
}
pub mod directory {
use crate::wasi;
use std::mem;
pub const __WASI_DIRCOOKIE_START: wasi::Dircookie = 0;
pub fn dirent_to_le_bytes(ent: &wasi::Dirent) -> Vec<u8> {
let out: Vec<u8> = std::iter::empty()
.chain(ent.d_next.to_le_bytes())
.chain(ent.d_ino.to_le_bytes())
.chain(ent.d_namlen.to_le_bytes())
.chain(u32::from(ent.d_type as u8).to_le_bytes())
.collect();
assert_eq!(out.len(), mem::size_of::<wasi::Dirent>());
out
}
#[cfg(test)]
mod tests {
use super::dirent_to_le_bytes;
use crate::wasi;
#[test]
fn test_dirent_to_le_bytes() {
let s = wasi::Dirent {
d_next: 0x0123456789abcdef,
d_ino: 0xfedcba9876543210,
d_namlen: 0xaabbccdd,
d_type: wasi::Filetype::Directory,
};
assert_eq!(
vec![
// d_next
0xef,
0xcd,
0xab,
0x89,
0x67,
0x45,
0x23,
0x01,
//
// d_ino
0x10,
0x32,
0x54,
0x76,
0x98,
0xba,
0xdc,
0xfe,
//
// d_namelen
0xdd,
0xcc,
0xbb,
0xaa,
//
// d_type
// plus padding
wasi::Filetype::Directory as u8,
0x00,
0x00,
0x00,
],
dirent_to_le_bytes(&s)
);
}
}
}
pub mod io {
use wasmer_derive::ValueType;
use wasmer_types::MemorySize;
pub use crate::wasi::Bool;
pub use crate::wasi::Count;
pub use crate::wasi::OptionTag;
pub use crate::wasi::StdioMode;
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_ciovec_t<M: MemorySize> {
pub buf: M::Offset,
pub buf_len: M::Offset,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_iovec_t<M: MemorySize> {
pub buf: M::Offset,
pub buf_len: M::Offset,
}
}
pub mod time {
pub use crate::wasi::OptionTimestamp;
}
pub mod net {
use crate::wasi::Addressfamily;
use wasmer_derive::ValueType;
use crate::wasi::OptionTimestamp;
pub use crate::wasi::{
AddrUnspec, AddrUnspecPort, CidrUnspec, HttpHandles, HttpStatus, RiFlags, RoFlags, SdFlags,
SiFlags, SockProto, Timeout,
};
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_hardwareaddress_t {
pub octs: [u8; 6],
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_addr_ip4_t {
pub octs: [u8; 4],
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_addr_ip4_port_t {
pub port: u16,
pub ip: __wasi_addr_ip4_t,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_cidr_ip4_t {
pub ip: __wasi_addr_ip4_t,
pub prefix: u8,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_addr_unix_t {
pub octs: [u8; 16],
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_addr_unix_port_t {
pub port: u16,
pub unix: __wasi_addr_unix_t,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_cidr_unix_t {
pub unix: __wasi_addr_unix_t,
pub prefix: u8,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_addr_ip6_t {
pub segs: [u8; 16],
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_addr_ip6_port_t {
pub port: u16,
pub ip: __wasi_addr_ip6_t,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_cidr_ip6_t {
pub ip: __wasi_addr_ip6_t,
pub prefix: u8,
}
#[derive(Debug, Copy, Clone, ValueType)]
#[repr(C)]
pub struct __wasi_addr_u {
pub octs: [u8; 16],
}
#[derive(Debug, Copy, Clone, ValueType)]
#[repr(C)]
pub struct __wasi_addr_t {
pub tag: Addressfamily,
pub u: __wasi_addr_u,
}
#[derive(Debug, Copy, Clone, ValueType)]
#[repr(C)]
pub struct __wasi_addr_port_u {
pub octs: [u8; 18],
}
#[derive(Debug, Copy, Clone, ValueType)]
#[repr(C)]
pub struct __wasi_addr_port_t {
pub tag: Addressfamily,
pub u: __wasi_addr_port_u,
}
#[derive(Debug, Copy, Clone, ValueType)]
#[repr(C)]
pub struct __wasi_cidr_u {
pub octs: [u8; 17],
}
#[derive(Debug, Copy, Clone, ValueType)]
#[repr(C)]
pub struct __wasi_cidr_t {
pub tag: Addressfamily,
pub u: __wasi_cidr_u,
}
#[derive(Debug, Copy, Clone, ValueType)]
#[repr(C)]
pub struct Route {
pub cidr: __wasi_cidr_t,
pub via_router: __wasi_addr_t,
pub preferred_until: OptionTimestamp,
pub expires_at: OptionTimestamp,
}
pub const __WASI_SOCK_RECV_INPUT_PEEK: RiFlags = 1 << 0;
pub const __WASI_SOCK_RECV_INPUT_WAITALL: RiFlags = 1 << 1;
pub const __WASI_SOCK_RECV_INPUT_DATA_TRUNCATED: RiFlags = 1 << 2;
pub const __WASI_SOCK_RECV_OUTPUT_DATA_TRUNCATED: RoFlags = 1 << 0;
pub const __WASI_SHUT_RD: SdFlags = 1 << 0;
pub const __WASI_SHUT_WR: SdFlags = 1 << 1;
}
pub mod signal {
pub use crate::wasi::Signal;
}
pub mod subscription {
pub use crate::wasi::{
Eventtype, SubscriptionClock, SubscriptionEnum as EventType, SubscriptionFsReadwrite,
};
}

View File

@@ -1 +0,0 @@
pub mod snapshot0;

View File

@@ -1,151 +0,0 @@
use crate::*;
#[cfg(feature = "enable-serde")]
use serde::{Deserialize, Serialize};
use std::fmt;
use std::mem::{self, MaybeUninit};
use wasmer_derive::ValueType;
use wasmer_types::ValueType;
pub type __wasi_linkcount_t = u32;
#[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
#[repr(C)]
pub struct __wasi_subscription_clock_t {
pub userdata: __wasi_userdata_t,
pub clock_id: __wasi_clockid_t,
pub timeout: __wasi_timestamp_t,
pub precision: __wasi_timestamp_t,
pub flags: __wasi_subclockflags_t,
}
#[derive(Copy, Clone)]
#[repr(C)]
pub union __wasi_subscription_u {
pub clock: __wasi_subscription_clock_t,
pub fd_readwrite: __wasi_subscription_fs_readwrite_t,
}
#[derive(Copy, Clone)]
#[repr(C)]
pub struct __wasi_subscription_t {
pub userdata: __wasi_userdata_t,
pub type_: __wasi_eventtype_t,
pub u: __wasi_subscription_u,
}
unsafe impl ValueType for __wasi_subscription_t {
fn zero_padding_bytes(&self, bytes: &mut [MaybeUninit<u8>]) {
macro_rules! field {
($($f:tt)*) => {
&self.$($f)* as *const _ as usize - self as *const _ as usize
};
}
macro_rules! field_end {
($($f:tt)*) => {
field!($($f)*) + mem::size_of_val(&self.$($f)*)
};
}
macro_rules! zero {
($start:expr, $end:expr) => {
for i in $start..$end {
bytes[i] = MaybeUninit::new(0);
}
};
}
self.userdata
.zero_padding_bytes(&mut bytes[field!(userdata)..field_end!(userdata)]);
zero!(field_end!(userdata), field!(type_));
self.type_
.zero_padding_bytes(&mut bytes[field!(type_)..field_end!(type_)]);
zero!(field_end!(type_), field!(u));
match self.type_ {
__WASI_EVENTTYPE_FD_READ | __WASI_EVENTTYPE_FD_WRITE => unsafe {
self.u.fd_readwrite.zero_padding_bytes(
&mut bytes[field!(u.fd_readwrite)..field_end!(u.fd_readwrite)],
);
zero!(field_end!(u.fd_readwrite), field_end!(u));
},
__WASI_EVENTTYPE_CLOCK => unsafe {
self.u
.clock
.zero_padding_bytes(&mut bytes[field!(u.clock)..field_end!(u.clock)]);
zero!(field_end!(u.clock), field_end!(u));
},
_ => zero!(field!(u), field_end!(u)),
}
zero!(field_end!(u), mem::size_of_val(self));
}
}
pub type __wasi_whence_t = u8;
pub const __WASI_WHENCE_CUR: u8 = 0;
pub const __WASI_WHENCE_END: u8 = 1;
pub const __WASI_WHENCE_SET: u8 = 2;
#[derive(Copy, Clone, PartialEq, Eq, ValueType)]
#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
#[repr(C)]
pub struct __wasi_filestat_t {
pub st_dev: __wasi_device_t,
pub st_ino: __wasi_inode_t,
pub st_filetype: __wasi_filetype_t,
pub st_nlink: __wasi_linkcount_t,
pub st_size: __wasi_filesize_t,
pub st_atim: __wasi_timestamp_t,
pub st_mtim: __wasi_timestamp_t,
pub st_ctim: __wasi_timestamp_t,
}
impl fmt::Debug for __wasi_filestat_t {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let convert_ts_into_time_string = |ts| {
let tspec = ::time::OffsetDateTime::from_unix_timestamp_nanos(ts);
format!("{} ({})", tspec.format("%a, %d %b %Y %T %z"), ts)
};
f.debug_struct("__wasi_filestat_t")
.field("st_dev", &self.st_dev)
.field("st_ino", &self.st_ino)
.field(
"st_filetype",
&format!(
"{} ({})",
wasi_filetype_to_name(self.st_filetype),
self.st_filetype,
),
)
.field("st_nlink", &self.st_nlink)
.field("st_size", &self.st_size)
.field(
"st_atim",
&convert_ts_into_time_string(self.st_atim as i128),
)
.field(
"st_mtim",
&convert_ts_into_time_string(self.st_mtim as i128),
)
.field(
"st_ctim",
&convert_ts_into_time_string(self.st_ctim as i128),
)
.finish()
}
}
impl fmt::Debug for __wasi_subscription_t {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("__wasi_subscription_t")
.field("userdata", &self.userdata)
.field("type", &eventtype_to_str(self.type_))
.field(
"u",
match self.type_ {
__WASI_EVENTTYPE_CLOCK => unsafe { &self.u.clock },
__WASI_EVENTTYPE_FD_READ | __WASI_EVENTTYPE_FD_WRITE => unsafe {
&self.u.fd_readwrite
},
_ => &"INVALID EVENTTYPE",
},
)
.finish()
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,328 @@
use crate::wasi::extra::*;
impl Rights {
pub const fn all_socket() -> Self {
Self::from_bits_truncate(
Self::FD_FDSTAT_SET_FLAGS.bits()
| Self::FD_FILESTAT_GET.bits()
| Self::FD_READ.bits()
| Self::FD_WRITE.bits()
| Self::POLL_FD_READWRITE.bits()
| Self::SOCK_SHUTDOWN.bits()
| Self::SOCK_CONNECT.bits()
| Self::SOCK_LISTEN.bits()
| Self::SOCK_BIND.bits()
| Self::SOCK_ACCEPT.bits()
| Self::SOCK_RECV.bits()
| Self::SOCK_SEND.bits()
| Self::SOCK_ADDR_LOCAL.bits()
| Self::SOCK_ADDR_REMOTE.bits()
| Self::SOCK_RECV_FROM.bits()
| Self::SOCK_SEND_TO.bits(),
)
}
/// expects a single right, returns None if out of bounds or > 1 bit set
pub fn to_str(self) -> Option<&'static str> {
Some(match self {
Rights::FD_DATASYNC => "Rights::FD_DATASYNC",
Rights::FD_READ => "Rights::FD_READ",
Rights::FD_SEEK => "Rights::FD_SEEK",
Rights::FD_FDSTAT_SET_FLAGS => "Rights::FD_FDSTAT_SET_FLAGS",
Rights::FD_SYNC => "Rights::FD_SYNC",
Rights::FD_TELL => "Rights::FD_TELL",
Rights::FD_WRITE => "Rights::FD_WRITE",
Rights::FD_ADVISE => "Rights::FD_ADVISE",
Rights::FD_ALLOCATE => "Rights::FD_ALLOCATE",
Rights::PATH_CREATE_DIRECTORY => "Rights::PATH_CREATE_DIRECTORY",
Rights::PATH_CREATE_FILE => "Rights::PATH_CREATE_FILE",
Rights::PATH_LINK_SOURCE => "Rights::PATH_LINK_SOURCE",
Rights::PATH_LINK_TARGET => "Rights::PATH_LINK_TARGET",
Rights::PATH_OPEN => "Rights::PATH_OPEN",
Rights::FD_READDIR => "Rights::FD_READDIR",
Rights::PATH_READLINK => "Rights::PATH_READLINK",
Rights::PATH_RENAME_SOURCE => "Rights::PATH_RENAME_SOURCE",
Rights::PATH_RENAME_TARGET => "Rights::PATH_RENAME_TARGET",
Rights::PATH_FILESTAT_GET => "Rights::PATH_FILESTAT_GET",
Rights::PATH_FILESTAT_SET_SIZE => "Rights::PATH_FILESTAT_SET_SIZE",
Rights::PATH_FILESTAT_SET_TIMES => "Rights::PATH_FILESTAT_SET_TIMES",
Rights::FD_FILESTAT_GET => "Rights::FD_FILESTAT_GET",
Rights::FD_FILESTAT_SET_SIZE => "Rights::FD_FILESTAT_SET_SIZE",
Rights::FD_FILESTAT_SET_TIMES => "Rights::FD_FILESTAT_SET_TIMES",
Rights::PATH_SYMLINK => "Rights::PATH_SYMLINK",
Rights::PATH_REMOVE_DIRECTORY => "Rights::PATH_REMOVE_DIRECTORY",
Rights::PATH_UNLINK_FILE => "Rights::PATH_UNLINK_FILE",
Rights::POLL_FD_READWRITE => "Rights::POLL_FD_READWRITE",
Rights::SOCK_SHUTDOWN => "Rights::SOCK_SHUTDOWN",
Rights::SOCK_ACCEPT => "Rights::SOCK_ACCEPT",
Rights::SOCK_CONNECT => "Rights::SOCK_CONNECT",
Rights::SOCK_LISTEN => "Rights::SOCK_LISTEN",
Rights::SOCK_BIND => "Rights::SOCK_BIND",
Rights::SOCK_RECV => "Rights::SOCK_RECV",
Rights::SOCK_SEND => "Rights::SOCK_SEND",
Rights::SOCK_ADDR_LOCAL => "Rights::SOCK_ADDR_LOCAL",
Rights::SOCK_ADDR_REMOTE => "Rights::SOCK_ADDR_REMOTE",
Rights::SOCK_RECV_FROM => "Rights::SOCK_RECV_FROM",
Rights::SOCK_SEND_TO => "Rights::SOCK_SEND_TO",
_ => return None,
})
}
}
impl Default for Filestat {
fn default() -> Self {
Self {
st_dev: Default::default(),
st_ino: Default::default(),
st_filetype: Filetype::Unknown,
st_nlink: 1,
st_size: Default::default(),
st_atim: Default::default(),
st_mtim: Default::default(),
st_ctim: Default::default(),
}
}
}
/// Workaround implementation because `wit-bindgen` does not generate
/// type aliases, but instead creates the same filetype in each module
/// for `use` statements in the `.wit` file.
impl From<Clockid> for Snapshot0Clockid {
fn from(other: Clockid) -> Self {
match other {
Clockid::Realtime => Self::Realtime,
Clockid::Monotonic => Self::Monotonic,
}
}
}
impl From<Snapshot0Clockid> for Clockid {
fn from(other: Snapshot0Clockid) -> Self {
match other {
Snapshot0Clockid::Realtime => Self::Realtime,
Snapshot0Clockid::Monotonic => Self::Monotonic,
Snapshot0Clockid::ProcessCputimeId => todo!("not implemented for now"),
Snapshot0Clockid::ThreadCputimeId => todo!("not implemented for now"),
}
}
}
impl From<Snapshot0SubscriptionClock> for SubscriptionClock {
fn from(other: Snapshot0SubscriptionClock) -> Self {
// TODO: this removes Snapshot0SubscriptionClock::identifier, I don't
// think this is how it should be
Self {
clock_id: Clockid::from(other.id),
timeout: other.timeout,
precision: other.precision,
flags: other.flags,
}
}
}
impl From<Snapshot0SubscriptionEnum> for SubscriptionEnum {
fn from(other: Snapshot0SubscriptionEnum) -> Self {
match other {
Snapshot0SubscriptionEnum::Clock(d) => Self::Clock(SubscriptionClock::from(d)),
Snapshot0SubscriptionEnum::Read(d) => Self::Read(d),
Snapshot0SubscriptionEnum::Write(d) => Self::Write(d),
}
}
}
impl From<Snapshot0Subscription> for Subscription {
fn from(other: Snapshot0Subscription) -> Self {
Self {
userdata: other.userdata,
data: SubscriptionEnum::from(other.data),
}
}
}
impl std::fmt::Display for BusDataFormat {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}", self)
}
}
impl std::fmt::Display for Sockoption {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let s = match *self {
Self::Noop => "Sockoption::Noop",
Self::ReusePort => "Sockoption::ReusePort",
Self::ReuseAddr => "Sockoption::ReuseAddr",
Self::NoDelay => "Sockoption::NoDelay",
Self::DontRoute => "Sockoption::DontRoute",
Self::OnlyV6 => "Sockoption::OnlyV6",
Self::Broadcast => "Sockoption::Broadcast",
Self::MulticastLoopV4 => "Sockoption::MulticastLoopV4",
Self::MulticastLoopV6 => "Sockoption::MulticastLoopV6",
Self::Promiscuous => "Sockoption::Promiscuous",
Self::Listening => "Sockoption::Listening",
Self::LastError => "Sockoption::LastError",
Self::KeepAlive => "Sockoption::KeepAlive",
Self::Linger => "Sockoption::Linger",
Self::OobInline => "Sockoption::OobInline",
Self::RecvBufSize => "Sockoption::RecvBufSize",
Self::SendBufSize => "Sockoption::SendBufSize",
Self::RecvLowat => "Sockoption::RecvLowat",
Self::SendLowat => "Sockoption::SendLowat",
Self::RecvTimeout => "Sockoption::RecvTimeout",
Self::SendTimeout => "Sockoption::SendTimeout",
Self::ConnectTimeout => "Sockoption::ConnectTimeout",
Self::AcceptTimeout => "Sockoption::AcceptTimeout",
Self::Ttl => "Sockoption::Ttl",
Self::MulticastTtlV4 => "Sockoption::MulticastTtlV4",
Self::Type => "Sockoption::Type",
Self::Proto => "Sockoption::Proto",
};
write!(f, "{}", s)
}
}
// TODO: if necessary, must be implemented in wit-bindgen
unsafe impl wasmer::FromToNativeWasmType for Fdflags {
type Native = i32;
fn to_native(self) -> Self::Native {
self.bits() as i32
}
fn from_native(n: Self::Native) -> Self {
Self::from_bits_truncate(n as u16)
}
fn is_from_store(&self, _store: &impl wasmer::AsStoreRef) -> bool {
// TODO: find correct implementation
false
}
}
// TODO: if necessary, must be implemented in wit-bindgen
unsafe impl wasmer::FromToNativeWasmType for Rights {
type Native = i64;
fn to_native(self) -> Self::Native {
self.bits() as i64
}
fn from_native(n: Self::Native) -> Self {
Self::from_bits_truncate(n as u64)
}
fn is_from_store(&self, _store: &impl wasmer::AsStoreRef) -> bool {
// TODO: find correct implementation
false
}
}
// TODO: if necessary, must be implemented in wit-bindgen
unsafe impl wasmer::FromToNativeWasmType for Fstflags {
type Native = i32;
fn to_native(self) -> Self::Native {
self.bits() as i32
}
fn from_native(n: Self::Native) -> Self {
Self::from_bits_truncate(n as u16)
}
fn is_from_store(&self, _store: &impl wasmer::AsStoreRef) -> bool {
// TODO: find correct implementation
false
}
}
// TODO: if necessary, must be implemented in wit-bindgen
unsafe impl wasmer::FromToNativeWasmType for Oflags {
type Native = i32;
fn to_native(self) -> Self::Native {
self.bits() as i32
}
fn from_native(n: Self::Native) -> Self {
Self::from_bits_truncate(n as u16)
}
fn is_from_store(&self, _store: &impl wasmer::AsStoreRef) -> bool {
// TODO: find correct implementation
false
}
}
impl PartialEq for OptionCid {
fn eq(&self, other: &Self) -> bool {
self.tag == other.tag && self.cid == other.cid
}
}
impl Eq for OptionCid {}
#[derive(Copy, Clone)]
pub enum PrestatEnum {
Dir { pr_name_len: u32 },
}
impl PrestatEnum {
pub fn untagged(self) -> PrestatU {
match self {
PrestatEnum::Dir { pr_name_len } => PrestatU {
dir: PrestatUDir { pr_name_len },
},
}
}
}
impl Prestat {
#[allow(clippy::trivially_copy_pass_by_ref)]
pub fn tagged(&self) -> Option<PrestatEnum> {
match self.pr_type {
Preopentype::Dir => Some(PrestatEnum::Dir {
pr_name_len: self.u.dir.pr_name_len,
}),
}
}
}
unsafe impl wasmer::ValueType for Prestat {
fn zero_padding_bytes(&self, bytes: &mut [core::mem::MaybeUninit<u8>]) {
macro_rules! field {
($($f:tt)*) => {
&self.$($f)* as *const _ as usize - self as *const _ as usize
};
}
macro_rules! field_end {
($($f:tt)*) => {
field!($($f)*) + core::mem::size_of_val(&self.$($f)*)
};
}
macro_rules! zero {
($start:expr, $end:expr) => {
for i in $start..$end {
bytes[i] = core::mem::MaybeUninit::new(0);
}
};
}
self.pr_type
.zero_padding_bytes(&mut bytes[field!(pr_type)..field_end!(pr_type)]);
zero!(field_end!(pr_type), field!(u));
match self.pr_type {
Preopentype::Dir => {
self.u
.dir
.zero_padding_bytes(&mut bytes[field!(u.dir)..field_end!(u.dir)]);
zero!(field_end!(u.dir), field_end!(u));
}
}
zero!(field_end!(u), core::mem::size_of_val(self));
}
}
impl SubscriptionEnum {
pub fn raw_tag(&self) -> Eventtype {
match self {
SubscriptionEnum::Clock(_) => Eventtype::Clock,
SubscriptionEnum::Read(_) => Eventtype::FdRead,
SubscriptionEnum::Write(_) => Eventtype::FdWrite,
}
}
}

View File

@@ -0,0 +1,4 @@
pub(crate) mod extra;
pub(crate) mod extra_manual;
pub use extra::*;
pub use extra_manual::*;

View File

@@ -0,0 +1 @@
target/

View File

@@ -0,0 +1,14 @@
[package]
name = "wasi-types-generator-extra"
version = "0.1.0"
edition = "2021"
license = "MIT"
description = "Generator for wasi-types"
[dependencies]
convert_case = "0.5.0"
[dependencies.wit-parser]
default-features = false
package = "wasmer-wit-parser"
version = "0.1.1"

View File

@@ -0,0 +1,152 @@
//! This generator is run when regenerate.sh is executed and fixes a couple
//! of issues that wit-bindgen currently doesn't support.
//!
//! Eventually this functionality should be upstreamed into wit-bindgen,
//! see issue [#3177](https://github.com/wasmerio/wasmer/issues/3177).
use convert_case::{Case, Casing};
use wit_parser::TypeDefKind;
const WIT_1: &str = include_str!("../../wit-clean/output.wit");
const BINDINGS_RS: &str = include_str!("../../src/wasi/bindings.rs");
fn replace_in_string(s: &str, id: &str, ty: &str) -> String {
let parts = s.split(&format!("impl {id} {{")).collect::<Vec<_>>();
if parts.len() == 1 {
return s.to_string();
}
let replaced = parts[1].replacen(
"from_bits_preserve(bits: u8)",
&format!("from_bits_preserve(bits: {ty})"),
1,
);
format!("{}impl {id} {{ {replaced}", parts[0])
}
fn main() {
let mut bindings_rs = BINDINGS_RS
.replace("#[allow(clippy::all)]", "")
.replace("pub mod output {", "")
.replace("mod output {", "")
.replace("pub struct Rights: u8 {", "pub struct Rights: u64 {")
.replace("pub struct Lookup: u8 {", "pub struct Lookup: u32 {")
.replace("pub struct Oflags: u8 {", "pub struct Oflags: u16 {")
.replace(
"pub struct Subclockflags: u8 {",
"pub struct Subclockflags: u16 {",
)
.replace(
"pub struct Eventrwflags: u8 {",
"pub struct Eventrwflags: u16 {",
)
.replace("pub struct Fstflags: u8 {", "pub struct Fstflags: u16 {")
.replace("pub struct Fdflags: u8 {", "pub struct Fdflags: u16 {");
bindings_rs = replace_in_string(&bindings_rs, "Oflags", "u16");
bindings_rs = replace_in_string(&bindings_rs, "Subclockflags", "u16");
bindings_rs = replace_in_string(&bindings_rs, "Eventrwflags", "u16");
bindings_rs = replace_in_string(&bindings_rs, "Fstflags", "u16");
bindings_rs = replace_in_string(&bindings_rs, "Fdflags", "u16");
bindings_rs = replace_in_string(&bindings_rs, "Lookup", "u32");
bindings_rs = replace_in_string(&bindings_rs, "Rights", "u64");
let mut bindings_rs = bindings_rs.lines().collect::<Vec<_>>();
bindings_rs.pop();
let bindings_rs = bindings_rs.join("\n");
let target_path = env!("CARGO_MANIFEST_DIR");
let path = std::path::Path::new(&target_path)
.parent()
.unwrap()
.join("src")
.join("wasi")
.join("extra.rs");
let result = wit_parser::Interface::parse("output.wit", WIT_1).unwrap();
let mut contents = format!(
"
use std::mem::MaybeUninit;
use wasmer::ValueType;
{bindings_rs}
"
)
.replace(" ", "");
println!("output to {}", path.display());
let excluded_from_impl_valuetype = ["Prestat"];
for (_, i) in result.types.iter() {
match i.kind {
| TypeDefKind::Record(_)
| TypeDefKind::Flags(_)
| TypeDefKind::Tuple(_)
| TypeDefKind::Variant(_)
| TypeDefKind::Enum(_)
| TypeDefKind::Option(_)
| TypeDefKind::Expected(_)
| TypeDefKind::Union(_)
| TypeDefKind::List(_)
| TypeDefKind::Future(_)
| TypeDefKind::Stream(_)
// | TypeDefKind::Type(_)
=> {
let name = i.name.clone().unwrap_or_default().to_case(Case::Pascal);
if excluded_from_impl_valuetype.iter().any(|s| *s == name.as_str()) {
continue;
}
contents.push_str(&format!("
// TODO: if necessary, must be implemented in wit-bindgen
unsafe impl ValueType for {name} {{
#[inline]
fn zero_padding_bytes(&self, _bytes: &mut [MaybeUninit<u8>]) {{ }}
}}
").replace(" ", ""))
},
_ => { }
}
let name = i.name.clone().unwrap_or_default().to_case(Case::Pascal);
if let wit_parser::TypeDefKind::Enum(e) = &i.kind {
contents.push_str(
&format!(
"
unsafe impl wasmer::FromToNativeWasmType for {name} {{
type Native = i32;
fn to_native(self) -> Self::Native {{
self as i32
}}
fn from_native(n: Self::Native) -> Self {{
match n {{\n"
)
.replace(" ", ""),
);
for (i, case) in e.cases.iter().enumerate() {
contents.push_str(&format!(
" {i} => Self::{},\n",
case.name.to_case(Case::Pascal)
));
}
contents.push_str(
&format!(
"
q => todo!(\"could not serialize number {{q}} to enum {name}\"),
}}
}}
fn is_from_store(&self, _store: &impl wasmer::AsStoreRef) -> bool {{ false }}
}}
"
)
.replace(" ", ""),
);
}
}
std::fs::write(path, contents).unwrap();
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,512 @@
// WASI Preview. This is an evolution of the API that WASI initially
// launched with.
//
// Some content here is derived from [CloudABI](https://github.com/NuxiNL/cloudabi).
/// This API predated the convention of naming modules with a `wasi_unstable_`
/// prefix and a version number. It is preserved here for compatibility, but
/// we shouldn't follow this pattern in new APIs.
/*
(module $wasi_unstable
/// Linear memory to be accessed by WASI functions that need it.
(import "memory" (memory))
/// Read command-line argument data.
/// The size of the array should match that returned by `args_sizes_get`.
/// Each argument is expected to be `\0` terminated.
(@interface func (export "args_get")
(param $argv (@witx pointer (@witx pointer u8)))
(param $argv_buf (@witx pointer u8))
(result $error (expected (error $errno)))
)
/// Return command-line argument data sizes.
(@interface func (export "args_sizes_get")
/// Returns the number of arguments and the size of the argument string
/// data, or an error.
(result $error (expected (tuple $size $size) (error $errno)))
)
/// Read environment variable data.
/// The sizes of the buffers should match that returned by `environ_sizes_get`.
/// Key/value pairs are expected to be joined with `=`s, and terminated with `\0`s.
(@interface func (export "environ_get")
(param $environ (@witx pointer (@witx pointer u8)))
(param $environ_buf (@witx pointer u8))
(result $error (expected (error $errno)))
)
/// Return environment variable data sizes.
(@interface func (export "environ_sizes_get")
/// Returns the number of environment variable arguments and the size of the
/// environment variable data.
(result $error (expected (tuple $size $size) (error $errno)))
)
/// Return the resolution of a clock.
/// Implementations are required to provide a non-zero value for supported clocks. For unsupported clocks, return
/// `errno::inval`.
/// Note: This is similar to `clock_getres` in POSIX.
(@interface func (export "clock_res_get")
/// The clock for which to return the resolution.
(param $id $clockid)
/// The resolution of the clock, or an error if one happened.
(result $error (expected $timestamp (error $errno)))
)
/// Return the time value of a clock.
/// Note: This is similar to `clock_gettime` in POSIX.
(@interface func (export "clock_time_get")
/// The clock for which to return the time.
(param $id $clockid)
/// The maximum lag (exclusive) that the returned time value may have, compared to its actual value.
(param $precision $timestamp)
/// The time value of the clock.
(result $error (expected $timestamp (error $errno)))
)
/// Provide file advisory information on a file descriptor.
/// Note: This is similar to `posix_fadvise` in POSIX.
(@interface func (export "fd_advise")
(param $fd $fd)
/// The offset within the file to which the advisory applies.
(param $offset $filesize)
/// The length of the region to which the advisory applies.
(param $len $filesize)
/// The advice.
(param $advice $advice)
(result $error (expected (error $errno)))
)
/// Force the allocation of space in a file.
/// Note: This is similar to `posix_fallocate` in POSIX.
(@interface func (export "fd_allocate")
(param $fd $fd)
/// The offset at which to start the allocation.
(param $offset $filesize)
/// The length of the area that is allocated.
(param $len $filesize)
(result $error (expected (error $errno)))
)
/// Close a file descriptor.
/// Note: This is similar to `close` in POSIX.
(@interface func (export "fd_close")
(param $fd $fd)
(result $error (expected (error $errno)))
)
/// Synchronize the data of a file to disk.
/// Note: This is similar to `fdatasync` in POSIX.
(@interface func (export "fd_datasync")
(param $fd $fd)
(result $error (expected (error $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.
(@interface func (export "fd_fdstat_get")
(param $fd $fd)
/// The buffer where the file descriptor's attributes are stored.
(result $error (expected $fdstat (error $errno)))
)
/// Adjust the flags associated with a file descriptor.
/// Note: This is similar to `fcntl(fd, F_SETFL, flags)` in POSIX.
(@interface func (export "fd_fdstat_set_flags")
(param $fd $fd)
/// The desired values of the file descriptor flags.
(param $flags $fdflags)
(result $error (expected (error $errno)))
)
/// Adjust the rights associated with a file descriptor.
/// This can only be used to remove rights, and returns `errno::notcapable` if called in a way that would attempt to add rights
(@interface func (export "fd_fdstat_set_rights")
(param $fd $fd)
/// The desired rights of the file descriptor.
(param $fs_rights_base $rights)
(param $fs_rights_inheriting $rights)
(result $error (expected (error $errno)))
)
/// Return the attributes of an open file.
(@interface func (export "fd_filestat_get")
(param $fd $fd)
/// The buffer where the file's attributes are stored.
(result $error (expected $filestat (error $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.
(@interface func (export "fd_filestat_set_size")
(param $fd $fd)
/// The desired file size.
(param $size $filesize)
(result $error (expected (error $errno)))
)
/// Adjust the timestamps of an open file or directory.
/// Note: This is similar to `futimens` in POSIX.
(@interface func (export "fd_filestat_set_times")
(param $fd $fd)
/// The desired values of the data access timestamp.
(param $atim $timestamp)
/// The desired values of the data modification timestamp.
(param $mtim $timestamp)
/// A bitmask indicating which timestamps to adjust.
(param $fst_flags $fstflags)
(result $error (expected (error $errno)))
)
/// Read from a file descriptor, without using and updating the file descriptor's offset.
/// Note: This is similar to `preadv` in POSIX.
(@interface func (export "fd_pread")
(param $fd $fd)
/// List of scatter/gather vectors in which to store data.
(param $iovs $iovec_array)
/// The offset within the file at which to read.
(param $offset $filesize)
/// The number of bytes read.
(result $error (expected $size (error $errno)))
)
/// Return a description of the given preopened file descriptor.
(@interface func (export "fd_prestat_get")
(param $fd $fd)
/// The buffer where the description is stored.
(result $error (expected $prestat (error $errno)))
)
/// Return a description of the given preopened file descriptor.
(@interface func (export "fd_prestat_dir_name")
(param $fd $fd)
/// A buffer into which to write the preopened directory name.
(param $path (@witx pointer u8))
(param $path_len $size)
(result $error (expected (error $errno)))
)
/// Write to a file descriptor, without using and updating the file descriptor's offset.
/// Note: This is similar to `pwritev` in POSIX.
(@interface func (export "fd_pwrite")
(param $fd $fd)
/// List of scatter/gather vectors from which to retrieve data.
(param $iovs $ciovec_array)
/// The offset within the file at which to write.
(param $offset $filesize)
/// The number of bytes written.
(result $error (expected $size (error $errno)))
)
/// Read from a file descriptor.
/// Note: This is similar to `readv` in POSIX.
(@interface func (export "fd_read")
(param $fd $fd)
/// List of scatter/gather vectors to which to store data.
(param $iovs $iovec_array)
/// The number of bytes read.
(result $error (expected $size (error $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` object,
/// followed by `dirent::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.
(@interface func (export "fd_readdir")
(param $fd $fd)
/// The buffer where directory entries are stored
(param $buf (@witx pointer u8))
(param $buf_len $size)
/// The location within the directory to start reading
(param $cookie $dircookie)
/// 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.
(result $error (expected $size (error $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.
(@interface func (export "fd_renumber")
(param $fd $fd)
/// The file descriptor to overwrite.
(param $to $fd)
(result $error (expected (error $errno)))
)
/// Move the offset of a file descriptor.
/// Note: This is similar to `lseek` in POSIX.
(@interface func (export "fd_seek")
(param $fd $fd)
/// The number of bytes to move.
(param $offset $filedelta)
/// The base from which the offset is relative.
(param $whence $whence)
/// The new offset of the file descriptor, relative to the start of the file.
(result $error (expected $filesize (error $errno)))
)
/// Synchronize the data and metadata of a file to disk.
/// Note: This is similar to `fsync` in POSIX.
(@interface func (export "fd_sync")
(param $fd $fd)
(result $error (expected (error $errno)))
)
/// Return the current offset of a file descriptor.
/// Note: This is similar to `lseek(fd, 0, SEEK_CUR)` in POSIX.
(@interface func (export "fd_tell")
(param $fd $fd)
/// The current offset of the file descriptor, relative to the start of the file.
(result $error (expected $filesize (error $errno)))
)
/// Write to a file descriptor.
/// Note: This is similar to `writev` in POSIX.
(@interface func (export "fd_write")
(param $fd $fd)
/// List of scatter/gather vectors from which to retrieve data.
(param $iovs $ciovec_array)
(result $error (expected $size (error $errno)))
)
/// Create a directory.
/// Note: This is similar to `mkdirat` in POSIX.
(@interface func (export "path_create_directory")
(param $fd $fd)
/// The path at which to create the directory.
(param $path string)
(result $error (expected (error $errno)))
)
/// Return the attributes of a file or directory.
/// Note: This is similar to `stat` in POSIX.
(@interface func (export "path_filestat_get")
(param $fd $fd)
/// Flags determining the method of how the path is resolved.
(param $flags $lookupflags)
/// The path of the file or directory to inspect.
(param $path string)
/// The buffer where the file's attributes are stored.
(result $error (expected $filestat (error $errno)))
)
/// Adjust the timestamps of a file or directory.
/// Note: This is similar to `utimensat` in POSIX.
(@interface func (export "path_filestat_set_times")
(param $fd $fd)
/// Flags determining the method of how the path is resolved.
(param $flags $lookupflags)
/// The path of the file or directory to operate on.
(param $path string)
/// The desired values of the data access timestamp.
(param $atim $timestamp)
/// The desired values of the data modification timestamp.
(param $mtim $timestamp)
/// A bitmask indicating which timestamps to adjust.
(param $fst_flags $fstflags)
(result $error (expected (error $errno)))
)
/// Create a hard link.
/// Note: This is similar to `linkat` in POSIX.
(@interface func (export "path_link")
(param $old_fd $fd)
/// Flags determining the method of how the path is resolved.
(param $old_flags $lookupflags)
/// The source path from which to link.
(param $old_path string)
/// The working directory at which the resolution of the new path starts.
(param $new_fd $fd)
/// The destination path at which to create the hard link.
(param $new_path string)
(result $error (expected (error $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.
(@interface func (export "path_open")
(param $fd $fd)
/// Flags determining the method of how the path is resolved.
(param $dirflags $lookupflags)
/// The relative path of the file or directory to open, relative to the
/// `path_open::fd` directory.
(param $path string)
/// The method by which to open the file.
(param $oflags $oflags)
/// 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.
(param $fs_rights_base $rights)
(param $fs_rights_inheriting $rights)
(param $fdflags $fdflags)
/// The file descriptor of the file that has been opened.
(result $error (expected $fd (error $errno)))
)
/// Read the contents of a symbolic link.
/// Note: This is similar to `readlinkat` in POSIX.
(@interface func (export "path_readlink")
(param $fd $fd)
/// The path of the symbolic link from which to read.
(param $path string)
/// The buffer to which to write the contents of the symbolic link.
(param $buf (@witx pointer u8))
(param $buf_len $size)
/// The number of bytes placed in the buffer.
(result $error (expected $size (error $errno)))
)
/// Remove a directory.
/// Return `errno::notempty` if the directory is not empty.
/// Note: This is similar to `unlinkat(fd, path, AT_REMOVEDIR)` in POSIX.
(@interface func (export "path_remove_directory")
(param $fd $fd)
/// The path to a directory to remove.
(param $path string)
(result $error (expected (error $errno)))
)
/// Rename a file or directory.
/// Note: This is similar to `renameat` in POSIX.
(@interface func (export "path_rename")
(param $fd $fd)
/// The source path of the file or directory to rename.
(param $old_path string)
/// The working directory at which the resolution of the new path starts.
(param $new_fd $fd)
/// The destination path to which to rename the file or directory.
(param $new_path string)
(result $error (expected (error $errno)))
)
/// Create a symbolic link.
/// Note: This is similar to `symlinkat` in POSIX.
(@interface func (export "path_symlink")
/// The contents of the symbolic link.
(param $old_path string)
(param $fd $fd)
/// The destination path at which to create the symbolic link.
(param $new_path string)
(result $error (expected (error $errno)))
)
/// Unlink a file.
/// Return `errno::isdir` if the path refers to a directory.
/// Note: This is similar to `unlinkat(fd, path, 0)` in POSIX.
(@interface func (export "path_unlink_file")
(param $fd $fd)
/// The path to a file to unlink.
(param $path string)
(result $error (expected (error $errno)))
)
/// Concurrently poll for the occurrence of a set of events.
(@interface func (export "poll_oneoff")
/// The events to which to subscribe.
(param $in (@witx const_pointer $subscription))
/// The events that have occurred.
(param $out (@witx pointer $event))
/// Both the number of subscriptions and events.
(param $nsubscriptions $size)
/// The number of events stored.
(result $error (expected $size (error $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.
(@interface func (export "proc_exit")
/// The exit code returned by the process.
(param $rval $exitcode)
(@witx noreturn)
)
/// Send a signal to the process of the calling thread.
/// Note: This is similar to `raise` in POSIX.
(@interface func (export "proc_raise")
/// The signal condition to trigger.
(param $sig $signal)
(result $error (expected (error $errno)))
)
/// Temporarily yield execution of the calling thread.
/// Note: This is similar to `sched_yield` in POSIX.
(@interface func (export "sched_yield")
(result $error (expected (error $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.
(@interface func (export "random_get")
/// The buffer to fill with random data.
(param $buf (@witx pointer u8))
(param $buf_len $size)
(result $error (expected (error $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`.
(@interface func (export "sock_recv")
(param $fd $fd)
/// List of scatter/gather vectors to which to store data.
(param $ri_data $iovec_array)
/// Message flags.
(param $ri_flags $riflags)
/// Number of bytes stored in ri_data and message flags.
(result $error (expected (tuple $size $roflags) (error $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`.
(@interface func (export "sock_send")
(param $fd $fd)
/// List of scatter/gather vectors to which to retrieve data
(param $si_data $ciovec_array)
/// Message flags.
(param $si_flags $siflags)
/// Number of bytes transmitted.
(result $error (expected $size (error $errno)))
)
/// Shut down socket send and receive channels.
/// Note: This is similar to `shutdown` in POSIX.
(@interface func (export "sock_shutdown")
(param $fd $fd)
/// Which channels on the socket to shut down.
(param $how $sdflags)
(result $error (expected (error $errno)))
)
)
*/

View File

@@ -46,11 +46,11 @@ tracing-wasm = "0.2"
default = ["sys-default"]
wasix = []
sys = ["wasmer/sys", "wasix"]
sys = ["wasmer/sys", "wasix", "wasmer-wasi-types/sys"]
sys-default = ["wasmer/wat", "wasmer/compiler", "sys", "logging", "host-fs", "sys-poll", "host-vnet" ]
sys-poll = []
js = ["wasmer/js", "mem-fs", "wasmer-vfs/no-time", "getrandom/js", "chrono"]
js = ["wasmer/js", "mem-fs", "wasmer-vfs/no-time", "getrandom/js", "chrono", "wasmer-wasi-types/js"]
js-default = ["js", "wasmer/js-default"]
test-js = ["js", "wasmer/js-default", "wasmer/wat"]

View File

@@ -57,7 +57,6 @@ pub use wasmer_vfs::FsError as WasiFsError;
pub use wasmer_vfs::VirtualFile as WasiFile;
pub use wasmer_vfs::{FsError, VirtualFile};
pub use wasmer_vnet::{UnsupportedVirtualNetworking, VirtualNetworking};
use wasmer_wasi_types::__WASI_CLOCK_MONOTONIC;
use derivative::*;
use std::ops::Deref;
@@ -68,6 +67,7 @@ use wasmer::{
Imports, Instance, Memory, Memory32, MemoryAccessError, MemorySize, MemoryView, Module,
TypedFunction,
};
use wasmer_wasi_types::wasi::{BusErrno, Errno, Snapshot0Clockid};
pub use runtime::{
PluggableRuntimeImplementation, WasiRuntimeImplementation, WasiThreadError, WasiTtyState,
@@ -321,10 +321,12 @@ impl WasiEnv {
// Sleeps for a period of time
pub fn sleep(&self, duration: Duration) -> Result<(), WasiError> {
let duration = duration.as_nanos();
let start = platform_clock_time_get(__WASI_CLOCK_MONOTONIC, 1_000_000).unwrap() as u128;
let start =
platform_clock_time_get(Snapshot0Clockid::Monotonic, 1_000_000).unwrap() as u128;
self.yield_now()?;
loop {
let now = platform_clock_time_get(__WASI_CLOCK_MONOTONIC, 1_000_000).unwrap() as u128;
let now =
platform_clock_time_get(Snapshot0Clockid::Monotonic, 1_000_000).unwrap() as u128;
let delta = match now.checked_sub(start) {
Some(a) => a,
None => {
@@ -809,20 +811,20 @@ fn generate_import_object_wasix64_v1(
}
}
fn mem_error_to_wasi(err: MemoryAccessError) -> types::__wasi_errno_t {
fn mem_error_to_wasi(err: MemoryAccessError) -> Errno {
match err {
MemoryAccessError::HeapOutOfBounds => types::__WASI_EFAULT,
MemoryAccessError::Overflow => types::__WASI_EOVERFLOW,
MemoryAccessError::NonUtf8String => types::__WASI_EINVAL,
_ => types::__WASI_EINVAL,
MemoryAccessError::HeapOutOfBounds => Errno::Fault,
MemoryAccessError::Overflow => Errno::Overflow,
MemoryAccessError::NonUtf8String => Errno::Inval,
_ => Errno::Inval,
}
}
fn mem_error_to_bus(err: MemoryAccessError) -> types::__bus_errno_t {
fn mem_error_to_bus(err: MemoryAccessError) -> BusErrno {
match err {
MemoryAccessError::HeapOutOfBounds => types::__BUS_EMEMVIOLATION,
MemoryAccessError::Overflow => types::__BUS_EMEMVIOLATION,
MemoryAccessError::NonUtf8String => types::__BUS_EBADREQUEST,
_ => types::__BUS_EUNKNOWN,
MemoryAccessError::HeapOutOfBounds => BusErrno::Memviolation,
MemoryAccessError::Overflow => BusErrno::Memviolation,
MemoryAccessError::NonUtf8String => BusErrno::Badrequest,
_ => BusErrno::Unknown,
}
}

View File

@@ -4,7 +4,7 @@
/// succeeded or returns the error value.
macro_rules! wasi_try {
($expr:expr) => {{
let res: Result<_, crate::syscalls::types::__wasi_errno_t> = $expr;
let res: Result<_, crate::syscalls::types::wasi::Errno> = $expr;
match res {
Ok(val) => {
tracing::trace!("wasi::wasi_try::val: {:?}", val);
@@ -22,7 +22,7 @@ macro_rules! wasi_try {
/// succeeded or returns the error value. Results are wrapped in an Ok
macro_rules! wasi_try_ok {
($expr:expr) => {{
let res: Result<_, crate::syscalls::types::__wasi_errno_t> = $expr;
let res: Result<_, crate::syscalls::types::wasi::Errno> = $expr;
match res {
Ok(val) => {
tracing::trace!("wasi::wasi_try_ok::val: {:?}", val);
@@ -36,14 +36,14 @@ macro_rules! wasi_try_ok {
}};
($expr:expr, $thread:expr) => {{
let res: Result<_, crate::syscalls::types::__wasi_errno_t> = $expr;
let res: Result<_, crate::syscalls::types::wasi::Errno> = $expr;
match res {
Ok(val) => {
tracing::trace!("wasi::wasi_try_ok::val: {:?}", val);
val
}
Err(err) => {
if err == __WASI_EINTR {
if err == crate::syscalls::types::wasi::Errno::Intr {
$thread.yield_now()?;
}
tracing::debug!("wasi::wasi_try_ok::err: {:?}", err);
@@ -57,7 +57,7 @@ macro_rules! wasi_try_ok {
/// succeeded or returns the error value.
macro_rules! wasi_try_bus {
($expr:expr) => {{
let res: Result<_, crate::syscalls::types::__bus_errno_t> = $expr;
let res: Result<_, crate::syscalls::types::wasi::BusErrno> = $expr;
match res {
Ok(val) => {
tracing::trace!("wasi::wasi_try_bus::val: {:?}", val);
@@ -71,21 +71,21 @@ macro_rules! wasi_try_bus {
}};
}
/// Like `wasi_try` but converts a `MemoryAccessError` to a __wasi_errno_t`.
/// Like `wasi_try` but converts a `MemoryAccessError` to a `wasi::Errno`.
macro_rules! wasi_try_mem {
($expr:expr) => {{
wasi_try!($expr.map_err($crate::mem_error_to_wasi))
}};
}
/// Like `wasi_try` but converts a `MemoryAccessError` to a __bus_errno_t`.
/// Like `wasi_try` but converts a `MemoryAccessError` to a `wasi::BusErrno`.
macro_rules! wasi_try_mem_bus {
($expr:expr) => {{
wasi_try_bus!($expr.map_err($crate::mem_error_to_bus))
}};
}
/// Like `wasi_try` but converts a `MemoryAccessError` to a __wasi_errno_t`.
/// Like `wasi_try` but converts a `MemoryAccessError` to a `wasi::Errno`.
macro_rules! wasi_try_mem_ok {
($expr:expr) => {{
wasi_try_ok!($expr.map_err($crate::mem_error_to_wasi))

View File

@@ -4,8 +4,8 @@ use std::sync::atomic::{AtomicU32, Ordering};
use thiserror::Error;
use wasmer_vbus::{UnsupportedVirtualBus, VirtualBus};
use wasmer_vnet::VirtualNetworking;
use wasmer_wasi_types::wasi::Errno;
use super::types::*;
use super::WasiError;
use super::WasiThreadId;
@@ -17,11 +17,11 @@ pub enum WasiThreadError {
MethodNotFound,
}
impl From<WasiThreadError> for __wasi_errno_t {
fn from(a: WasiThreadError) -> __wasi_errno_t {
impl From<WasiThreadError> for Errno {
fn from(a: WasiThreadError) -> Errno {
match a {
WasiThreadError::Unsupported => __WASI_ENOTSUP,
WasiThreadError::MethodNotFound => __WASI_EINVAL,
WasiThreadError::Unsupported => Errno::Notsup,
WasiThreadError::MethodNotFound => Errno::Inval,
}
}
}

View File

@@ -50,7 +50,7 @@ pub(crate) struct WasiStateFileGuard {
}
impl WasiStateFileGuard {
pub fn new(state: &WasiState, fd: __wasi_fd_t) -> Result<Option<Self>, FsError> {
pub fn new(state: &WasiState, fd: wasi::Fd) -> Result<Option<Self>, FsError> {
let inodes = state.inodes.read().unwrap();
let fd_map = state.fs.fd_map.read().unwrap();
if let Some(fd) = fd_map.get(&fd) {

View File

@@ -52,26 +52,42 @@ use std::{
};
use tracing::{debug, trace};
use wasmer_vbus::BusSpawnedProcess;
use wasmer_wasi_types::wasi::{
Errno, Fd as WasiFd, Fdflags, Fdstat, Filesize, Filestat, Filetype, Preopentype, Rights,
};
use wasmer_wasi_types::wasi::{Prestat, PrestatEnum};
use wasmer_vfs::{FileSystem, FsError, OpenOptions, VirtualFile};
/// the fd value of the virtual root
pub const VIRTUAL_ROOT_FD: __wasi_fd_t = 3;
pub const VIRTUAL_ROOT_FD: WasiFd = 3;
/// all the rights enabled
pub const ALL_RIGHTS: __wasi_rights_t = 0x1FFF_FFFF;
const STDIN_DEFAULT_RIGHTS: __wasi_rights_t = __WASI_RIGHT_FD_DATASYNC
| __WASI_RIGHT_FD_READ
| __WASI_RIGHT_FD_SYNC
| __WASI_RIGHT_FD_ADVISE
| __WASI_RIGHT_FD_FILESTAT_GET
| __WASI_RIGHT_POLL_FD_READWRITE;
const STDOUT_DEFAULT_RIGHTS: __wasi_rights_t = __WASI_RIGHT_FD_DATASYNC
| __WASI_RIGHT_FD_WRITE
| __WASI_RIGHT_FD_SYNC
| __WASI_RIGHT_FD_ADVISE
| __WASI_RIGHT_FD_FILESTAT_GET
| __WASI_RIGHT_POLL_FD_READWRITE;
const STDERR_DEFAULT_RIGHTS: __wasi_rights_t = STDOUT_DEFAULT_RIGHTS;
pub const ALL_RIGHTS: Rights = Rights::all();
const STDIN_DEFAULT_RIGHTS: Rights = {
// This might seem a bit overenineered, but it's the only way I
// discovered for getting the values in a const environment
Rights::from_bits_truncate(
Rights::FD_DATASYNC.bits()
| Rights::FD_READ.bits()
| Rights::FD_SYNC.bits()
| Rights::FD_ADVISE.bits()
| Rights::FD_FILESTAT_GET.bits()
| Rights::POLL_FD_READWRITE.bits(),
)
};
const STDOUT_DEFAULT_RIGHTS: Rights = {
// This might seem a bit overenineered, but it's the only way I
// discovered for getting the values in a const environment
Rights::from_bits_truncate(
Rights::FD_DATASYNC.bits()
| Rights::FD_SYNC.bits()
| Rights::FD_WRITE.bits()
| Rights::FD_ADVISE.bits()
| Rights::FD_FILESTAT_GET.bits()
| Rights::POLL_FD_READWRITE.bits(),
)
};
const STDERR_DEFAULT_RIGHTS: Rights = STDOUT_DEFAULT_RIGHTS;
/// A completely aribtrary "big enough" number used as the upper limit for
/// the number of symlinks that can be traversed when resolving a path
@@ -81,7 +97,7 @@ pub const MAX_SYMLINKS: u32 = 128;
#[derive(Debug)]
#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
pub struct InodeVal {
pub stat: RwLock<__wasi_filestat_t>,
pub stat: RwLock<Filestat>,
pub is_preopened: bool,
pub name: String,
pub kind: RwLock<Kind>,
@@ -149,7 +165,7 @@ pub enum Kind {
/// - There is always a closer pre-opened dir to the symlink file (by definition of the root being a collection of preopened dirs)
Symlink {
/// The preopened dir that this symlink file is relative to (via `path_to_symlink`)
base_po_dir: __wasi_fd_t,
base_po_dir: WasiFd,
/// The path to the symlink from the `base_po_dir`
path_to_symlink: PathBuf,
/// the value of the symlink as a relative path
@@ -172,9 +188,9 @@ pub enum Kind {
#[derive(Debug, Clone)]
#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
pub struct Fd {
pub rights: __wasi_rights_t,
pub rights_inheriting: __wasi_rights_t,
pub flags: __wasi_fdflags_t,
pub rights: Rights,
pub rights_inheriting: Rights,
pub flags: Fdflags,
pub offset: u64,
/// Flags that determine how the [`Fd`] can be used.
///
@@ -212,14 +228,11 @@ pub struct WasiInodes {
impl WasiInodes {
/// gets either a normal inode or an orphaned inode
pub fn get_inodeval(
&self,
inode: generational_arena::Index,
) -> Result<&InodeVal, __wasi_errno_t> {
pub fn get_inodeval(&self, inode: generational_arena::Index) -> Result<&InodeVal, Errno> {
if let Some(iv) = self.arena.get(inode) {
Ok(iv)
} else {
self.orphan_fds.get(&inode).ok_or(__WASI_EBADF)
self.orphan_fds.get(&inode).ok_or(Errno::Badf)
}
}
@@ -227,11 +240,11 @@ impl WasiInodes {
pub fn get_inodeval_mut(
&mut self,
inode: generational_arena::Index,
) -> Result<&mut InodeVal, __wasi_errno_t> {
) -> Result<&mut InodeVal, Errno> {
if let Some(iv) = self.arena.get_mut(inode) {
Ok(iv)
} else {
self.orphan_fds.get_mut(&inode).ok_or(__WASI_EBADF)
self.orphan_fds.get_mut(&inode).ok_or(Errno::Badf)
}
}
@@ -285,7 +298,7 @@ impl WasiInodes {
fn std_dev_get<'a>(
&'a self,
fd_map: &RwLock<HashMap<u32, Fd>>,
fd: __wasi_fd_t,
fd: WasiFd,
) -> Result<InodeValFileReadGuard<'a>, FsError> {
if let Some(fd) = fd_map.read().unwrap().get(&fd) {
let guard = self.arena[fd.inode].read();
@@ -305,7 +318,7 @@ impl WasiInodes {
fn std_dev_get_mut<'a>(
&'a self,
fd_map: &RwLock<HashMap<u32, Fd>>,
fd: __wasi_fd_t,
fd: WasiFd,
) -> Result<InodeValFileWriteGuard<'a>, FsError> {
if let Some(fd) = fd_map.read().unwrap().get(&fd) {
let guard = self.arena[fd.inode].write();
@@ -404,19 +417,19 @@ impl WasiFs {
path: PathBuf::from(preopen_name),
entries: Default::default(),
};
let rights = __WASI_RIGHT_FD_ADVISE
| __WASI_RIGHT_FD_TELL
| __WASI_RIGHT_FD_SEEK
| __WASI_RIGHT_FD_READ
| __WASI_RIGHT_PATH_OPEN
| __WASI_RIGHT_FD_READDIR
| __WASI_RIGHT_PATH_READLINK
| __WASI_RIGHT_PATH_FILESTAT_GET
| __WASI_RIGHT_FD_FILESTAT_GET
| __WASI_RIGHT_PATH_LINK_SOURCE
| __WASI_RIGHT_PATH_RENAME_SOURCE
| __WASI_RIGHT_POLL_FD_READWRITE
| __WASI_RIGHT_SOCK_SHUTDOWN;
let rights = Rights::FD_ADVISE
| Rights::FD_TELL
| Rights::FD_SEEK
| Rights::FD_READ
| Rights::PATH_OPEN
| Rights::FD_READDIR
| Rights::PATH_READLINK
| Rights::PATH_FILESTAT_GET
| Rights::FD_FILESTAT_GET
| Rights::PATH_LINK_SOURCE
| Rights::PATH_RENAME_SOURCE
| Rights::POLL_FD_READWRITE
| Rights::SOCK_SHUTDOWN;
let inode = wasi_fs
.create_inode(inodes, kind, true, preopen_name.clone())
.map_err(|e| {
@@ -427,7 +440,7 @@ impl WasiFs {
})?;
let fd_flags = Fd::READ;
let fd = wasi_fs
.create_fd(rights, rights, 0, fd_flags, inode)
.create_fd(rights, rights, Fdflags::empty(), fd_flags, inode)
.map_err(|e| format!("Could not open fd for file {:?}: {}", preopen_name, e))?;
{
let mut guard = inodes.arena[root_inode].write();
@@ -478,44 +491,43 @@ impl WasiFs {
let rights = {
// TODO: review tell' and fd_readwrite
let mut rights =
__WASI_RIGHT_FD_ADVISE | __WASI_RIGHT_FD_TELL | __WASI_RIGHT_FD_SEEK;
let mut rights = Rights::FD_ADVISE | Rights::FD_TELL | Rights::FD_SEEK;
if *read {
rights |= __WASI_RIGHT_FD_READ
| __WASI_RIGHT_PATH_OPEN
| __WASI_RIGHT_FD_READDIR
| __WASI_RIGHT_PATH_READLINK
| __WASI_RIGHT_PATH_FILESTAT_GET
| __WASI_RIGHT_FD_FILESTAT_GET
| __WASI_RIGHT_PATH_LINK_SOURCE
| __WASI_RIGHT_PATH_RENAME_SOURCE
| __WASI_RIGHT_POLL_FD_READWRITE
| __WASI_RIGHT_SOCK_SHUTDOWN;
rights |= Rights::FD_READ
| Rights::PATH_OPEN
| Rights::FD_READDIR
| Rights::PATH_READLINK
| Rights::PATH_FILESTAT_GET
| Rights::FD_FILESTAT_GET
| Rights::PATH_LINK_SOURCE
| Rights::PATH_RENAME_SOURCE
| Rights::POLL_FD_READWRITE
| Rights::SOCK_SHUTDOWN;
}
if *write {
rights |= __WASI_RIGHT_FD_DATASYNC
| __WASI_RIGHT_FD_FDSTAT_SET_FLAGS
| __WASI_RIGHT_FD_WRITE
| __WASI_RIGHT_FD_SYNC
| __WASI_RIGHT_FD_ALLOCATE
| __WASI_RIGHT_PATH_OPEN
| __WASI_RIGHT_PATH_RENAME_TARGET
| __WASI_RIGHT_PATH_FILESTAT_SET_SIZE
| __WASI_RIGHT_PATH_FILESTAT_SET_TIMES
| __WASI_RIGHT_FD_FILESTAT_SET_SIZE
| __WASI_RIGHT_FD_FILESTAT_SET_TIMES
| __WASI_RIGHT_PATH_REMOVE_DIRECTORY
| __WASI_RIGHT_PATH_UNLINK_FILE
| __WASI_RIGHT_POLL_FD_READWRITE
| __WASI_RIGHT_SOCK_SHUTDOWN;
rights |= Rights::FD_DATASYNC
| Rights::FD_FDSTAT_SET_FLAGS
| Rights::FD_WRITE
| Rights::FD_SYNC
| Rights::FD_ALLOCATE
| Rights::PATH_OPEN
| Rights::PATH_RENAME_TARGET
| Rights::PATH_FILESTAT_SET_SIZE
| Rights::PATH_FILESTAT_SET_TIMES
| Rights::FD_FILESTAT_SET_SIZE
| Rights::FD_FILESTAT_SET_TIMES
| Rights::PATH_REMOVE_DIRECTORY
| Rights::PATH_UNLINK_FILE
| Rights::POLL_FD_READWRITE
| Rights::SOCK_SHUTDOWN;
}
if *create {
rights |= __WASI_RIGHT_PATH_CREATE_DIRECTORY
| __WASI_RIGHT_PATH_CREATE_FILE
| __WASI_RIGHT_PATH_LINK_TARGET
| __WASI_RIGHT_PATH_OPEN
| __WASI_RIGHT_PATH_RENAME_TARGET
| __WASI_RIGHT_PATH_SYMLINK;
rights |= Rights::PATH_CREATE_DIRECTORY
| Rights::PATH_CREATE_FILE
| Rights::PATH_LINK_TARGET
| Rights::PATH_OPEN
| Rights::PATH_RENAME_TARGET
| Rights::PATH_SYMLINK;
}
rights
@@ -546,7 +558,7 @@ impl WasiFs {
fd_flags
};
let fd = wasi_fs
.create_fd(rights, rights, 0, fd_flags, inode)
.create_fd(rights, rights, Fdflags::empty(), fd_flags, inode)
.map_err(|e| format!("Could not open fd for file {:?}: {}", path, e))?;
{
let mut guard = inodes.arena[root_inode].write();
@@ -596,23 +608,25 @@ impl WasiFs {
// TODO: make this a list of positive rigths instead of negative ones
// root gets all right for now
let root_rights = all_rights
/*& (!__WASI_RIGHT_FD_WRITE)
& (!__WASI_RIGHT_FD_ALLOCATE)
& (!__WASI_RIGHT_PATH_CREATE_DIRECTORY)
& (!__WASI_RIGHT_PATH_CREATE_FILE)
& (!__WASI_RIGHT_PATH_LINK_SOURCE)
& (!__WASI_RIGHT_PATH_RENAME_SOURCE)
& (!__WASI_RIGHT_PATH_RENAME_TARGET)
& (!__WASI_RIGHT_PATH_FILESTAT_SET_SIZE)
& (!__WASI_RIGHT_PATH_FILESTAT_SET_TIMES)
& (!__WASI_RIGHT_FD_FILESTAT_SET_SIZE)
& (!__WASI_RIGHT_FD_FILESTAT_SET_TIMES)
& (!__WASI_RIGHT_PATH_SYMLINK)
& (!__WASI_RIGHT_PATH_UNLINK_FILE)
& (!__WASI_RIGHT_PATH_REMOVE_DIRECTORY)*/;
/*
& (!Rights::FD_WRITE)
& (!Rights::FD_ALLOCATE)
& (!Rights::PATH_CREATE_DIRECTORY)
& (!Rights::PATH_CREATE_FILE)
& (!Rights::PATH_LINK_SOURCE)
& (!Rights::PATH_RENAME_SOURCE)
& (!Rights::PATH_RENAME_TARGET)
& (!Rights::PATH_FILESTAT_SET_SIZE)
& (!Rights::PATH_FILESTAT_SET_TIMES)
& (!Rights::FD_FILESTAT_SET_SIZE)
& (!Rights::FD_FILESTAT_SET_TIMES)
& (!Rights::PATH_SYMLINK)
& (!Rights::PATH_UNLINK_FILE)
& (!Rights::PATH_REMOVE_DIRECTORY)
*/;
let inode = wasi_fs.create_virtual_root(inodes);
let fd = wasi_fs
.create_fd(root_rights, root_rights, 0, Fd::READ, inode)
.create_fd(root_rights, root_rights, Fdflags::empty(), Fd::READ, inode)
.map_err(|e| format!("Could not create root fd: {}", e))?;
wasi_fs.preopen_fds.write().unwrap().push(fd);
inode
@@ -639,12 +653,12 @@ impl WasiFs {
pub unsafe fn open_dir_all(
&mut self,
inodes: &mut WasiInodes,
base: __wasi_fd_t,
base: WasiFd,
name: String,
rights: __wasi_rights_t,
rights_inheriting: __wasi_rights_t,
flags: __wasi_fdflags_t,
) -> Result<__wasi_fd_t, FsError> {
rights: Rights,
rights_inheriting: Rights,
flags: Fdflags,
) -> Result<WasiFd, FsError> {
// TODO: check permissions here? probably not, but this should be
// an explicit choice, so justify it in a comment when we remove this one
let mut cur_inode = self.get_fd_inode(base).map_err(fs_error_from_wasi_err)?;
@@ -714,14 +728,14 @@ impl WasiFs {
pub fn open_file_at(
&mut self,
inodes: &mut WasiInodes,
base: __wasi_fd_t,
base: WasiFd,
file: Box<dyn VirtualFile + Send + Sync + 'static>,
open_flags: u16,
name: String,
rights: __wasi_rights_t,
rights_inheriting: __wasi_rights_t,
flags: __wasi_fdflags_t,
) -> Result<__wasi_fd_t, FsError> {
rights: Rights,
rights_inheriting: Rights,
flags: Fdflags,
) -> Result<WasiFd, FsError> {
// TODO: check permissions here? probably not, but this should be
// an explicit choice, so justify it in a comment when we remove this one
let base_inode = self.get_fd_inode(base).map_err(fs_error_from_wasi_err)?;
@@ -774,7 +788,7 @@ impl WasiFs {
pub fn swap_file(
&self,
inodes: &WasiInodes,
fd: __wasi_fd_t,
fd: WasiFd,
file: Box<dyn VirtualFile + Send + Sync + 'static>,
) -> Result<Option<Box<dyn VirtualFile + Send + Sync + 'static>>, FsError> {
let mut ret = Some(file);
@@ -811,8 +825,8 @@ impl WasiFs {
pub(crate) fn filestat_resync_size(
&self,
inodes: &WasiInodes,
fd: __wasi_fd_t,
) -> Result<__wasi_filesize_t, __wasi_errno_t> {
fd: WasiFd,
) -> Result<Filesize, Errno> {
let inode = self.get_fd_inode(fd)?;
let mut guard = inodes.arena[inode].write();
let deref_mut = guard.deref_mut();
@@ -823,13 +837,13 @@ impl WasiFs {
drop(guard);
inodes.arena[inode].stat.write().unwrap().st_size = new_size;
Ok(new_size as __wasi_filesize_t)
Ok(new_size as Filesize)
} else {
Err(__WASI_EBADF)
Err(Errno::Badf)
}
}
Kind::Dir { .. } | Kind::Root { .. } => Err(__WASI_EISDIR),
_ => Err(__WASI_EINVAL),
Kind::Dir { .. } | Kind::Root { .. } => Err(Errno::Isdir),
_ => Err(Errno::Inval),
}
}
@@ -843,17 +857,17 @@ impl WasiFs {
pub fn get_current_dir(
&self,
inodes: &mut WasiInodes,
base: __wasi_fd_t,
) -> Result<(Inode, String), __wasi_errno_t> {
base: WasiFd,
) -> Result<(Inode, String), Errno> {
self.get_current_dir_inner(inodes, base, 0)
}
pub(crate) fn get_current_dir_inner(
&self,
inodes: &mut WasiInodes,
base: __wasi_fd_t,
base: WasiFd,
symlink_count: u32,
) -> Result<(Inode, String), __wasi_errno_t> {
) -> Result<(Inode, String), Errno> {
let current_dir = {
let guard = self.current_dir.lock().unwrap();
guard.clone()
@@ -889,9 +903,9 @@ impl WasiFs {
path: &str,
mut symlink_count: u32,
follow_symlinks: bool,
) -> Result<Inode, __wasi_errno_t> {
) -> Result<Inode, Errno> {
if symlink_count > MAX_SYMLINKS {
return Err(__WASI_EMLINK);
return Err(Errno::Mlink);
}
let path: &Path = Path::new(path);
@@ -920,7 +934,7 @@ impl WasiFs {
cur_inode = *p;
continue 'path_iter;
} else {
return Err(__WASI_EACCES);
return Err(Errno::Access);
}
}
"." => continue 'path_iter,
@@ -942,7 +956,7 @@ impl WasiFs {
.fs_backing
.symlink_metadata(&file)
.ok()
.ok_or(__WASI_ENOENT)?;
.ok_or(Errno::Noent)?;
let file_type = metadata.file_type();
// we want to insert newly opened dirs and files, but not transient symlinks
// TODO: explain why (think about this deeply when well rested)
@@ -985,18 +999,17 @@ impl WasiFs {
#[cfg(unix)]
{
//use std::os::unix::fs::FileTypeExt;
let file_type: __wasi_filetype_t = if file_type.is_char_device()
{
__WASI_FILETYPE_CHARACTER_DEVICE
let file_type: Filetype = if file_type.is_char_device() {
Filetype::CharacterDevice
} else if file_type.is_block_device() {
__WASI_FILETYPE_BLOCK_DEVICE
Filetype::BlockDevice
} else if file_type.is_fifo() {
// FIFO doesn't seem to fit any other type, so unknown
__WASI_FILETYPE_UNKNOWN
Filetype::Unknown
} else if file_type.is_socket() {
// TODO: how do we know if it's a `__WASI_FILETYPE_SOCKET_STREAM` or
// a `__WASI_FILETYPE_SOCKET_DGRAM`?
__WASI_FILETYPE_SOCKET_STREAM
// TODO: how do we know if it's a `SocketStream` or
// a `SocketDgram`?
Filetype::SocketStream
} else {
unimplemented!("state::get_inode_at_path unknown file type: not file, directory, symlink, char device, block device, fifo, or socket");
};
@@ -1012,9 +1025,9 @@ impl WasiFs {
kind,
false,
file.to_string_lossy().to_string(),
__wasi_filestat_t {
Filestat {
st_filetype: file_type,
..__wasi_filestat_t::default()
..Filestat::default()
},
);
@@ -1080,14 +1093,14 @@ impl WasiFs {
{
cur_inode = *entry;
} else {
return Err(__WASI_ENOENT);
return Err(Errno::Noent);
}
}
Kind::File { .. }
| Kind::Socket { .. }
| Kind::Pipe { .. }
| Kind::EventNotifications { .. } => {
return Err(__WASI_ENOTDIR);
return Err(Errno::Notdir);
}
Kind::Symlink {
base_po_dir,
@@ -1151,11 +1164,11 @@ impl WasiFs {
&self,
inodes: &WasiInodes,
path: &'path Path,
) -> Result<(__wasi_fd_t, &'path Path), __wasi_errno_t> {
) -> Result<(WasiFd, &'path Path), Errno> {
enum BaseFdAndRelPath<'a> {
None,
BestMatch {
fd: __wasi_fd_t,
fd: WasiFd,
rel_path: &'a Path,
max_seen: usize,
},
@@ -1199,7 +1212,7 @@ impl WasiFs {
}
match res {
// this error may not make sense depending on where it's called
BaseFdAndRelPath::None => Err(__WASI_EINVAL),
BaseFdAndRelPath::None => Err(Errno::Inval),
BaseFdAndRelPath::BestMatch { fd, rel_path, .. } => Ok((fd, rel_path)),
}
}
@@ -1209,9 +1222,9 @@ impl WasiFs {
pub(crate) fn path_depth_from_fd(
&self,
inodes: &WasiInodes,
fd: __wasi_fd_t,
fd: WasiFd,
inode: Inode,
) -> Result<usize, __wasi_errno_t> {
) -> Result<usize, Errno> {
let mut counter = 0;
let base_inode = self.get_fd_inode(fd)?;
let mut cur_inode = inode;
@@ -1226,7 +1239,7 @@ impl WasiFs {
cur_inode = *p;
}
}
_ => return Err(__WASI_EINVAL),
_ => return Err(Errno::Inval),
}
}
@@ -1242,10 +1255,10 @@ impl WasiFs {
pub(crate) fn get_inode_at_path(
&self,
inodes: &mut WasiInodes,
base: __wasi_fd_t,
base: WasiFd,
path: &str,
follow_symlinks: bool,
) -> Result<Inode, __wasi_errno_t> {
) -> Result<Inode, Errno> {
let start_inode = if !path.starts_with('/') && self.is_wasix.load(Ordering::Acquire) {
let (cur_inode, _) = self.get_current_dir(inodes, base)?;
cur_inode
@@ -1261,15 +1274,15 @@ impl WasiFs {
pub(crate) fn get_parent_inode_at_path(
&self,
inodes: &mut WasiInodes,
base: __wasi_fd_t,
base: WasiFd,
path: &Path,
follow_symlinks: bool,
) -> Result<(Inode, String), __wasi_errno_t> {
) -> Result<(Inode, String), Errno> {
let mut parent_dir = std::path::PathBuf::new();
let mut components = path.components().rev();
let new_entity_name = components
.next()
.ok_or(__WASI_EINVAL)?
.ok_or(Errno::Inval)?
.as_os_str()
.to_string_lossy()
.to_string();
@@ -1280,70 +1293,59 @@ impl WasiFs {
.map(|v| (v, new_entity_name))
}
pub fn get_fd(&self, fd: __wasi_fd_t) -> Result<Fd, __wasi_errno_t> {
pub fn get_fd(&self, fd: WasiFd) -> Result<Fd, Errno> {
self.fd_map
.read()
.unwrap()
.get(&fd)
.ok_or(__WASI_EBADF)
.ok_or(Errno::Badf)
.map(|a| a.clone())
}
pub fn get_fd_inode(
&self,
fd: __wasi_fd_t,
) -> Result<generational_arena::Index, __wasi_errno_t> {
pub fn get_fd_inode(&self, fd: WasiFd) -> Result<generational_arena::Index, Errno> {
self.fd_map
.read()
.unwrap()
.get(&fd)
.ok_or(__WASI_EBADF)
.ok_or(Errno::Badf)
.map(|a| a.inode)
}
pub fn filestat_fd(
&self,
inodes: &WasiInodes,
fd: __wasi_fd_t,
) -> Result<__wasi_filestat_t, __wasi_errno_t> {
pub fn filestat_fd(&self, inodes: &WasiInodes, fd: WasiFd) -> Result<Filestat, Errno> {
let inode = self.get_fd_inode(fd)?;
Ok(*inodes.arena[inode].stat.read().unwrap().deref())
}
pub fn fdstat(
&self,
inodes: &WasiInodes,
fd: __wasi_fd_t,
) -> Result<__wasi_fdstat_t, __wasi_errno_t> {
pub fn fdstat(&self, inodes: &WasiInodes, fd: WasiFd) -> Result<Fdstat, Errno> {
match fd {
__WASI_STDIN_FILENO => {
return Ok(__wasi_fdstat_t {
fs_filetype: __WASI_FILETYPE_CHARACTER_DEVICE,
fs_flags: 0,
return Ok(Fdstat {
fs_filetype: Filetype::CharacterDevice,
fs_flags: Fdflags::empty(),
fs_rights_base: STDIN_DEFAULT_RIGHTS,
fs_rights_inheriting: 0,
fs_rights_inheriting: Rights::empty(),
})
}
__WASI_STDOUT_FILENO => {
return Ok(__wasi_fdstat_t {
fs_filetype: __WASI_FILETYPE_CHARACTER_DEVICE,
fs_flags: __WASI_FDFLAG_APPEND,
return Ok(Fdstat {
fs_filetype: Filetype::CharacterDevice,
fs_flags: Fdflags::APPEND,
fs_rights_base: STDOUT_DEFAULT_RIGHTS,
fs_rights_inheriting: 0,
fs_rights_inheriting: Rights::empty(),
})
}
__WASI_STDERR_FILENO => {
return Ok(__wasi_fdstat_t {
fs_filetype: __WASI_FILETYPE_CHARACTER_DEVICE,
fs_flags: __WASI_FDFLAG_APPEND,
return Ok(Fdstat {
fs_filetype: Filetype::CharacterDevice,
fs_flags: Fdflags::APPEND,
fs_rights_base: STDERR_DEFAULT_RIGHTS,
fs_rights_inheriting: 0,
fs_rights_inheriting: Rights::empty(),
})
}
VIRTUAL_ROOT_FD => {
return Ok(__wasi_fdstat_t {
fs_filetype: __WASI_FILETYPE_DIRECTORY,
fs_flags: 0,
return Ok(Fdstat {
fs_filetype: Filetype::Directory,
fs_flags: Fdflags::empty(),
// TODO: fix this
fs_rights_base: ALL_RIGHTS,
fs_rights_inheriting: ALL_RIGHTS,
@@ -1356,12 +1358,12 @@ impl WasiFs {
let guard = inodes.arena[fd.inode].read();
let deref = guard.deref();
Ok(__wasi_fdstat_t {
Ok(Fdstat {
fs_filetype: match deref {
Kind::File { .. } => __WASI_FILETYPE_REGULAR_FILE,
Kind::Dir { .. } => __WASI_FILETYPE_DIRECTORY,
Kind::Symlink { .. } => __WASI_FILETYPE_SYMBOLIC_LINK,
_ => __WASI_FILETYPE_UNKNOWN,
Kind::File { .. } => Filetype::RegularFile,
Kind::Dir { .. } => Filetype::Directory,
Kind::Symlink { .. } => Filetype::SymbolicLink,
_ => Filetype::Unknown,
},
fs_flags: fd.flags,
fs_rights_base: fd.rights,
@@ -1369,11 +1371,7 @@ impl WasiFs {
})
}
pub fn prestat_fd(
&self,
inodes: &WasiInodes,
fd: __wasi_fd_t,
) -> Result<__wasi_prestat_t, __wasi_errno_t> {
pub fn prestat_fd(&self, inodes: &WasiInodes, fd: WasiFd) -> Result<Prestat, Errno> {
let inode = self.get_fd_inode(fd)?;
trace!("in prestat_fd {:?}", self.get_fd(fd)?);
@@ -1382,13 +1380,13 @@ impl WasiFs {
if inode_val.is_preopened {
Ok(self.prestat_fd_inner(inode_val))
} else {
Err(__WASI_EBADF)
Err(Errno::Badf)
}
}
pub(crate) fn prestat_fd_inner(&self, inode_val: &InodeVal) -> __wasi_prestat_t {
__wasi_prestat_t {
pr_type: __WASI_PREOPENTYPE_DIR,
pub(crate) fn prestat_fd_inner(&self, inode_val: &InodeVal) -> Prestat {
Prestat {
pr_type: Preopentype::Dir,
u: PrestatEnum::Dir {
// REVIEW:
pr_name_len: inode_val.name.len() as u32 + 1,
@@ -1397,7 +1395,7 @@ impl WasiFs {
}
}
pub fn flush(&self, inodes: &WasiInodes, fd: __wasi_fd_t) -> Result<(), __wasi_errno_t> {
pub fn flush(&self, inodes: &WasiInodes, fd: WasiFd) -> Result<(), Errno> {
match fd {
__WASI_STDIN_FILENO => (),
__WASI_STDOUT_FILENO => inodes
@@ -1405,17 +1403,17 @@ impl WasiFs {
.map_err(fs_error_into_wasi_err)?
.as_mut()
.map(|f| f.flush().map_err(map_io_err))
.unwrap_or_else(|| Err(__WASI_EIO))?,
.unwrap_or_else(|| Err(Errno::Io))?,
__WASI_STDERR_FILENO => inodes
.stderr_mut(&self.fd_map)
.map_err(fs_error_into_wasi_err)?
.as_mut()
.and_then(|f| f.flush().ok())
.ok_or(__WASI_EIO)?,
.ok_or(Errno::Io)?,
_ => {
let fd = self.get_fd(fd)?;
if fd.rights & __WASI_RIGHT_FD_DATASYNC == 0 {
return Err(__WASI_EACCES);
if !fd.rights.contains(Rights::FD_DATASYNC) {
return Err(Errno::Access);
}
let mut guard = inodes.arena[fd.inode].write();
@@ -1423,12 +1421,12 @@ impl WasiFs {
match deref_mut {
Kind::File {
handle: Some(file), ..
} => file.flush().map_err(|_| __WASI_EIO)?,
} => file.flush().map_err(|_| Errno::Io)?,
// TODO: verify this behavior
Kind::Dir { .. } => return Err(__WASI_EISDIR),
Kind::Dir { .. } => return Err(Errno::Isdir),
Kind::Symlink { .. } => unimplemented!("WasiFs::flush Kind::Symlink"),
Kind::Buffer { .. } => (),
_ => return Err(__WASI_EIO),
_ => return Err(Errno::Io),
}
}
}
@@ -1442,7 +1440,7 @@ impl WasiFs {
kind: Kind,
is_preopened: bool,
name: String,
) -> Result<Inode, __wasi_errno_t> {
) -> Result<Inode, Errno> {
let stat = self.get_stat_for_kind(inodes, &kind)?;
Ok(self.create_inode_with_stat(inodes, kind, is_preopened, name, stat))
}
@@ -1455,7 +1453,7 @@ impl WasiFs {
is_preopened: bool,
name: String,
) -> Inode {
let stat = __wasi_filestat_t::default();
let stat = Filestat::default();
self.create_inode_with_stat(inodes, kind, is_preopened, name, stat)
}
@@ -1466,7 +1464,7 @@ impl WasiFs {
kind: Kind,
is_preopened: bool,
name: String,
mut stat: __wasi_filestat_t,
mut stat: Filestat,
) -> Inode {
stat.st_ino = self.get_next_inode_index();
@@ -1480,12 +1478,12 @@ impl WasiFs {
pub fn create_fd(
&self,
rights: __wasi_rights_t,
rights_inheriting: __wasi_rights_t,
flags: __wasi_fdflags_t,
rights: Rights,
rights_inheriting: Rights,
flags: Fdflags,
open_flags: u16,
inode: Inode,
) -> Result<__wasi_fd_t, __wasi_errno_t> {
) -> Result<WasiFd, Errno> {
let idx = self.next_fd.fetch_add(1, Ordering::AcqRel);
self.fd_map.write().unwrap().insert(
idx,
@@ -1501,7 +1499,7 @@ impl WasiFs {
Ok(idx)
}
pub fn clone_fd(&self, fd: __wasi_fd_t) -> Result<__wasi_fd_t, __wasi_errno_t> {
pub fn clone_fd(&self, fd: WasiFd) -> Result<WasiFd, Errno> {
let fd = self.get_fd(fd)?;
let idx = self.next_fd.fetch_add(1, Ordering::AcqRel);
self.fd_map.write().unwrap().insert(
@@ -1531,10 +1529,10 @@ impl WasiFs {
}
fn create_virtual_root(&self, inodes: &mut WasiInodes) -> Inode {
let stat = __wasi_filestat_t {
st_filetype: __WASI_FILETYPE_DIRECTORY,
let stat = Filestat {
st_filetype: Filetype::Directory,
st_ino: self.get_next_inode_index(),
..__wasi_filestat_t::default()
..Filestat::default()
};
let root_kind = Kind::Root {
entries: HashMap::new(),
@@ -1555,7 +1553,7 @@ impl WasiFs {
"stdout",
__WASI_STDOUT_FILENO,
STDOUT_DEFAULT_RIGHTS,
__WASI_FDFLAG_APPEND,
Fdflags::APPEND,
);
}
fn create_stdin(&self, inodes: &mut WasiInodes) {
@@ -1565,7 +1563,7 @@ impl WasiFs {
"stdin",
__WASI_STDIN_FILENO,
STDIN_DEFAULT_RIGHTS,
0,
Fdflags::empty(),
);
}
fn create_stderr(&self, inodes: &mut WasiInodes) {
@@ -1575,7 +1573,7 @@ impl WasiFs {
"stderr",
__WASI_STDERR_FILENO,
STDERR_DEFAULT_RIGHTS,
__WASI_FDFLAG_APPEND,
Fdflags::APPEND,
);
}
@@ -1584,14 +1582,14 @@ impl WasiFs {
inodes: &mut WasiInodes,
handle: Box<dyn VirtualFile + Send + Sync + 'static>,
name: &'static str,
raw_fd: __wasi_fd_t,
rights: __wasi_rights_t,
fd_flags: __wasi_fdflags_t,
raw_fd: WasiFd,
rights: Rights,
fd_flags: Fdflags,
) {
let stat = __wasi_filestat_t {
st_filetype: __WASI_FILETYPE_CHARACTER_DEVICE,
let stat = Filestat {
st_filetype: Filetype::CharacterDevice,
st_ino: self.get_next_inode_index(),
..__wasi_filestat_t::default()
..Filestat::default()
};
let kind = Kind::File {
fd: Some(raw_fd),
@@ -1610,7 +1608,7 @@ impl WasiFs {
raw_fd,
Fd {
rights,
rights_inheriting: 0,
rights_inheriting: Rights::empty(),
flags: fd_flags,
// since we're not calling open on this, we don't need open flags
open_flags: 0,
@@ -1620,22 +1618,18 @@ impl WasiFs {
);
}
pub fn get_stat_for_kind(
&self,
inodes: &WasiInodes,
kind: &Kind,
) -> Result<__wasi_filestat_t, __wasi_errno_t> {
pub fn get_stat_for_kind(&self, inodes: &WasiInodes, kind: &Kind) -> Result<Filestat, Errno> {
let md = match kind {
Kind::File { handle, path, .. } => match handle {
Some(wf) => {
return Ok(__wasi_filestat_t {
st_filetype: __WASI_FILETYPE_REGULAR_FILE,
return Ok(Filestat {
st_filetype: Filetype::RegularFile,
st_size: wf.size(),
st_atim: wf.last_accessed(),
st_mtim: wf.last_modified(),
st_ctim: wf.created_time(),
..__wasi_filestat_t::default()
..Filestat::default()
})
}
None => self
@@ -1675,24 +1669,20 @@ impl WasiFs {
_ => unreachable!("Symlink pointing to something that's not a directory as its base preopened directory"),
}
}
_ => return Err(__WASI_EIO),
_ => return Err(Errno::Io),
};
Ok(__wasi_filestat_t {
Ok(Filestat {
st_filetype: virtual_file_type_to_wasi_file_type(md.file_type()),
st_size: md.len(),
st_atim: md.accessed(),
st_mtim: md.modified(),
st_ctim: md.created(),
..__wasi_filestat_t::default()
..Filestat::default()
})
}
/// Closes an open FD, handling all details such as FD being preopen
pub(crate) fn close_fd(
&self,
inodes: &WasiInodes,
fd: __wasi_fd_t,
) -> Result<(), __wasi_errno_t> {
pub(crate) fn close_fd(&self, inodes: &WasiInodes, fd: WasiFd) -> Result<(), Errno> {
let inode = self.get_fd_inode(fd)?;
let inodeval = inodes.get_inodeval(inode)?;
let is_preopened = inodeval.is_preopened;
@@ -1715,7 +1705,7 @@ impl WasiFs {
debug!("Closing dir {:?}", &path);
let key = path
.file_name()
.ok_or(__WASI_EINVAL)?
.ok_or(Errno::Inval)?
.to_string_lossy()
.to_string();
if let Some(p) = *parent {
@@ -1753,12 +1743,12 @@ impl WasiFs {
} else {
// this shouldn't be possible anymore due to Root
debug!("HIT UNREACHABLE CODE! Non-root directory does not have a parent");
return Err(__WASI_EINVAL);
return Err(Errno::Inval);
}
}
Kind::EventNotifications { .. } => {}
Kind::Root { .. } => return Err(__WASI_EACCES),
Kind::Symlink { .. } | Kind::Buffer { .. } => return Err(__WASI_EINVAL),
Kind::Root { .. } => return Err(Errno::Access),
Kind::Symlink { .. } | Kind::Buffer { .. } => return Err(Errno::Inval),
}
Ok(())
@@ -1770,21 +1760,21 @@ impl WasiState {
pub(crate) fn fs_read_dir<P: AsRef<Path>>(
&self,
path: P,
) -> Result<wasmer_vfs::ReadDir, __wasi_errno_t> {
) -> Result<wasmer_vfs::ReadDir, Errno> {
self.fs
.fs_backing
.read_dir(path.as_ref())
.map_err(fs_error_into_wasi_err)
}
pub(crate) fn fs_create_dir<P: AsRef<Path>>(&self, path: P) -> Result<(), __wasi_errno_t> {
pub(crate) fn fs_create_dir<P: AsRef<Path>>(&self, path: P) -> Result<(), Errno> {
self.fs
.fs_backing
.create_dir(path.as_ref())
.map_err(fs_error_into_wasi_err)
}
pub(crate) fn fs_remove_dir<P: AsRef<Path>>(&self, path: P) -> Result<(), __wasi_errno_t> {
pub(crate) fn fs_remove_dir<P: AsRef<Path>>(&self, path: P) -> Result<(), Errno> {
self.fs
.fs_backing
.remove_dir(path.as_ref())
@@ -1795,14 +1785,14 @@ impl WasiState {
&self,
from: P,
to: Q,
) -> Result<(), __wasi_errno_t> {
) -> Result<(), Errno> {
self.fs
.fs_backing
.rename(from.as_ref(), to.as_ref())
.map_err(fs_error_into_wasi_err)
}
pub(crate) fn fs_remove_file<P: AsRef<Path>>(&self, path: P) -> Result<(), __wasi_errno_t> {
pub(crate) fn fs_remove_file<P: AsRef<Path>>(&self, path: P) -> Result<(), Errno> {
self.fs
.fs_backing
.remove_file(path.as_ref())
@@ -1938,7 +1928,7 @@ impl WasiState {
/// Expects one of `__WASI_STDIN_FILENO`, `__WASI_STDOUT_FILENO`, `__WASI_STDERR_FILENO`.
fn std_dev_get(
&self,
fd: __wasi_fd_t,
fd: WasiFd,
) -> Result<Option<Box<dyn VirtualFile + Send + Sync + 'static>>, FsError> {
let ret = WasiStateFileGuard::new(self, fd)?.map(|a| {
let ret = Box::new(a);
@@ -1949,15 +1939,15 @@ impl WasiState {
}
}
pub fn virtual_file_type_to_wasi_file_type(file_type: wasmer_vfs::FileType) -> __wasi_filetype_t {
pub fn virtual_file_type_to_wasi_file_type(file_type: wasmer_vfs::FileType) -> Filetype {
// TODO: handle other file types
if file_type.is_dir() {
__WASI_FILETYPE_DIRECTORY
Filetype::Directory
} else if file_type.is_file() {
__WASI_FILETYPE_REGULAR_FILE
Filetype::RegularFile
} else if file_type.is_symlink() {
__WASI_FILETYPE_SYMBOLIC_LINK
Filetype::SymbolicLink
} else {
__WASI_FILETYPE_UNKNOWN
Filetype::Unknown
}
}

View File

@@ -8,6 +8,7 @@ use std::sync::mpsc;
use std::sync::Mutex;
use wasmer::WasmSlice;
use wasmer::{MemorySize, MemoryView};
use wasmer_wasi_types::wasi::Errno;
#[derive(Debug)]
pub struct WasiPipe {
@@ -43,7 +44,7 @@ impl WasiPipe {
&mut self,
memory: &MemoryView,
iov: WasmSlice<__wasi_iovec_t<M>>,
) -> Result<usize, __wasi_errno_t> {
) -> Result<usize, Errno> {
loop {
if let Some(buf) = self.read_buffer.as_mut() {
let buf_len = buf.len();
@@ -55,7 +56,7 @@ impl WasiPipe {
}
}
let rx = self.rx.lock().unwrap();
let data = rx.recv().map_err(|_| __WASI_EIO)?;
let data = rx.recv().map_err(|_| Errno::Io)?;
self.read_buffer.replace(Bytes::from(data));
}
}
@@ -64,17 +65,17 @@ impl WasiPipe {
&mut self,
memory: &MemoryView,
iov: WasmSlice<__wasi_ciovec_t<M>>,
) -> Result<usize, __wasi_errno_t> {
) -> Result<usize, Errno> {
let buf_len: M::Offset = iov
.iter()
.filter_map(|a| a.read().ok())
.map(|a| a.buf_len)
.sum();
let buf_len: usize = buf_len.try_into().map_err(|_| __WASI_EINVAL)?;
let buf_len: usize = buf_len.try_into().map_err(|_| Errno::Inval)?;
let mut buf = Vec::with_capacity(buf_len);
write_bytes(&mut buf, memory, iov)?;
let tx = self.tx.lock().unwrap();
tx.send(buf).map_err(|_| __WASI_EIO)?;
tx.send(buf).map_err(|_| Errno::Io)?;
Ok(buf_len)
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,4 @@
/// types for use in the WASI filesystem
use crate::syscalls::types::*;
#[cfg(feature = "enable-serde")]
use serde::{Deserialize, Serialize};
#[cfg(all(unix, feature = "sys-poll"))]
@@ -11,6 +10,7 @@ use std::{
time::Duration,
};
use wasmer_vbus::BusError;
use wasmer_wasi_types::wasi::{BusErrno, Errno};
#[cfg(feature = "host-fs")]
pub use wasmer_vfs::host_fs::{Stderr, Stdin, Stdout};
@@ -20,135 +20,136 @@ pub use wasmer_vfs::mem_fs::{Stderr, Stdin, Stdout};
use wasmer_vfs::{FsError, VirtualFile};
use wasmer_vnet::NetworkError;
pub fn fs_error_from_wasi_err(err: __wasi_errno_t) -> FsError {
pub fn fs_error_from_wasi_err(err: Errno) -> FsError {
match err {
__WASI_EBADF => FsError::InvalidFd,
__WASI_EEXIST => FsError::AlreadyExists,
__WASI_EIO => FsError::IOError,
__WASI_EADDRINUSE => FsError::AddressInUse,
__WASI_EADDRNOTAVAIL => FsError::AddressNotAvailable,
__WASI_EPIPE => FsError::BrokenPipe,
__WASI_ECONNABORTED => FsError::ConnectionAborted,
__WASI_ECONNREFUSED => FsError::ConnectionRefused,
__WASI_ECONNRESET => FsError::ConnectionReset,
__WASI_EINTR => FsError::Interrupted,
__WASI_EINVAL => FsError::InvalidInput,
__WASI_ENOTCONN => FsError::NotConnected,
__WASI_ENODEV => FsError::NoDevice,
__WASI_ENOENT => FsError::EntityNotFound,
__WASI_EPERM => FsError::PermissionDenied,
__WASI_ETIMEDOUT => FsError::TimedOut,
__WASI_EPROTO => FsError::UnexpectedEof,
__WASI_EAGAIN => FsError::WouldBlock,
__WASI_ENOSPC => FsError::WriteZero,
__WASI_ENOTEMPTY => FsError::DirectoryNotEmpty,
Errno::Badf => FsError::InvalidFd,
Errno::Exist => FsError::AlreadyExists,
Errno::Io => FsError::IOError,
Errno::Addrinuse => FsError::AddressInUse,
Errno::Addrnotavail => FsError::AddressNotAvailable,
Errno::Pipe => FsError::BrokenPipe,
Errno::Connaborted => FsError::ConnectionAborted,
Errno::Connrefused => FsError::ConnectionRefused,
Errno::Connreset => FsError::ConnectionReset,
Errno::Intr => FsError::Interrupted,
Errno::Inval => FsError::InvalidInput,
Errno::Notconn => FsError::NotConnected,
Errno::Nodev => FsError::NoDevice,
Errno::Noent => FsError::EntityNotFound,
Errno::Perm => FsError::PermissionDenied,
Errno::Timedout => FsError::TimedOut,
Errno::Proto => FsError::UnexpectedEof,
Errno::Again => FsError::WouldBlock,
Errno::Nospc => FsError::WriteZero,
Errno::Notempty => FsError::DirectoryNotEmpty,
_ => FsError::UnknownError,
}
}
pub fn fs_error_into_wasi_err(fs_error: FsError) -> __wasi_errno_t {
pub fn fs_error_into_wasi_err(fs_error: FsError) -> Errno {
match fs_error {
FsError::AlreadyExists => __WASI_EEXIST,
FsError::AddressInUse => __WASI_EADDRINUSE,
FsError::AddressNotAvailable => __WASI_EADDRNOTAVAIL,
FsError::BaseNotDirectory => __WASI_ENOTDIR,
FsError::BrokenPipe => __WASI_EPIPE,
FsError::ConnectionAborted => __WASI_ECONNABORTED,
FsError::ConnectionRefused => __WASI_ECONNREFUSED,
FsError::ConnectionReset => __WASI_ECONNRESET,
FsError::Interrupted => __WASI_EINTR,
FsError::InvalidData => __WASI_EIO,
FsError::InvalidFd => __WASI_EBADF,
FsError::InvalidInput => __WASI_EINVAL,
FsError::IOError => __WASI_EIO,
FsError::NoDevice => __WASI_ENODEV,
FsError::NotAFile => __WASI_EINVAL,
FsError::NotConnected => __WASI_ENOTCONN,
FsError::EntityNotFound => __WASI_ENOENT,
FsError::PermissionDenied => __WASI_EPERM,
FsError::TimedOut => __WASI_ETIMEDOUT,
FsError::UnexpectedEof => __WASI_EPROTO,
FsError::WouldBlock => __WASI_EAGAIN,
FsError::WriteZero => __WASI_ENOSPC,
FsError::DirectoryNotEmpty => __WASI_ENOTEMPTY,
FsError::Lock | FsError::UnknownError => __WASI_EIO,
FsError::AlreadyExists => Errno::Exist,
FsError::AddressInUse => Errno::Addrinuse,
FsError::AddressNotAvailable => Errno::Addrnotavail,
FsError::BaseNotDirectory => Errno::Notdir,
FsError::BrokenPipe => Errno::Pipe,
FsError::ConnectionAborted => Errno::Connaborted,
FsError::ConnectionRefused => Errno::Connrefused,
FsError::ConnectionReset => Errno::Connreset,
FsError::Interrupted => Errno::Intr,
FsError::InvalidData => Errno::Io,
FsError::InvalidFd => Errno::Badf,
FsError::InvalidInput => Errno::Inval,
FsError::IOError => Errno::Io,
FsError::NoDevice => Errno::Nodev,
FsError::NotAFile => Errno::Inval,
FsError::NotConnected => Errno::Notconn,
FsError::EntityNotFound => Errno::Noent,
FsError::PermissionDenied => Errno::Perm,
FsError::TimedOut => Errno::Timedout,
FsError::UnexpectedEof => Errno::Proto,
FsError::WouldBlock => Errno::Again,
FsError::WriteZero => Errno::Nospc,
FsError::DirectoryNotEmpty => Errno::Notempty,
FsError::Lock | FsError::UnknownError => Errno::Io,
}
}
pub fn net_error_into_wasi_err(net_error: NetworkError) -> __wasi_errno_t {
pub fn net_error_into_wasi_err(net_error: NetworkError) -> Errno {
match net_error {
NetworkError::InvalidFd => __WASI_EBADF,
NetworkError::AlreadyExists => __WASI_EEXIST,
NetworkError::Lock => __WASI_EIO,
NetworkError::IOError => __WASI_EIO,
NetworkError::AddressInUse => __WASI_EADDRINUSE,
NetworkError::AddressNotAvailable => __WASI_EADDRNOTAVAIL,
NetworkError::BrokenPipe => __WASI_EPIPE,
NetworkError::ConnectionAborted => __WASI_ECONNABORTED,
NetworkError::ConnectionRefused => __WASI_ECONNREFUSED,
NetworkError::ConnectionReset => __WASI_ECONNRESET,
NetworkError::Interrupted => __WASI_EINTR,
NetworkError::InvalidData => __WASI_EIO,
NetworkError::InvalidInput => __WASI_EINVAL,
NetworkError::NotConnected => __WASI_ENOTCONN,
NetworkError::NoDevice => __WASI_ENODEV,
NetworkError::PermissionDenied => __WASI_EPERM,
NetworkError::TimedOut => __WASI_ETIMEDOUT,
NetworkError::UnexpectedEof => __WASI_EPROTO,
NetworkError::WouldBlock => __WASI_EAGAIN,
NetworkError::WriteZero => __WASI_ENOSPC,
NetworkError::Unsupported => __WASI_ENOTSUP,
NetworkError::UnknownError => __WASI_EIO,
NetworkError::InvalidFd => Errno::Badf,
NetworkError::AlreadyExists => Errno::Exist,
NetworkError::Lock => Errno::Io,
NetworkError::IOError => Errno::Io,
NetworkError::AddressInUse => Errno::Addrinuse,
NetworkError::AddressNotAvailable => Errno::Addrnotavail,
NetworkError::BrokenPipe => Errno::Pipe,
NetworkError::ConnectionAborted => Errno::Connaborted,
NetworkError::ConnectionRefused => Errno::Connrefused,
NetworkError::ConnectionReset => Errno::Connreset,
NetworkError::Interrupted => Errno::Intr,
NetworkError::InvalidData => Errno::Io,
NetworkError::InvalidInput => Errno::Inval,
NetworkError::NotConnected => Errno::Notconn,
NetworkError::NoDevice => Errno::Nodev,
NetworkError::PermissionDenied => Errno::Perm,
NetworkError::TimedOut => Errno::Timedout,
NetworkError::UnexpectedEof => Errno::Proto,
NetworkError::WouldBlock => Errno::Again,
NetworkError::WriteZero => Errno::Nospc,
NetworkError::Unsupported => Errno::Notsup,
NetworkError::UnknownError => Errno::Io,
}
}
pub fn bus_error_into_wasi_err(bus_error: BusError) -> __bus_errno_t {
pub fn bus_error_into_wasi_err(bus_error: BusError) -> BusErrno {
use BusError::*;
match bus_error {
Serialization => __BUS_ESER,
Deserialization => __BUS_EDES,
InvalidWapm => __BUS_EWAPM,
FetchFailed => __BUS_EFETCH,
CompileError => __BUS_ECOMPILE,
InvalidABI => __BUS_EABI,
Aborted => __BUS_EABORTED,
BadHandle => __BUS_EBADHANDLE,
InvalidTopic => __BUS_ETOPIC,
BadCallback => __BUS_EBADCB,
Unsupported => __BUS_EUNSUPPORTED,
BadRequest => __BUS_EBADREQUEST,
AccessDenied => __BUS_EDENIED,
InternalError => __BUS_EINTERNAL,
MemoryAllocationFailed => __BUS_EALLOC,
InvokeFailed => __BUS_EINVOKE,
AlreadyConsumed => __BUS_ECONSUMED,
MemoryAccessViolation => __BUS_EMEMVIOLATION,
UnknownError => __BUS_EUNKNOWN,
Serialization => BusErrno::Ser,
Deserialization => BusErrno::Des,
InvalidWapm => BusErrno::Wapm,
FetchFailed => BusErrno::Fetch,
CompileError => BusErrno::Compile,
InvalidABI => BusErrno::Abi,
Aborted => BusErrno::Aborted,
BadHandle => BusErrno::Badhandle,
InvalidTopic => BusErrno::Topic,
BadCallback => BusErrno::Badcb,
Unsupported => BusErrno::Unsupported,
BadRequest => BusErrno::Badrequest,
AccessDenied => BusErrno::Denied,
InternalError => BusErrno::Internal,
MemoryAllocationFailed => BusErrno::Alloc,
InvokeFailed => BusErrno::Invoke,
AlreadyConsumed => BusErrno::Consumed,
MemoryAccessViolation => BusErrno::Memviolation,
UnknownError => BusErrno::Unknown,
}
}
pub fn wasi_error_into_bus_err(bus_error: __bus_errno_t) -> BusError {
pub fn wasi_error_into_bus_err(bus_error: BusErrno) -> BusError {
use BusError::*;
match bus_error {
__BUS_ESER => Serialization,
__BUS_EDES => Deserialization,
__BUS_EWAPM => InvalidWapm,
__BUS_EFETCH => FetchFailed,
__BUS_ECOMPILE => CompileError,
__BUS_EABI => InvalidABI,
__BUS_EABORTED => Aborted,
__BUS_EBADHANDLE => BadHandle,
__BUS_ETOPIC => InvalidTopic,
__BUS_EBADCB => BadCallback,
__BUS_EUNSUPPORTED => Unsupported,
__BUS_EBADREQUEST => BadRequest,
__BUS_EDENIED => AccessDenied,
__BUS_EINTERNAL => InternalError,
__BUS_EALLOC => MemoryAllocationFailed,
__BUS_EINVOKE => InvokeFailed,
__BUS_ECONSUMED => AlreadyConsumed,
__BUS_EMEMVIOLATION => MemoryAccessViolation,
/*__BUS_EUNKNOWN |*/ _ => UnknownError,
BusErrno::Success => UnknownError,
BusErrno::Ser => Serialization,
BusErrno::Des => Deserialization,
BusErrno::Wapm => InvalidWapm,
BusErrno::Fetch => FetchFailed,
BusErrno::Compile => CompileError,
BusErrno::Abi => InvalidABI,
BusErrno::Aborted => Aborted,
BusErrno::Badhandle => BadHandle,
BusErrno::Topic => InvalidTopic,
BusErrno::Badcb => BadCallback,
BusErrno::Unsupported => Unsupported,
BusErrno::Badrequest => BadRequest,
BusErrno::Denied => AccessDenied,
BusErrno::Internal => InternalError,
BusErrno::Alloc => MemoryAllocationFailed,
BusErrno::Invoke => InvokeFailed,
BusErrno::Consumed => AlreadyConsumed,
BusErrno::Memviolation => MemoryAccessViolation,
BusErrno::Unknown => UnknownError,
}
}
@@ -452,8 +453,8 @@ impl VirtualFile for Pipe {
/*
TODO: Think about using this
trait WasiFdBacking: std::fmt::Debug {
fn get_stat(&self) -> &__wasi_filestat_t;
fn get_stat_mut(&mut self) -> &mut __wasi_filestat_t;
fn get_stat(&self) -> &Filestat;
fn get_stat_mut(&mut self) -> &mut Filestat;
fn is_preopened(&self) -> bool;
fn get_name(&self) -> &str;
}

View File

@@ -1,7 +1,11 @@
use crate::syscalls;
use crate::syscalls::types::{self, snapshot0};
use crate::syscalls::types;
use crate::{mem_error_to_wasi, Memory32, MemorySize, WasiEnv, WasiError, WasiThread};
use wasmer::{AsStoreMut, FunctionEnvMut, WasmPtr};
use wasmer_wasi_types::wasi::{
Errno, Event, Fd, Filesize, Filestat, Filetype, Snapshot0Filestat, Snapshot0Subscription,
Snapshot0Whence, Subscription, Whence,
};
/// Wrapper around `syscalls::fd_filestat_get` with extra logic to handle the size
/// difference of `wasi_filestat_t`
@@ -11,19 +15,20 @@ use wasmer::{AsStoreMut, FunctionEnvMut, WasmPtr};
/// that syscall, then it may break.
pub fn fd_filestat_get(
mut ctx: FunctionEnvMut<WasiEnv>,
fd: types::__wasi_fd_t,
buf: WasmPtr<snapshot0::__wasi_filestat_t, Memory32>,
) -> types::__wasi_errno_t {
fd: Fd,
buf: WasmPtr<Snapshot0Filestat, Memory32>,
) -> Errno {
let env = ctx.data();
let memory = env.memory_view(&ctx);
// TODO: understand what's happening inside this function, then do the correct thing
// transmute the WasmPtr<T1> into a WasmPtr<T2> where T2 > T1, this will read extra memory.
// The edge case of this cenv.mausing an OOB is not handled, if the new field is OOB, then the entire
// memory access will fail.
let new_buf: WasmPtr<types::__wasi_filestat_t, Memory32> = buf.cast();
let new_buf: WasmPtr<Filestat, Memory32> = buf.cast();
// Copy the data including the extra data
let new_filestat_setup: types::__wasi_filestat_t = wasi_try_mem!(new_buf.read(&memory));
let new_filestat_setup: Filestat = wasi_try_mem!(new_buf.read(&memory));
// Set up complete, make the call with the pointer that will write to the
// struct and some unrelated memory after the struct.
@@ -36,7 +41,7 @@ pub fn fd_filestat_get(
// get the values written to memory
let new_filestat = wasi_try_mem!(new_buf.deref(&memory).read());
// translate the new struct into the old struct in host memory
let old_stat = snapshot0::__wasi_filestat_t {
let old_stat = Snapshot0Filestat {
st_dev: new_filestat.st_dev,
st_ino: new_filestat.st_ino,
st_filetype: new_filestat.st_filetype,
@@ -62,18 +67,20 @@ pub fn fd_filestat_get(
/// difference of `wasi_filestat_t`
pub fn path_filestat_get(
mut ctx: FunctionEnvMut<WasiEnv>,
fd: types::__wasi_fd_t,
flags: types::__wasi_lookupflags_t,
fd: Fd,
flags: types::LookupFlags,
path: WasmPtr<u8, Memory32>,
path_len: u32,
buf: WasmPtr<snapshot0::__wasi_filestat_t, Memory32>,
) -> types::__wasi_errno_t {
buf: WasmPtr<Snapshot0Filestat, Memory32>,
) -> Errno {
// TODO: understand what's happening inside this function, then do the correct thing
// see `fd_filestat_get` in this file for an explanation of this strange behavior
let env = ctx.data();
let memory = env.memory_view(&ctx);
let new_buf: WasmPtr<types::__wasi_filestat_t, Memory32> = buf.cast();
let new_filestat_setup: types::__wasi_filestat_t = wasi_try_mem!(new_buf.read(&memory));
let new_buf: WasmPtr<Filestat, Memory32> = buf.cast();
let new_filestat_setup: Filestat = wasi_try_mem!(new_buf.read(&memory));
let result =
syscalls::path_filestat_get::<Memory32>(ctx.as_mut(), fd, flags, path, path_len, new_buf);
@@ -82,7 +89,7 @@ pub fn path_filestat_get(
let env = ctx.data();
let memory = env.memory_view(&ctx);
let new_filestat = wasi_try_mem!(new_buf.deref(&memory).read());
let old_stat = snapshot0::__wasi_filestat_t {
let old_stat = Snapshot0Filestat {
st_dev: new_filestat.st_dev,
st_ino: new_filestat.st_ino,
st_filetype: new_filestat.st_filetype,
@@ -100,20 +107,18 @@ pub fn path_filestat_get(
}
/// Wrapper around `syscalls::fd_seek` with extra logic to remap the values
/// of `__wasi_whence_t`
/// of `Whence`
pub fn fd_seek(
ctx: FunctionEnvMut<WasiEnv>,
fd: types::__wasi_fd_t,
offset: types::__wasi_filedelta_t,
whence: snapshot0::__wasi_whence_t,
newoffset: WasmPtr<types::__wasi_filesize_t, Memory32>,
) -> Result<types::__wasi_errno_t, WasiError> {
fd: Fd,
offset: types::FileDelta,
whence: Snapshot0Whence,
newoffset: WasmPtr<Filesize, Memory32>,
) -> Result<Errno, WasiError> {
let new_whence = match whence {
snapshot0::__WASI_WHENCE_CUR => types::__WASI_WHENCE_CUR,
snapshot0::__WASI_WHENCE_END => types::__WASI_WHENCE_END,
snapshot0::__WASI_WHENCE_SET => types::__WASI_WHENCE_SET,
// if it's invalid, let the new fd_seek handle it
_ => whence,
Snapshot0Whence::Cur => Whence::Cur,
Snapshot0Whence::End => Whence::End,
Snapshot0Whence::Set => Whence::Set,
};
syscalls::fd_seek::<Memory32>(ctx, fd, offset, new_whence, newoffset)
}
@@ -122,11 +127,12 @@ pub fn fd_seek(
/// userdata field back
pub fn poll_oneoff(
mut ctx: FunctionEnvMut<WasiEnv>,
in_: WasmPtr<snapshot0::__wasi_subscription_t, Memory32>,
out_: WasmPtr<types::__wasi_event_t, Memory32>,
in_: WasmPtr<Snapshot0Subscription, Memory32>,
out_: WasmPtr<Event, Memory32>,
nsubscriptions: u32,
nevents: WasmPtr<u32, Memory32>,
) -> Result<types::__wasi_errno_t, WasiError> {
) -> Result<Errno, WasiError> {
// TODO: verify that the assumptions in the comment here still applyd
// in this case the new type is smaller than the old type, so it all fits into memory,
// we just need to readjust and copy it
@@ -138,31 +144,14 @@ pub fn poll_oneoff(
let in_origs = wasi_try_mem_ok!(in_origs.read_to_vec());
// get a pointer to the smaller new type
let in_new_type_ptr: WasmPtr<types::__wasi_subscription_t, Memory32> = in_.cast();
let in_new_type_ptr: WasmPtr<Subscription, Memory32> = in_.cast();
for (in_sub_new, orig) in
wasi_try_mem_ok!(in_new_type_ptr.slice(&memory, nsubscriptions_offset))
.iter()
.zip(in_origs.iter())
{
wasi_try_mem_ok!(in_sub_new.write(types::__wasi_subscription_t {
userdata: orig.userdata,
type_: orig.type_,
u: if orig.type_ == types::__WASI_EVENTTYPE_CLOCK {
types::__wasi_subscription_u {
clock: types::__wasi_subscription_clock_t {
clock_id: unsafe { orig.u.clock.clock_id },
timeout: unsafe { orig.u.clock.timeout },
precision: unsafe { orig.u.clock.precision },
flags: unsafe { orig.u.clock.flags },
},
}
} else {
types::__wasi_subscription_u {
fd_readwrite: unsafe { orig.u.fd_readwrite },
}
},
}));
wasi_try_mem_ok!(in_sub_new.write(Subscription::from(*orig)));
}
// make the call

File diff suppressed because it is too large Load Diff

View File

@@ -5,17 +5,18 @@ use libc::{
};
use std::mem;
use wasmer::WasmRef;
use wasmer_wasi_types::wasi::{Errno, Snapshot0Clockid, Timestamp};
pub fn platform_clock_res_get(
clock_id: __wasi_clockid_t,
resolution: WasmRef<__wasi_timestamp_t>,
) -> Result<i64, __wasi_errno_t> {
clock_id: Snapshot0Clockid,
resolution: WasmRef<Timestamp>,
) -> Result<i64, Errno> {
let unix_clock_id = match clock_id {
__WASI_CLOCK_MONOTONIC => CLOCK_MONOTONIC,
__WASI_CLOCK_PROCESS_CPUTIME_ID => CLOCK_PROCESS_CPUTIME_ID,
__WASI_CLOCK_REALTIME => CLOCK_REALTIME,
__WASI_CLOCK_THREAD_CPUTIME_ID => CLOCK_THREAD_CPUTIME_ID,
_ => return Err(__WASI_EINVAL),
Snapshot0Clockid::Monotonic => CLOCK_MONOTONIC,
Snapshot0Clockid::ProcessCputimeId => CLOCK_PROCESS_CPUTIME_ID,
Snapshot0Clockid::Realtime => CLOCK_REALTIME,
Snapshot0Clockid::ThreadCputimeId => CLOCK_THREAD_CPUTIME_ID,
_ => return Err(Errno::Inval),
};
let (output, timespec_out) = unsafe {
@@ -31,15 +32,15 @@ pub fn platform_clock_res_get(
}
pub fn platform_clock_time_get(
clock_id: __wasi_clockid_t,
precision: __wasi_timestamp_t,
) -> Result<i64, __wasi_errno_t> {
clock_id: Snapshot0Clockid,
precision: Timestamp,
) -> Result<i64, Errno> {
let unix_clock_id = match clock_id {
__WASI_CLOCK_MONOTONIC => CLOCK_MONOTONIC,
__WASI_CLOCK_PROCESS_CPUTIME_ID => CLOCK_PROCESS_CPUTIME_ID,
__WASI_CLOCK_REALTIME => CLOCK_REALTIME,
__WASI_CLOCK_THREAD_CPUTIME_ID => CLOCK_THREAD_CPUTIME_ID,
_ => return Err(__WASI_EINVAL),
Snapshot0Clockid::Monotonic => CLOCK_MONOTONIC,
Snapshot0Clockid::ProcessCputimeId => CLOCK_PROCESS_CPUTIME_ID,
Snapshot0Clockid::Realtime => CLOCK_REALTIME,
Snapshot0Clockid::ThreadCputimeId => CLOCK_THREAD_CPUTIME_ID,
_ => return Err(Errno::Inval),
};
let (output, timespec_out) = unsafe {

View File

@@ -1,7 +1,10 @@
#![deny(dead_code)]
use crate::{WasiEnv, WasiError, WasiState, WasiThread};
use wasmer::{StoreMut, Memory, Memory32, MemorySize, WasmPtr, WasmSlice};
use wasmer_wasi_types::*;
use wasmer::{Memory, Memory32, MemorySize, StoreMut, WasmPtr, WasmSlice};
use wasmer_wasi_types::{
wasi::{Errno, Event, Fd as WasiFd, Filesize, Fstflags, Fstflags, Timestamp, Whence, Clockid},
types::*,
};
type MemoryType = Memory32;
type MemoryOffset = u32;
@@ -10,7 +13,7 @@ pub(crate) fn args_get(
ctx: FunctionEnvMut<WasiEnv>,
argv: WasmPtr<WasmPtr<u8, MemoryType>, MemoryType>,
argv_buf: WasmPtr<u8, MemoryType>,
) -> __wasi_errno_t {
) -> Errno {
super::args_get::<MemoryType>(ctx, argv, argv_buf)
}
@@ -18,24 +21,24 @@ pub(crate) fn args_sizes_get(
ctx: FunctionEnvMut<WasiEnv>,
argc: WasmPtr<MemoryOffset, MemoryType>,
argv_buf_size: WasmPtr<MemoryOffset, MemoryType>,
) -> __wasi_errno_t {
) -> Errno {
super::args_sizes_get::<MemoryType>(ctx, argc, argv_buf_size)
}
pub(crate) fn clock_res_get(
ctx: FunctionEnvMut<WasiEnv>,
clock_id: __wasi_clockid_t,
resolution: WasmPtr<__wasi_timestamp_t, MemoryType>,
) -> __wasi_errno_t {
clock_id: Clockid,
resolution: WasmPtr<Timestamp, MemoryType>,
) -> Errno {
super::clock_res_get::<MemoryType>(ctx, clock_id, resolution)
}
pub(crate) fn clock_time_get(
ctx: FunctionEnvMut<WasiEnv>,
clock_id: __wasi_clockid_t,
precision: __wasi_timestamp_t,
time: WasmPtr<__wasi_timestamp_t, MemoryType>,
) -> __wasi_errno_t {
clock_id: Clockid,
precision: Timestamp,
time: WasmPtr<Timestamp, MemoryType>,
) -> Errno {
super::clock_time_get::<MemoryType>(ctx, clock_id, precision, time)
}
@@ -43,7 +46,7 @@ pub(crate) fn environ_get(
ctx: FunctionEnvMut<WasiEnv>,
environ: WasmPtr<WasmPtr<u8, MemoryType>, MemoryType>,
environ_buf: WasmPtr<u8, MemoryType>,
) -> __wasi_errno_t {
) -> Errno {
super::environ_get::<MemoryType>(ctx, environ, environ_buf)
}
@@ -51,218 +54,214 @@ pub(crate) fn environ_sizes_get(
ctx: FunctionEnvMut<WasiEnv>,
environ_count: WasmPtr<MemoryOffset, MemoryType>,
environ_buf_size: WasmPtr<MemoryOffset, MemoryType>,
) -> __wasi_errno_t {
) -> Errno {
super::environ_sizes_get::<MemoryType>(ctx, environ_count, environ_buf_size)
}
pub(crate) fn fd_advise(
ctx: FunctionEnvMut<WasiEnv>,
fd: __wasi_fd_t,
offset: __wasi_filesize_t,
len: __wasi_filesize_t,
fd: WasiFd,
offset: Filesize,
len: Filesize,
advice: __wasi_advice_t,
) -> __wasi_errno_t {
) -> Errno {
super::fd_advise(ctx, fd, offset, len, advice)
}
pub(crate) fn fd_allocate(
ctx: FunctionEnvMut<WasiEnv>,
fd: __wasi_fd_t,
offset: __wasi_filesize_t,
len: __wasi_filesize_t,
) -> __wasi_errno_t {
fd: WasiFd,
offset: Filesize,
len: Filesize,
) -> Errno {
super::fd_allocate(ctx, fd, offset, len)
}
pub(crate) fn fd_close(ctx: FunctionEnvMut<WasiEnv>, fd: __wasi_fd_t) -> __wasi_errno_t {
pub(crate) fn fd_close(ctx: FunctionEnvMut<WasiEnv>, fd: WasiFd) -> Errno {
super::fd_close(ctx, fd)
}
pub(crate) fn fd_datasync(ctx: FunctionEnvMut<WasiEnv>, fd: __wasi_fd_t) -> __wasi_errno_t {
pub(crate) fn fd_datasync(ctx: FunctionEnvMut<WasiEnv>, fd: WasiFd) -> Errno {
super::fd_datasync(ctx, fd)
}
pub(crate) fn fd_fdstat_get(
ctx: FunctionEnvMut<WasiEnv>,
fd: __wasi_fd_t,
buf_ptr: WasmPtr<__wasi_fdstat_t, MemoryType>,
) -> __wasi_errno_t {
fd: WasiFd,
buf_ptr: WasmPtr<WasiFdstat, MemoryType>,
) -> Errno {
super::fd_fdstat_get::<MemoryType>(ctx, fd, buf_ptr)
}
pub(crate) fn fd_fdstat_set_flags(
ctx: FunctionEnvMut<WasiEnv>,
fd: __wasi_fd_t,
flags: __wasi_fdflags_t,
) -> __wasi_errno_t {
fd: WasiFd,
flags: WasiFdflags,
) -> Errno {
super::fd_fdstat_set_flags(ctx, fd, flags)
}
pub(crate) fn fd_fdstat_set_rights(
ctx: FunctionEnvMut<WasiEnv>,
fd: __wasi_fd_t,
fd: WasiFd,
fs_rights_base: __wasi_rights_t,
fs_rights_inheriting: __wasi_rights_t,
) -> __wasi_errno_t {
) -> Errno {
super::fd_fdstat_set_rights(ctx, fd, fs_rights_base, fs_rights_inheriting)
}
pub(crate) fn fd_filestat_get(
ctx: FunctionEnvMut<WasiEnv>,
fd: __wasi_fd_t,
buf: WasmPtr<__wasi_filestat_t, MemoryType>,
) -> __wasi_errno_t {
fd: WasiFd,
buf: WasmPtr<Filestat, MemoryType>,
) -> Errno {
super::fd_filestat_get::<MemoryType>(ctx, fd, buf)
}
pub(crate) fn fd_filestat_set_size(
ctx: FunctionEnvMut<WasiEnv>,
fd: __wasi_fd_t,
st_size: __wasi_filesize_t,
) -> __wasi_errno_t {
fd: WasiFd,
st_size: Filesize,
) -> Errno {
super::fd_filestat_set_size(ctx, fd, st_size)
}
pub(crate) fn fd_filestat_set_times(
ctx: FunctionEnvMut<WasiEnv>,
fd: __wasi_fd_t,
st_atim: __wasi_timestamp_t,
st_mtim: __wasi_timestamp_t,
fst_flags: __wasi_fstflags_t,
) -> __wasi_errno_t {
fd: WasiFd,
st_atim: Timestamp,
st_mtim: Timestamp,
fst_flags: Fstflags,
) -> Errno {
super::fd_filestat_set_times(ctx, fd, st_atim, st_mtim, fst_flags)
}
pub(crate) fn fd_pread(
ctx: FunctionEnvMut<WasiEnv>,
fd: __wasi_fd_t,
fd: WasiFd,
iovs: WasmPtr<__wasi_iovec_t<MemoryType>, MemoryType>,
iovs_len: MemoryOffset,
offset: __wasi_filesize_t,
offset: Filesize,
nread: WasmPtr<MemoryOffset, MemoryType>,
) -> Result<__wasi_errno_t, WasiError> {
) -> Result<Errno, WasiError> {
super::fd_pread::<MemoryType>(ctx, fd, iovs, iovs_len, offset, nread)
}
pub(crate) fn fd_prestat_get(
ctx: FunctionEnvMut<WasiEnv>,
fd: __wasi_fd_t,
buf: WasmPtr<__wasi_prestat_t, MemoryType>,
) -> __wasi_errno_t {
fd: WasiFd,
buf: WasmPtr<Prestat, MemoryType>,
) -> Errno {
super::fd_prestat_get::<MemoryType>(ctx, fd, buf)
}
pub(crate) fn fd_prestat_dir_name(
ctx: FunctionEnvMut<WasiEnv>,
fd: __wasi_fd_t,
fd: WasiFd,
path: WasmPtr<u8, MemoryType>,
path_len: MemoryOffset,
) -> __wasi_errno_t {
) -> Errno {
super::fd_prestat_dir_name::<MemoryType>(ctx, fd, path, path_len)
}
pub(crate) fn fd_pwrite(
ctx: FunctionEnvMut<WasiEnv>,
fd: __wasi_fd_t,
fd: WasiFd,
iovs: WasmPtr<__wasi_ciovec_t<MemoryType>, MemoryType>,
iovs_len: MemoryOffset,
offset: __wasi_filesize_t,
offset: Filesize,
nwritten: WasmPtr<MemoryOffset, MemoryType>,
) -> Result<__wasi_errno_t, WasiError> {
) -> Result<Errno, WasiError> {
super::fd_pwrite::<MemoryType>(ctx, fd, iovs, iovs_len, offset, nwritten)
}
pub(crate) fn fd_read(
ctx: FunctionEnvMut<WasiEnv>,
fd: __wasi_fd_t,
fd: WasiFd,
iovs: WasmPtr<__wasi_iovec_t<MemoryType>, MemoryType>,
iovs_len: MemoryOffset,
nread: WasmPtr<MemoryOffset, MemoryType>,
) -> Result<__wasi_errno_t, WasiError> {
) -> Result<Errno, WasiError> {
super::fd_read::<MemoryType>(ctx, fd, iovs, iovs_len, nread)
}
pub(crate) fn fd_readdir(
ctx: FunctionEnvMut<WasiEnv>,
fd: __wasi_fd_t,
fd: WasiFd,
buf: WasmPtr<u8, MemoryType>,
buf_len: MemoryOffset,
cookie: __wasi_dircookie_t,
bufused: WasmPtr<MemoryOffset, MemoryType>,
) -> __wasi_errno_t {
) -> Errno {
super::fd_readdir::<MemoryType>(ctx, fd, buf, buf_len, cookie, bufused)
}
pub(crate) fn fd_renumber(
ctx: FunctionEnvMut<WasiEnv>,
from: __wasi_fd_t,
to: __wasi_fd_t,
) -> __wasi_errno_t {
pub(crate) fn fd_renumber(ctx: FunctionEnvMut<WasiEnv>, from: WasiFd, to: WasiFd) -> Errno {
super::fd_renumber(ctx, from, to)
}
pub(crate) fn fd_seek(
ctx: FunctionEnvMut<WasiEnv>,
fd: __wasi_fd_t,
offset: __wasi_filedelta_t,
whence: __wasi_whence_t,
newoffset: WasmPtr<__wasi_filesize_t, MemoryType>,
) -> Result<__wasi_errno_t, WasiError> {
fd: WasiFd,
offset: FileDelta,
whence: Whence,
newoffset: WasmPtr<Filesize, MemoryType>,
) -> Result<Errno, WasiError> {
super::fd_seek::<MemoryType>(ctx, fd, offset, whence, newoffset)
}
pub(crate) fn fd_sync(ctx: FunctionEnvMut<WasiEnv>, fd: __wasi_fd_t) -> __wasi_errno_t {
pub(crate) fn fd_sync(ctx: FunctionEnvMut<WasiEnv>, fd: WasiFd) -> Errno {
super::fd_sync(ctx, fd)
}
pub(crate) fn fd_tell(
ctx: FunctionEnvMut<WasiEnv>,
fd: __wasi_fd_t,
offset: WasmPtr<__wasi_filesize_t, MemoryType>,
) -> __wasi_errno_t {
fd: WasiFd,
offset: WasmPtr<Filesize, MemoryType>,
) -> Errno {
super::fd_tell::<MemoryType>(ctx, fd, offset)
}
pub(crate) fn fd_write(
ctx: FunctionEnvMut<WasiEnv>,
fd: __wasi_fd_t,
fd: WasiFd,
iovs: WasmPtr<__wasi_ciovec_t<MemoryType>, MemoryType>,
iovs_len: MemoryOffset,
nwritten: WasmPtr<MemoryOffset, MemoryType>,
) -> Result<__wasi_errno_t, WasiError> {
) -> Result<Errno, WasiError> {
super::fd_write::<MemoryType>(ctx, fd, iovs, iovs_len, nwritten)
}
pub(crate) fn path_create_directory(
ctx: FunctionEnvMut<WasiEnv>,
fd: __wasi_fd_t,
fd: WasiFd,
path: WasmPtr<u8, MemoryType>,
path_len: MemoryOffset,
) -> __wasi_errno_t {
) -> Errno {
super::path_create_directory::<MemoryType>(ctx, fd, path, path_len)
}
pub(crate) fn path_filestat_get(
ctx: FunctionEnvMut<WasiEnv>,
fd: __wasi_fd_t,
flags: __wasi_lookupflags_t,
fd: WasiFd,
flags: LookupFlags,
path: WasmPtr<u8, MemoryType>,
path_len: MemoryOffset,
buf: WasmPtr<__wasi_filestat_t, MemoryType>,
) -> __wasi_errno_t {
buf: WasmPtr<Filestat, MemoryType>,
) -> Errno {
super::path_filestat_get::<MemoryType>(ctx, fd, flags, path, path_len, buf)
}
pub(crate) fn path_filestat_set_times(
ctx: FunctionEnvMut<WasiEnv>,
fd: __wasi_fd_t,
flags: __wasi_lookupflags_t,
fd: WasiFd,
flags: LookupFlags,
path: WasmPtr<u8, MemoryType>,
path_len: MemoryOffset,
st_atim: __wasi_timestamp_t,
st_mtim: __wasi_timestamp_t,
fst_flags: __wasi_fstflags_t,
) -> __wasi_errno_t {
st_atim: Timestamp,
st_mtim: Timestamp,
fst_flags: Fstflags,
) -> Errno {
super::path_filestat_set_times::<MemoryType>(
ctx, fd, flags, path, path_len, st_atim, st_mtim, fst_flags,
)
@@ -270,14 +269,14 @@ pub(crate) fn path_filestat_set_times(
pub(crate) fn path_link(
ctx: FunctionEnvMut<WasiEnv>,
old_fd: __wasi_fd_t,
old_flags: __wasi_lookupflags_t,
old_fd: WasiFd,
old_flags: LookupFlags,
old_path: WasmPtr<u8, MemoryType>,
old_path_len: MemoryOffset,
new_fd: __wasi_fd_t,
new_fd: WasiFd,
new_path: WasmPtr<u8, MemoryType>,
new_path_len: MemoryOffset,
) -> __wasi_errno_t {
) -> Errno {
super::path_link::<MemoryType>(
ctx,
old_fd,
@@ -292,16 +291,16 @@ pub(crate) fn path_link(
pub(crate) fn path_open(
ctx: FunctionEnvMut<WasiEnv>,
dirfd: __wasi_fd_t,
dirflags: __wasi_lookupflags_t,
dirfd: WasiFd,
dirflags: LookupFlags,
path: WasmPtr<u8, MemoryType>,
path_len: MemoryOffset,
o_flags: __wasi_oflags_t,
o_flags: Oflags,
fs_rights_base: __wasi_rights_t,
fs_rights_inheriting: __wasi_rights_t,
fs_flags: __wasi_fdflags_t,
fd: WasmPtr<__wasi_fd_t, MemoryType>,
) -> __wasi_errno_t {
fs_flags: WasiFdflags,
fd: WasmPtr<WasiFd, MemoryType>,
) -> Errno {
super::path_open::<MemoryType>(
ctx,
dirfd,
@@ -318,34 +317,34 @@ pub(crate) fn path_open(
pub(crate) fn path_readlink(
ctx: FunctionEnvMut<WasiEnv>,
dir_fd: __wasi_fd_t,
dir_fd: WasiFd,
path: WasmPtr<u8, MemoryType>,
path_len: MemoryOffset,
buf: WasmPtr<u8, MemoryType>,
buf_len: MemoryOffset,
buf_used: WasmPtr<MemoryOffset, MemoryType>,
) -> __wasi_errno_t {
) -> Errno {
super::path_readlink::<MemoryType>(ctx, dir_fd, path, path_len, buf, buf_len, buf_used)
}
pub(crate) fn path_remove_directory(
ctx: FunctionEnvMut<WasiEnv>,
fd: __wasi_fd_t,
fd: WasiFd,
path: WasmPtr<u8, MemoryType>,
path_len: MemoryOffset,
) -> __wasi_errno_t {
) -> Errno {
super::path_remove_directory::<MemoryType>(ctx, fd, path, path_len)
}
pub(crate) fn path_rename(
ctx: FunctionEnvMut<WasiEnv>,
old_fd: __wasi_fd_t,
old_fd: WasiFd,
old_path: WasmPtr<u8, MemoryType>,
old_path_len: MemoryOffset,
new_fd: __wasi_fd_t,
new_fd: WasiFd,
new_path: WasmPtr<u8, MemoryType>,
new_path_len: MemoryOffset,
) -> __wasi_errno_t {
) -> Errno {
super::path_rename::<MemoryType>(
ctx,
old_fd,
@@ -361,29 +360,29 @@ pub(crate) fn path_symlink(
ctx: FunctionEnvMut<WasiEnv>,
old_path: WasmPtr<u8, MemoryType>,
old_path_len: MemoryOffset,
fd: __wasi_fd_t,
fd: WasiFd,
new_path: WasmPtr<u8, MemoryType>,
new_path_len: MemoryOffset,
) -> __wasi_errno_t {
) -> Errno {
super::path_symlink::<MemoryType>(ctx, old_path, old_path_len, fd, new_path, new_path_len)
}
pub(crate) fn path_unlink_file(
ctx: FunctionEnvMut<WasiEnv>,
fd: __wasi_fd_t,
fd: WasiFd,
path: WasmPtr<u8, MemoryType>,
path_len: MemoryOffset,
) -> __wasi_errno_t {
) -> Errno {
super::path_unlink_file::<MemoryType>(ctx, fd, path, path_len)
}
pub(crate) fn poll_oneoff(
ctx: FunctionEnvMut<WasiEnv>,
in_: WasmPtr<__wasi_subscription_t, MemoryType>,
out_: WasmPtr<__wasi_event_t, MemoryType>,
out_: WasmPtr<Event, MemoryType>,
nsubscriptions: MemoryOffset,
nevents: WasmPtr<MemoryOffset, MemoryType>,
) -> Result<__wasi_errno_t, WasiError> {
) -> Result<Errno, WasiError> {
super::poll_oneoff::<MemoryType>(ctx, in_, out_, nsubscriptions, nevents)
}
@@ -394,7 +393,7 @@ pub(crate) fn proc_exit(
super::proc_exit(ctx, code)
}
pub(crate) fn proc_raise(ctx: FunctionEnvMut<WasiEnv>, sig: __wasi_signal_t) -> __wasi_errno_t {
pub(crate) fn proc_raise(ctx: FunctionEnvMut<WasiEnv>, sig: Signal) -> Errno {
super::proc_raise(ctx, sig)
}
@@ -402,23 +401,23 @@ pub(crate) fn random_get(
ctx: FunctionEnvMut<WasiEnv>,
buf: WasmPtr<u8, MemoryType>,
buf_len: MemoryOffset,
) -> __wasi_errno_t {
) -> Errno {
super::random_get::<MemoryType>(ctx, buf, buf_len)
}
pub(crate) fn sched_yield(ctx: FunctionEnvMut<WasiEnv>) -> Result<__wasi_errno_t, WasiError> {
pub(crate) fn sched_yield(ctx: FunctionEnvMut<WasiEnv>) -> Result<Errno, WasiError> {
super::sched_yield(ctx)
}
pub(crate) fn sock_recv(
ctx: FunctionEnvMut<WasiEnv>,
sock: __wasi_fd_t,
sock: WasiFd,
ri_data: WasmPtr<__wasi_iovec_t<MemoryType>, MemoryType>,
ri_data_len: MemoryOffset,
ri_flags: __wasi_riflags_t,
ri_flags: RiFlags,
ro_data_len: WasmPtr<MemoryOffset, MemoryType>,
ro_flags: WasmPtr<__wasi_roflags_t, MemoryType>,
) -> Result<__wasi_errno_t, WasiError> {
ro_flags: WasmPtr<RoFlags, MemoryType>,
) -> Result<Errno, WasiError> {
super::sock_recv::<MemoryType>(
ctx,
sock,
@@ -432,19 +431,19 @@ pub(crate) fn sock_recv(
pub(crate) fn sock_send(
ctx: FunctionEnvMut<WasiEnv>,
sock: __wasi_fd_t,
sock: WasiFd,
si_data: WasmPtr<__wasi_ciovec_t<MemoryType>, MemoryType>,
si_data_len: MemoryOffset,
si_flags: __wasi_siflags_t,
si_flags: SiFlags,
ret_data_len: WasmPtr<MemoryOffset, MemoryType>,
) -> Result<__wasi_errno_t, WasiError> {
) -> Result<Errno, WasiError> {
super::sock_send::<MemoryType>(ctx, sock, si_data, si_data_len, si_flags, ret_data_len)
}
pub(crate) fn sock_shutdown(
ctx: FunctionEnvMut<WasiEnv>,
sock: __wasi_fd_t,
how: __wasi_sdflags_t,
) -> __wasi_errno_t {
sock: WasiFd,
how: SdFlags,
) -> Errno {
super::sock_shutdown(ctx, sock, how)
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,26 +1,29 @@
use crate::syscalls::types::*;
use crate::syscalls::types::{
wasi::{Errno, Snapshot0Clockid, Timestamp},
*,
};
use chrono::prelude::*;
use std::mem;
use wasmer::WasmRef;
pub fn platform_clock_res_get(
clock_id: __wasi_clockid_t,
resolution: WasmRef<__wasi_timestamp_t>,
) -> Result<i64, __wasi_errno_t> {
clock_id: Snapshot0Clockid,
resolution: WasmRef<Timestamp>,
) -> Result<i64, Errno> {
let t_out = match clock_id {
__WASI_CLOCK_MONOTONIC => 10_000_000,
__WASI_CLOCK_REALTIME => 1,
__WASI_CLOCK_PROCESS_CPUTIME_ID => 1,
__WASI_CLOCK_THREAD_CPUTIME_ID => 1,
_ => return Err(__WASI_EINVAL),
Snapshot0Clockid::Monotonic => 10_000_000,
Snapshot0Clockid::Realtime => 1,
Snapshot0Clockid::ProcessCputimeId => 1,
Snapshot0Clockid::ThreadCputimeId => 1,
_ => return Err(Errno::Inval),
};
Ok(t_out)
}
pub fn platform_clock_time_get(
clock_id: __wasi_clockid_t,
precision: __wasi_timestamp_t,
) -> Result<i64, __wasi_errno_t> {
clock_id: Snapshot0Clockid,
precision: Timestamp,
) -> Result<i64, Errno> {
let new_time: DateTime<Local> = Local::now();
Ok(new_time.timestamp_nanos() as i64)
}

View File

@@ -1,53 +1,53 @@
use crate::syscalls::types::*;
use crate::syscalls::types::wasi::{self, Timestamp};
use tracing::debug;
use wasmer::WasmRef;
pub fn platform_clock_res_get(
clock_id: __wasi_clockid_t,
resolution: WasmRef<__wasi_timestamp_t>,
) -> Result<i64, __wasi_errno_t> {
clock_id: wasi::Snapshot0Clockid,
resolution: WasmRef<Timestamp>,
) -> Result<i64, wasi::Errno> {
let resolution_val = match clock_id {
// resolution of monotonic clock at 10ms, from:
// https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-gettickcount64
__WASI_CLOCK_MONOTONIC => 10_000_000,
wasi::Snapshot0Clockid::Monotonic => 10_000_000,
// TODO: verify or compute this
__WASI_CLOCK_REALTIME => 1,
__WASI_CLOCK_PROCESS_CPUTIME_ID => {
return Err(__WASI_EINVAL);
wasi::Snapshot0Clockid::Realtime => 1,
wasi::Snapshot0Clockid::ProcessCputimeId => {
return Err(wasi::Errno::Inval);
}
__WASI_CLOCK_THREAD_CPUTIME_ID => {
return Err(__WASI_EINVAL);
wasi::Snapshot0Clockid::ThreadCputimeId => {
return Err(wasi::Errno::Inval);
}
_ => return Err(__WASI_EINVAL),
_ => return Err(wasi::Errno::Inval),
};
Ok(resolution_val)
}
pub fn platform_clock_time_get(
clock_id: __wasi_clockid_t,
precision: __wasi_timestamp_t,
) -> Result<i64, __wasi_errno_t> {
clock_id: wasi::Snapshot0Clockid,
precision: Timestamp,
) -> Result<i64, wasi::Errno> {
let nanos = match clock_id {
__WASI_CLOCK_MONOTONIC => {
wasi::Snapshot0Clockid::Monotonic => {
let tick_ms = unsafe { winapi::um::sysinfoapi::GetTickCount64() };
tick_ms * 1_000_000
}
__WASI_CLOCK_REALTIME => {
wasi::Snapshot0Clockid::Realtime => {
let duration = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.map_err(|e| {
debug!("Error in wasi::platform_clock_time_get: {:?}", e);
__WASI_EIO
wasi::Errno::Io
})?;
duration.as_nanos() as u64
}
__WASI_CLOCK_PROCESS_CPUTIME_ID => {
unimplemented!("wasi::platform_clock_time_get(__WASI_CLOCK_PROCESS_CPUTIME_ID, ..)")
wasi::Snapshot0Clockid::ProcessCputimeId => {
unimplemented!("wasi::platform_clock_time_get(wasi::Clockid::ProcessCputimeId, ..)")
}
__WASI_CLOCK_THREAD_CPUTIME_ID => {
unimplemented!("wasi::platform_clock_time_get(__WASI_CLOCK_THREAD_CPUTIME_ID, ..)")
wasi::Snapshot0Clockid::ThreadCputimeId => {
unimplemented!("wasi::platform_clock_time_get(wasi::Clockid::ThreadCputimeId, ..)")
}
_ => return Err(__WASI_EINVAL),
_ => return Err(wasi::Errno::Inval),
};
Ok(nanos as i64)
}

View File

@@ -1,6 +1,6 @@
use super::types::*;
use std::collections::BTreeSet;
use wasmer::Module;
use wasmer_wasi_types::wasi::Errno;
#[allow(dead_code)]
/// Check if a provided module is compiled for some version of WASI.
@@ -22,29 +22,29 @@ pub fn is_wasix_module(module: &Module) -> bool {
}
}
pub fn map_io_err(err: std::io::Error) -> __wasi_errno_t {
pub fn map_io_err(err: std::io::Error) -> Errno {
use std::io::ErrorKind;
match err.kind() {
ErrorKind::NotFound => __WASI_ENOENT,
ErrorKind::PermissionDenied => __WASI_EPERM,
ErrorKind::ConnectionRefused => __WASI_ECONNREFUSED,
ErrorKind::ConnectionReset => __WASI_ECONNRESET,
ErrorKind::ConnectionAborted => __WASI_ECONNABORTED,
ErrorKind::NotConnected => __WASI_ENOTCONN,
ErrorKind::AddrInUse => __WASI_EADDRINUSE,
ErrorKind::AddrNotAvailable => __WASI_EADDRNOTAVAIL,
ErrorKind::BrokenPipe => __WASI_EPIPE,
ErrorKind::AlreadyExists => __WASI_EEXIST,
ErrorKind::WouldBlock => __WASI_EAGAIN,
ErrorKind::InvalidInput => __WASI_EIO,
ErrorKind::InvalidData => __WASI_EIO,
ErrorKind::TimedOut => __WASI_ETIMEDOUT,
ErrorKind::WriteZero => __WASI_EIO,
ErrorKind::Interrupted => __WASI_EINTR,
ErrorKind::Other => __WASI_EIO,
ErrorKind::UnexpectedEof => __WASI_EIO,
ErrorKind::Unsupported => __WASI_ENOTSUP,
_ => __WASI_EIO,
ErrorKind::NotFound => Errno::Noent,
ErrorKind::PermissionDenied => Errno::Perm,
ErrorKind::ConnectionRefused => Errno::Connrefused,
ErrorKind::ConnectionReset => Errno::Connreset,
ErrorKind::ConnectionAborted => Errno::Connaborted,
ErrorKind::NotConnected => Errno::Notconn,
ErrorKind::AddrInUse => Errno::Addrinuse,
ErrorKind::AddrNotAvailable => Errno::Addrnotavail,
ErrorKind::BrokenPipe => Errno::Pipe,
ErrorKind::AlreadyExists => Errno::Exist,
ErrorKind::WouldBlock => Errno::Again,
ErrorKind::InvalidInput => Errno::Io,
ErrorKind::InvalidData => Errno::Io,
ErrorKind::TimedOut => Errno::Timedout,
ErrorKind::WriteZero => Errno::Io,
ErrorKind::Interrupted => Errno::Intr,
ErrorKind::Other => Errno::Io,
ErrorKind::UnexpectedEof => Errno::Io,
ErrorKind::Unsupported => Errno::Notsup,
_ => Errno::Io,
}
}

View File

@@ -3,10 +3,9 @@ use std::fs::{read_dir, File, OpenOptions, ReadDir};
use std::io::{self, Read, Seek, Write};
use std::path::{Path, PathBuf};
use std::sync::{mpsc, Arc, Mutex};
use wasmer::FunctionEnv;
use wasmer::{Imports, Instance, Module, Store};
use wasmer::{FunctionEnv, Imports, Instance, Module, Store};
use wasmer_vfs::{host_fs, mem_fs, FileSystem};
use wasmer_wasi::types::{__wasi_filesize_t, __wasi_timestamp_t};
use wasmer_wasi::types::wasi::{Filesize, Timestamp};
use wasmer_wasi::{
generate_import_object_from_env, get_wasi_version, FsError, Pipe, VirtualFile, WasiEnv,
WasiFunctionEnv, WasiState, WasiVersion,
@@ -614,19 +613,19 @@ impl Write for OutputCapturerer {
}
impl VirtualFile for OutputCapturerer {
fn last_accessed(&self) -> __wasi_timestamp_t {
fn last_accessed(&self) -> Timestamp {
0
}
fn last_modified(&self) -> __wasi_timestamp_t {
fn last_modified(&self) -> Timestamp {
0
}
fn created_time(&self) -> __wasi_timestamp_t {
fn created_time(&self) -> Timestamp {
0
}
fn size(&self) -> u64 {
0
}
fn set_len(&mut self, _new_size: __wasi_filesize_t) -> Result<(), FsError> {
fn set_len(&mut self, _new_size: Filesize) -> Result<(), FsError> {
Ok(())
}
fn unlink(&mut self) -> Result<(), FsError> {