diff options
| author | Ingvar Stepanyan <rreverser@google.com> | 2020-02-12 19:51:30 +0000 |
|---|---|---|
| committer | Ingvar Stepanyan <rreverser@google.com> | 2020-02-12 20:08:41 +0000 |
| commit | 8fb8bb4b3ff25570a7a9b105c1a569bb2307f25f (patch) | |
| tree | 427fc7af832e04950ea32178f385776ced5bf8f8 /src/libstd/sys | |
| parent | 2d2be570970d784db5539a1d309cd22b85be910a (diff) | |
| download | rust-8fb8bb4b3ff25570a7a9b105c1a569bb2307f25f.tar.gz rust-8fb8bb4b3ff25570a7a9b105c1a569bb2307f25f.zip | |
Fix std::fs::copy on WASI target
Previously `std::fs::copy` on wasm32-wasi would reuse code from the `sys_common` module and would successfully copy contents of the file just to fail right before closing it. This was happening because `sys_common::copy` tries to copy permissions of the file, but permissions are not a thing in WASI (at least yet) and `set_permissions` is implemented as an unconditional runtime error. This change instead adds a custom working implementation of `std::fs::copy` (like Rust already has on some other targets) that doesn't try to call `set_permissions` and is essentially a thin wrapper around `std::io::copy`. Fixes #68560.
Diffstat (limited to 'src/libstd/sys')
| -rw-r--r-- | src/libstd/sys/wasi/fs.rs | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/src/libstd/sys/wasi/fs.rs b/src/libstd/sys/wasi/fs.rs index 04bfdf67e12..a11f61fdd69 100644 --- a/src/libstd/sys/wasi/fs.rs +++ b/src/libstd/sys/wasi/fs.rs @@ -12,7 +12,6 @@ use crate::sys::time::SystemTime; use crate::sys::unsupported; use crate::sys_common::FromInner; -pub use crate::sys_common::fs::copy; pub use crate::sys_common::fs::remove_dir_all; pub struct File { @@ -647,3 +646,12 @@ fn open_parent(p: &Path) -> io::Result<(ManuallyDrop<WasiFd>, PathBuf)> { pub fn osstr2str(f: &OsStr) -> io::Result<&str> { f.to_str().ok_or_else(|| io::Error::new(io::ErrorKind::Other, "input must be utf-8")) } + +pub fn copy(from: &Path, to: &Path) -> io::Result<u64> { + use crate::fs::File; + + let mut reader = File::open(from)?; + let mut writer = File::create(to)?; + + io::copy(&mut reader, &mut writer) +} |
