wasmer_wasi_types/
types.rs

1#![deny(unused_mut)]
2#![allow(non_camel_case_types, clippy::identity_op)]
3
4//! Wasmer's WASI types implementation.
5//!
6//! Those types aim at being used by [the `wasmer-wasi`
7//! crate](https://github.com/wasmerio/wasmer/blob/master/lib/wasi).
8
9// Needed for #[derive(ValueType)]
10extern crate wasmer_types as wasmer;
11
12pub use crate::types::time::*;
13pub use bus::*;
14pub use directory::*;
15pub use file::*;
16pub use io::*;
17pub use net::*;
18pub use signal::*;
19pub use subscription::*;
20
21pub type __wasi_exitcode_t = u32;
22pub type __wasi_userdata_t = u64;
23
24pub mod bus {
25    use crate::wasi::{
26        BusDataFormat, BusEventClose, BusEventExit, BusEventFault, BusEventType, Cid, OptionCid,
27    };
28    use wasmer_derive::ValueType;
29    use wasmer_types::MemorySize;
30
31    // Not sure how to port these types to .wit with generics ...
32
33    #[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
34    #[repr(C)]
35    pub struct __wasi_busevent_call_t<M: MemorySize> {
36        pub parent: OptionCid,
37        pub cid: Cid,
38        pub format: BusDataFormat,
39        pub topic_ptr: M::Offset,
40        pub topic_len: M::Offset,
41        pub buf_ptr: M::Offset,
42        pub buf_len: M::Offset,
43    }
44
45    #[derive(Copy, Clone)]
46    #[repr(C)]
47    pub union __wasi_busevent_u<M: MemorySize> {
48        pub noop: u8,
49        pub exit: BusEventExit,
50        pub call: __wasi_busevent_call_t<M>,
51        pub result: __wasi_busevent_result_t<M>,
52        pub fault: BusEventFault,
53        pub close: BusEventClose,
54    }
55
56    #[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
57    #[repr(C)]
58    pub struct __wasi_busevent_result_t<M: MemorySize> {
59        pub format: BusDataFormat,
60        pub cid: Cid,
61        pub buf_ptr: M::Offset,
62        pub buf_len: M::Offset,
63    }
64
65    #[derive(Copy, Clone)]
66    #[repr(C)]
67    pub struct __wasi_busevent_t<M: MemorySize> {
68        pub tag: BusEventType,
69        pub u: __wasi_busevent_u<M>,
70    }
71}
72
73pub mod file {
74    use crate::wasi::{Fd, Rights};
75
76    pub use crate::wasi::{EventFdFlags, FileDelta, LookupFlags, Oflags};
77
78    pub const __WASI_STDIN_FILENO: Fd = 0;
79    pub const __WASI_STDOUT_FILENO: Fd = 1;
80    pub const __WASI_STDERR_FILENO: Fd = 2;
81
82    pub const EVENT_FD_FLAGS_SEMAPHORE: EventFdFlags = 1;
83
84    pub const __WASI_LOOKUP_SYMLINK_FOLLOW: LookupFlags = 1;
85
86    /// function for debugging rights issues
87    #[allow(dead_code)]
88    pub fn print_right_set(rights: Rights) {
89        // BTreeSet for consistent order
90        let mut right_set = std::collections::BTreeSet::new();
91        for i in 0..28 {
92            let cur_right = rights & Rights::from_bits(1 << i).unwrap();
93            if !cur_right.is_empty() {
94                right_set.insert(cur_right.to_str().unwrap_or("INVALID RIGHT"));
95            }
96        }
97        println!("{:#?}", right_set);
98    }
99}
100
101pub mod directory {
102    use crate::wasi;
103    use std::mem;
104
105    pub const __WASI_DIRCOOKIE_START: wasi::Dircookie = 0;
106
107    pub fn dirent_to_le_bytes(ent: &wasi::Dirent) -> Vec<u8> {
108        let out: Vec<u8> = std::iter::empty()
109            .chain(ent.d_next.to_le_bytes())
110            .chain(ent.d_ino.to_le_bytes())
111            .chain(ent.d_namlen.to_le_bytes())
112            .chain(u32::from(ent.d_type as u8).to_le_bytes())
113            .collect();
114
115        assert_eq!(out.len(), mem::size_of::<wasi::Dirent>());
116        out
117    }
118
119    #[cfg(test)]
120    mod tests {
121        use super::dirent_to_le_bytes;
122        use crate::wasi;
123
124        #[test]
125        fn test_dirent_to_le_bytes() {
126            let s = wasi::Dirent {
127                d_next: 0x0123456789abcdef,
128                d_ino: 0xfedcba9876543210,
129                d_namlen: 0xaabbccdd,
130                d_type: wasi::Filetype::Directory,
131            };
132
133            assert_eq!(
134                vec![
135                    // d_next
136                    0xef,
137                    0xcd,
138                    0xab,
139                    0x89,
140                    0x67,
141                    0x45,
142                    0x23,
143                    0x01,
144                    //
145                    // d_ino
146                    0x10,
147                    0x32,
148                    0x54,
149                    0x76,
150                    0x98,
151                    0xba,
152                    0xdc,
153                    0xfe,
154                    //
155                    // d_namelen
156                    0xdd,
157                    0xcc,
158                    0xbb,
159                    0xaa,
160                    //
161                    // d_type
162                    // plus padding
163                    wasi::Filetype::Directory as u8,
164                    0x00,
165                    0x00,
166                    0x00,
167                ],
168                dirent_to_le_bytes(&s)
169            );
170        }
171    }
172}
173
174pub mod io {
175    use wasmer_derive::ValueType;
176    use wasmer_types::MemorySize;
177
178    pub use crate::wasi::Bool;
179    pub use crate::wasi::Count;
180    pub use crate::wasi::OptionTag;
181    pub use crate::wasi::StdioMode;
182
183    #[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
184    #[repr(C)]
185    pub struct __wasi_ciovec_t<M: MemorySize> {
186        pub buf: M::Offset,
187        pub buf_len: M::Offset,
188    }
189
190    #[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
191    #[repr(C)]
192    pub struct __wasi_iovec_t<M: MemorySize> {
193        pub buf: M::Offset,
194        pub buf_len: M::Offset,
195    }
196}
197
198pub mod time {
199    pub use crate::wasi::OptionTimestamp;
200}
201
202pub mod net {
203    use crate::wasi::Addressfamily;
204    use wasmer_derive::ValueType;
205
206    use crate::wasi::OptionTimestamp;
207
208    pub use crate::wasi::{
209        AddrUnspec, AddrUnspecPort, CidrUnspec, HttpHandles, HttpStatus, RiFlags, RoFlags, SdFlags,
210        SiFlags, SockProto, Timeout,
211    };
212
213    #[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
214    #[repr(C)]
215    pub struct __wasi_hardwareaddress_t {
216        pub octs: [u8; 6],
217    }
218
219    #[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
220    #[repr(C)]
221    pub struct __wasi_addr_ip4_t {
222        pub octs: [u8; 4],
223    }
224
225    #[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
226    #[repr(C)]
227    pub struct __wasi_addr_ip4_port_t {
228        pub port: u16,
229        pub ip: __wasi_addr_ip4_t,
230    }
231
232    #[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
233    #[repr(C)]
234    pub struct __wasi_cidr_ip4_t {
235        pub ip: __wasi_addr_ip4_t,
236        pub prefix: u8,
237    }
238
239    #[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
240    #[repr(C)]
241    pub struct __wasi_addr_unix_t {
242        pub octs: [u8; 16],
243    }
244
245    #[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
246    #[repr(C)]
247    pub struct __wasi_addr_unix_port_t {
248        pub port: u16,
249        pub unix: __wasi_addr_unix_t,
250    }
251
252    #[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
253    #[repr(C)]
254    pub struct __wasi_cidr_unix_t {
255        pub unix: __wasi_addr_unix_t,
256        pub prefix: u8,
257    }
258
259    #[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
260    #[repr(C)]
261    pub struct __wasi_addr_ip6_t {
262        pub segs: [u8; 16],
263    }
264
265    #[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
266    #[repr(C)]
267    pub struct __wasi_addr_ip6_port_t {
268        pub port: u16,
269        pub ip: __wasi_addr_ip6_t,
270    }
271
272    #[derive(Debug, Copy, Clone, PartialEq, Eq, ValueType)]
273    #[repr(C)]
274    pub struct __wasi_cidr_ip6_t {
275        pub ip: __wasi_addr_ip6_t,
276        pub prefix: u8,
277    }
278
279    #[derive(Debug, Copy, Clone, ValueType)]
280    #[repr(C)]
281    pub struct __wasi_addr_u {
282        pub octs: [u8; 16],
283    }
284
285    #[derive(Debug, Copy, Clone, ValueType)]
286    #[repr(C)]
287    pub struct __wasi_addr_t {
288        pub tag: Addressfamily,
289        pub u: __wasi_addr_u,
290    }
291
292    #[derive(Debug, Copy, Clone, ValueType)]
293    #[repr(C)]
294    pub struct __wasi_addr_port_u {
295        pub octs: [u8; 18],
296    }
297
298    #[derive(Debug, Copy, Clone, ValueType)]
299    #[repr(C)]
300    pub struct __wasi_addr_port_t {
301        pub tag: Addressfamily,
302        pub u: __wasi_addr_port_u,
303    }
304
305    #[derive(Debug, Copy, Clone, ValueType)]
306    #[repr(C)]
307    pub struct __wasi_cidr_u {
308        pub octs: [u8; 17],
309    }
310
311    #[derive(Debug, Copy, Clone, ValueType)]
312    #[repr(C)]
313    pub struct __wasi_cidr_t {
314        pub tag: Addressfamily,
315        pub u: __wasi_cidr_u,
316    }
317
318    #[derive(Debug, Copy, Clone, ValueType)]
319    #[repr(C)]
320    pub struct Route {
321        pub cidr: __wasi_cidr_t,
322        pub via_router: __wasi_addr_t,
323        pub preferred_until: OptionTimestamp,
324        pub expires_at: OptionTimestamp,
325    }
326
327    pub const __WASI_SOCK_RECV_INPUT_PEEK: RiFlags = 1 << 0;
328    pub const __WASI_SOCK_RECV_INPUT_WAITALL: RiFlags = 1 << 1;
329    pub const __WASI_SOCK_RECV_INPUT_DATA_TRUNCATED: RiFlags = 1 << 2;
330
331    pub const __WASI_SOCK_RECV_OUTPUT_DATA_TRUNCATED: RoFlags = 1 << 0;
332
333    pub const __WASI_SHUT_RD: SdFlags = 1 << 0;
334    pub const __WASI_SHUT_WR: SdFlags = 1 << 1;
335}
336
337pub mod signal {
338    pub use crate::wasi::Signal;
339}
340
341pub mod subscription {
342    pub use crate::wasi::{
343        Eventtype, SubscriptionClock, SubscriptionEnum as EventType, SubscriptionFsReadwrite,
344    };
345}