diff --git a/src/lib.rs b/src/lib.rs index 8543a54ab2..38c13c5466 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -29,3 +29,4 @@ pub mod memory; pub mod wasm32; pub use ctx::{WasiCtx, WasiCtxBuilder}; +pub use sys::preopen_dir; diff --git a/src/sys/unix/mod.rs b/src/sys/unix/mod.rs index 8d9f70ad3c..69ee7e6a16 100644 --- a/src/sys/unix/mod.rs +++ b/src/sys/unix/mod.rs @@ -2,6 +2,14 @@ pub mod fdentry; mod host_impl; pub mod hostcalls; -pub fn dev_null() -> std::fs::File { - std::fs::File::open("/dev/null").expect("failed to open /dev/null") +use std::fs::File; +use std::io; +use std::path::Path; + +pub fn dev_null() -> File { + File::open("/dev/null").expect("failed to open /dev/null") +} + +pub fn preopen_dir>(path: P) -> io::Result { + File::open(path) } diff --git a/src/sys/windows/mod.rs b/src/sys/windows/mod.rs index fe2c757617..128c053ceb 100644 --- a/src/sys/windows/mod.rs +++ b/src/sys/windows/mod.rs @@ -3,7 +3,25 @@ mod host_impl; pub mod hostcalls; use std::fs::File; +use std::io; +use std::path::Path; pub fn dev_null() -> File { File::open("NUL").expect("failed to open NUL") } + +pub fn preopen_dir>(path: P) -> io::Result { + use std::fs::OpenOptions; + use std::os::windows::fs::OpenOptionsExt; + use winapi::um::winbase::FILE_FLAG_BACKUP_SEMANTICS; + + // To open a directory using CreateFile, specify the + // FILE_FLAG_BACKUP_SEMANTICS flag as part of dwFileFlags... + // cf. https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-createfile2 + OpenOptions::new() + .create(false) + .write(true) + .read(true) + .attributes(FILE_FLAG_BACKUP_SEMANTICS) + .open(path) +}