From 95ad13c82da481f664fa61a8b74e39864e1570ae Mon Sep 17 00:00:00 2001 From: Pat Hickey Date: Fri, 29 Jan 2021 17:03:08 -0800 Subject: [PATCH] wasi-common: break dep on system-interface by defining our own Advice enum --- Cargo.lock | 10 +++++++++- Cargo.toml | 1 + crates/wasi-common/Cargo.toml | 1 - crates/wasi-common/cap-std-sync/src/file.rs | 16 ++++++++++++--- crates/wasi-common/cap-std-sync/src/stdio.rs | 4 ++-- crates/wasi-common/src/file.rs | 17 ++++++++++------ crates/wasi-common/src/pipe.rs | 3 +-- crates/wasi-common/src/snapshots/preview_1.rs | 20 +++++++++---------- 8 files changed, 47 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2a58151dd2..36caa1e0aa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3093,7 +3093,6 @@ dependencies = [ "cap-rand", "cap-std", "libc", - "system-interface", "thiserror", "tracing", "wiggle", @@ -3129,6 +3128,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "wasi-virtfs" +version = "0.22.0" +dependencies = [ + "anyhow", + "cap-std", + "wasi-common", +] + [[package]] name = "wasm-encoder" version = "0.4.0" diff --git a/Cargo.toml b/Cargo.toml index 1cd4a7477c..6527021f39 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -77,6 +77,7 @@ members = [ "crates/wiggle/wasmtime", "crates/wasi-common", "crates/wasi-common/cap-std-sync", + "crates/wasi-common/virtfs", "examples/fib-debug/wasm", "examples/wasi/wasm", "examples/wasi-fs/wasm", diff --git a/crates/wasi-common/Cargo.toml b/crates/wasi-common/Cargo.toml index 8980f20bec..82b5f16157 100644 --- a/crates/wasi-common/Cargo.toml +++ b/crates/wasi-common/Cargo.toml @@ -23,7 +23,6 @@ anyhow = "1.0" thiserror = "1.0" wiggle = { path = "../wiggle", default-features = false, version = "0.22.0" } tracing = "0.1.19" -system-interface = { version = "0.5.4", features = ["cap_std_impls"] } cap-std = "0.12" cap-rand = "0.12" bitflags = "1.2" diff --git a/crates/wasi-common/cap-std-sync/src/file.rs b/crates/wasi-common/cap-std-sync/src/file.rs index 697d034712..2d3b43ace9 100644 --- a/crates/wasi-common/cap-std-sync/src/file.rs +++ b/crates/wasi-common/cap-std-sync/src/file.rs @@ -4,11 +4,11 @@ use std::any::Any; use std::convert::TryInto; use std::io; use system_interface::{ - fs::{Advice, FileIoExt, GetSetFdFlags}, + fs::{FileIoExt, GetSetFdFlags}, io::ReadReady, }; use wasi_common::{ - file::{FdFlags, FileType, Filestat, WasiFile}, + file::{Advice, FdFlags, FileType, Filestat, WasiFile}, Error, }; @@ -61,7 +61,7 @@ impl WasiFile for File { Ok(()) } fn advise(&self, offset: u64, len: u64, advice: Advice) -> Result<(), Error> { - self.0.advise(offset, len, advice)?; + self.0.advise(offset, len, convert_advice(advice))?; Ok(()) } fn allocate(&self, offset: u64, len: u64) -> Result<(), Error> { @@ -193,3 +193,13 @@ pub fn from_sysif_fdflags(f: system_interface::fs::FdFlags) -> wasi_common::file } out } +pub fn convert_advice(advice: Advice) -> system_interface::fs::Advice { + match advice { + Advice::Normal => system_interface::fs::Advice::Normal, + Advice::Sequential => system_interface::fs::Advice::Sequential, + Advice::Random => system_interface::fs::Advice::Random, + Advice::WillNeed => system_interface::fs::Advice::WillNeed, + Advice::DontNeed => system_interface::fs::Advice::DontNeed, + Advice::NoReuse => system_interface::fs::Advice::NoReuse, + } +} diff --git a/crates/wasi-common/cap-std-sync/src/stdio.rs b/crates/wasi-common/cap-std-sync/src/stdio.rs index 17ca72f7b2..92a76d47ff 100644 --- a/crates/wasi-common/cap-std-sync/src/stdio.rs +++ b/crates/wasi-common/cap-std-sync/src/stdio.rs @@ -4,7 +4,7 @@ use std::any::Any; use std::convert::TryInto; use std::io; use std::io::{Read, Write}; -use system_interface::{fs::Advice, io::ReadReady}; +use system_interface::io::ReadReady; #[cfg(unix)] use std::os::unix::io::{AsRawFd, RawFd}; @@ -12,7 +12,7 @@ use std::os::unix::io::{AsRawFd, RawFd}; use std::os::windows::io::{AsRawHandle, RawHandle}; use unsafe_io::AsUnsafeFile; use wasi_common::{ - file::{FdFlags, FileType, Filestat, WasiFile}, + file::{Advice, FdFlags, FileType, Filestat, WasiFile}, Error, ErrorExt, }; diff --git a/crates/wasi-common/src/file.rs b/crates/wasi-common/src/file.rs index 38e94d3bc5..4f5ada3654 100644 --- a/crates/wasi-common/src/file.rs +++ b/crates/wasi-common/src/file.rs @@ -13,12 +13,7 @@ pub trait WasiFile { fn set_fdflags(&mut self, flags: FdFlags) -> Result<(), Error>; // file op fn get_filestat(&self) -> Result; // split out get_length as a read & write op, rest is a file op fn set_filestat_size(&self, _size: u64) -> Result<(), Error>; // write op - fn advise( - &self, - offset: u64, - len: u64, - advice: system_interface::fs::Advice, - ) -> Result<(), Error>; // file op + fn advise(&self, offset: u64, len: u64, advice: Advice) -> Result<(), Error>; // file op fn allocate(&self, offset: u64, len: u64) -> Result<(), Error>; // write op fn set_times( &self, @@ -170,3 +165,13 @@ pub struct FdStat { pub caps: FileCaps, pub flags: FdFlags, } + +#[derive(Debug, Clone)] +pub enum Advice { + Normal, + Sequential, + Random, + WillNeed, + DontNeed, + NoReuse, +} diff --git a/crates/wasi-common/src/pipe.rs b/crates/wasi-common/src/pipe.rs index 0652f2093f..71e4130932 100644 --- a/crates/wasi-common/src/pipe.rs +++ b/crates/wasi-common/src/pipe.rs @@ -10,14 +10,13 @@ //! but the virtual pipes can be instantiated with any `Read` or `Write` type. //! use crate::{ - file::{FdFlags, FileType, Filestat, WasiFile}, + file::{Advice, FdFlags, FileType, Filestat, WasiFile}, Error, ErrorExt, SystemTimeSpec, }; use std::any::Any; use std::convert::TryInto; use std::io::{self, Read, Write}; use std::sync::{Arc, RwLock}; -use system_interface::fs::Advice; /// A virtual pipe read end. /// diff --git a/crates/wasi-common/src/snapshots/preview_1.rs b/crates/wasi-common/src/snapshots/preview_1.rs index e00ed06263..0f00ab371e 100644 --- a/crates/wasi-common/src/snapshots/preview_1.rs +++ b/crates/wasi-common/src/snapshots/preview_1.rs @@ -1,8 +1,8 @@ use crate::{ dir::{DirCaps, DirEntry, DirEntryExt, DirFdStat, ReaddirCursor, ReaddirEntity, TableDirExt}, file::{ - FdFlags, FdStat, FileCaps, FileEntry, FileEntryExt, FileEntryMutExt, FileType, Filestat, - OFlags, TableFileExt, + Advice, FdFlags, FdStat, FileCaps, FileEntry, FileEntryExt, FileEntryMutExt, FileType, + Filestat, OFlags, TableFileExt, }, sched::{ subscription::{RwEventFlags, SubscriptionResult}, @@ -1081,15 +1081,15 @@ impl<'a> wasi_snapshot_preview1::WasiSnapshotPreview1 for WasiCtx { } } -impl From for system_interface::fs::Advice { - fn from(advice: types::Advice) -> system_interface::fs::Advice { +impl From for Advice { + fn from(advice: types::Advice) -> Advice { match advice { - types::Advice::Normal => system_interface::fs::Advice::Normal, - types::Advice::Sequential => system_interface::fs::Advice::Sequential, - types::Advice::Random => system_interface::fs::Advice::Random, - types::Advice::Willneed => system_interface::fs::Advice::WillNeed, - types::Advice::Dontneed => system_interface::fs::Advice::DontNeed, - types::Advice::Noreuse => system_interface::fs::Advice::NoReuse, + types::Advice::Normal => Advice::Normal, + types::Advice::Sequential => Advice::Sequential, + types::Advice::Random => Advice::Random, + types::Advice::Willneed => Advice::WillNeed, + types::Advice::Dontneed => Advice::DontNeed, + types::Advice::Noreuse => Advice::NoReuse, } } }