diff options
| author | bors <bors@rust-lang.org> | 2019-04-04 12:46:20 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2019-04-04 12:46:20 +0000 |
| commit | 2d065712cf96328093400fd0a1a0c4e0f3b1d51c (patch) | |
| tree | e7ebae65f154a8e73c6aaca5e1085b5f5ec7d87d /src/libstd/sys_common | |
| parent | e43f99ce576152d4b2f7315d491c4210211228d6 (diff) | |
| parent | 61b487ca8be1d8667a82c1357dc2729cfe56186d (diff) | |
| download | rust-2d065712cf96328093400fd0a1a0c4e0f3b1d51c.tar.gz rust-2d065712cf96328093400fd0a1a0c4e0f3b1d51c.zip | |
Auto merge of #59619 - alexcrichton:wasi-fs, r=fitzgen
wasi: Implement more of the standard library This commit fills out more of the `wasm32-unknown-wasi` target's standard library, notably the `std::fs` module and all of its internals. A few tweaks were made along the way to non-`fs` modules, but the last commit contains the bulk of the work which is to wire up all APIs to their equivalent on WASI targets instead of unconditionally returning "unsupported". After this some basic filesystem operations and such should all be working in WASI!
Diffstat (limited to 'src/libstd/sys_common')
| -rw-r--r-- | src/libstd/sys_common/fs.rs | 41 | ||||
| -rw-r--r-- | src/libstd/sys_common/mod.rs | 1 |
2 files changed, 42 insertions, 0 deletions
diff --git a/src/libstd/sys_common/fs.rs b/src/libstd/sys_common/fs.rs new file mode 100644 index 00000000000..7152fcd215c --- /dev/null +++ b/src/libstd/sys_common/fs.rs @@ -0,0 +1,41 @@ +#![allow(dead_code)] // not used on all platforms + +use crate::path::Path; +use crate::fs; +use crate::io::{self, Error, ErrorKind}; + +pub fn copy(from: &Path, to: &Path) -> io::Result<u64> { + if !from.is_file() { + return Err(Error::new(ErrorKind::InvalidInput, + "the source path is not an existing regular file")) + } + + let mut reader = fs::File::open(from)?; + let mut writer = fs::File::create(to)?; + let perm = reader.metadata()?.permissions(); + + let ret = io::copy(&mut reader, &mut writer)?; + fs::set_permissions(to, perm)?; + Ok(ret) +} + +pub fn remove_dir_all(path: &Path) -> io::Result<()> { + let filetype = fs::symlink_metadata(path)?.file_type(); + if filetype.is_symlink() { + fs::remove_file(path) + } else { + remove_dir_all_recursive(path) + } +} + +fn remove_dir_all_recursive(path: &Path) -> io::Result<()> { + for child in fs::read_dir(path)? { + let child = child?; + if child.file_type()?.is_dir() { + remove_dir_all_recursive(&child.path())?; + } else { + fs::remove_file(&child.path())?; + } + } + fs::remove_dir(path) +} diff --git a/src/libstd/sys_common/mod.rs b/src/libstd/sys_common/mod.rs index 4c64e9f3afb..6260c3b77ff 100644 --- a/src/libstd/sys_common/mod.rs +++ b/src/libstd/sys_common/mod.rs @@ -61,6 +61,7 @@ pub mod util; pub mod wtf8; pub mod bytestring; pub mod process; +pub mod fs; cfg_if! { if #[cfg(any(target_os = "cloudabi", |
