mirror of
https://github.com/fluencelabs/wasmer
synced 2025-04-25 10:22:19 +00:00
Introduce some breaking changes to WasiFS API for next release
This commit is contained in:
parent
656b7b36e9
commit
7e640c0dfb
@ -3,7 +3,7 @@ use wasmer_runtime::{func, imports, instantiate};
|
|||||||
use wasmer_runtime_core::vm::Ctx;
|
use wasmer_runtime_core::vm::Ctx;
|
||||||
use wasmer_wasi::{
|
use wasmer_wasi::{
|
||||||
generate_import_object,
|
generate_import_object,
|
||||||
state::{self, WasiFile},
|
state::{self, WasiFile, WasiFsError},
|
||||||
types,
|
types,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -102,6 +102,16 @@ impl WasiFile for LoggingWrapper {
|
|||||||
fn size(&self) -> u64 {
|
fn size(&self) -> u64 {
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
fn set_len(&mut self, _len: u64) -> Result<(), WasiFsError> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
fn unlink(&mut self) -> Result<(), WasiFsError> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
fn bytes_available(&self) -> Result<usize, WasiFsError> {
|
||||||
|
// return an arbitrary amount
|
||||||
|
Ok(1024)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Called by the program when it wants to set itself up
|
/// Called by the program when it wants to set itself up
|
||||||
|
@ -50,7 +50,7 @@ pub enum Kind {
|
|||||||
/// the open file, if it's open
|
/// the open file, if it's open
|
||||||
handle: Option<Box<dyn WasiFile>>,
|
handle: Option<Box<dyn WasiFile>>,
|
||||||
/// The path on the host system where the file is located
|
/// The path on the host system where the file is located
|
||||||
/// This is deprecated and will be removed in 0.7.0 or a shortly thereafter
|
/// This is deprecated and will be removed soon
|
||||||
path: PathBuf,
|
path: PathBuf,
|
||||||
},
|
},
|
||||||
Dir {
|
Dir {
|
||||||
|
@ -9,6 +9,7 @@ use std::{
|
|||||||
path::PathBuf,
|
path::PathBuf,
|
||||||
time::SystemTime,
|
time::SystemTime,
|
||||||
};
|
};
|
||||||
|
use wasmer_runtime_core::debug;
|
||||||
|
|
||||||
/// Error type for external users
|
/// Error type for external users
|
||||||
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
|
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
|
||||||
@ -122,58 +123,57 @@ impl WasiFsError {
|
|||||||
pub trait WasiFile: std::fmt::Debug + Write + Read + Seek {
|
pub trait WasiFile: std::fmt::Debug + Write + Read + Seek {
|
||||||
/// the last time the file was accessed in nanoseconds as a UNIX timestamp
|
/// the last time the file was accessed in nanoseconds as a UNIX timestamp
|
||||||
fn last_accessed(&self) -> __wasi_timestamp_t;
|
fn last_accessed(&self) -> __wasi_timestamp_t;
|
||||||
|
|
||||||
/// the last time the file was modified in nanoseconds as a UNIX timestamp
|
/// the last time the file was modified in nanoseconds as a UNIX timestamp
|
||||||
fn last_modified(&self) -> __wasi_timestamp_t;
|
fn last_modified(&self) -> __wasi_timestamp_t;
|
||||||
|
|
||||||
/// the time at which the file was created in nanoseconds as a UNIX timestamp
|
/// the time at which the file was created in nanoseconds as a UNIX timestamp
|
||||||
fn created_time(&self) -> __wasi_timestamp_t;
|
fn created_time(&self) -> __wasi_timestamp_t;
|
||||||
|
|
||||||
/// set the last time the file was accessed in nanoseconds as a UNIX timestamp
|
/// set the last time the file was accessed in nanoseconds as a UNIX timestamp
|
||||||
// TODO: stablize this in 0.7.0 by removing default impl
|
|
||||||
fn set_last_accessed(&self, _last_accessed: __wasi_timestamp_t) {
|
fn set_last_accessed(&self, _last_accessed: __wasi_timestamp_t) {
|
||||||
panic!("Default implementation for compatibilty in the 0.6.X releases; this will be removed in 0.7.0. Please implement WasiFile::set_last_accessed for your type before then");
|
debug!("{:?} did nothing in WasiFile::set_last_accessed due to using the default implementation", self);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// set the last time the file was modified in nanoseconds as a UNIX timestamp
|
/// set the last time the file was modified in nanoseconds as a UNIX timestamp
|
||||||
// TODO: stablize this in 0.7.0 by removing default impl
|
|
||||||
fn set_last_modified(&self, _last_modified: __wasi_timestamp_t) {
|
fn set_last_modified(&self, _last_modified: __wasi_timestamp_t) {
|
||||||
panic!("Default implementation for compatibilty in the 0.6.X releases; this will be removed in 0.7.0. Please implement WasiFile::set_last_modified for your type before then");
|
debug!("{:?} did nothing in WasiFile::set_last_modified due to using the default implementation", self);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// set the time at which the file was created in nanoseconds as a UNIX timestamp
|
/// set the time at which the file was created in nanoseconds as a UNIX timestamp
|
||||||
// TODO: stablize this in 0.7.0 by removing default impl
|
|
||||||
fn set_created_time(&self, _created_time: __wasi_timestamp_t) {
|
fn set_created_time(&self, _created_time: __wasi_timestamp_t) {
|
||||||
panic!("Default implementation for compatibilty in the 0.6.X releases; this will be removed in 0.7.0. Please implement WasiFile::set_created_time for your type before then");
|
debug!(
|
||||||
|
"{:?} did nothing in WasiFile::set_created_time to using the default implementation",
|
||||||
|
self
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// the size of the file in bytes
|
/// the size of the file in bytes
|
||||||
fn size(&self) -> u64;
|
fn size(&self) -> u64;
|
||||||
|
|
||||||
/// Change the size of the file, if the `new_size` is greater than the current size
|
/// Change the size of the file, if the `new_size` is greater than the current size
|
||||||
/// the extra bytes will be allocated and zeroed
|
/// the extra bytes will be allocated and zeroed
|
||||||
// TODO: stablize this in 0.7.0 by removing default impl
|
fn set_len(&mut self, _new_size: __wasi_filesize_t) -> Result<(), WasiFsError>;
|
||||||
fn set_len(&mut self, _new_size: __wasi_filesize_t) -> Result<(), WasiFsError> {
|
|
||||||
panic!("Default implementation for compatibilty in the 0.6.X releases; this will be removed in 0.7.0. Please implement WasiFile::allocate for your type before then");
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Request deletion of the file
|
/// Request deletion of the file
|
||||||
// TODO: break this out into a WasiPath trait which is dynamically in Kind::File
|
fn unlink(&mut self) -> Result<(), WasiFsError>;
|
||||||
// this change can't be done until before release
|
|
||||||
fn unlink(&mut self) -> Result<(), WasiFsError> {
|
|
||||||
panic!("Default implementation for compatibilty in the 0.6.X releases; this will be removed in 0.7.0. Please implement WasiFile::unlink for your type before then");
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Store file contents and metadata to disk
|
/// Store file contents and metadata to disk
|
||||||
// TODO: stablize this in 0.7.0 by removing default impl
|
/// Default implementation returns `Ok(())`. You should implement this method if you care
|
||||||
|
/// about flushing your cache to permanent storage
|
||||||
fn sync_to_disk(&self) -> Result<(), WasiFsError> {
|
fn sync_to_disk(&self) -> Result<(), WasiFsError> {
|
||||||
panic!("Default implementation for compatibilty in the 0.6.X releases; this will be removed in 0.7.0. Please implement WasiFile::sync_to_disk for your type before then");
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Moves the file to a new location
|
/// Moves the file to a new location
|
||||||
/// NOTE: the signature of this function will change before stabilization
|
/// NOTE: the signature of this function will change before stabilization
|
||||||
// TODO: stablizie this in 0.7.0 or 0.8.0 by removing default impl
|
// TODO: stablizie this in 0.7.0 or 0.8.0 by removing default impl
|
||||||
fn rename_file(&self, _new_name: &std::path::Path) -> Result<(), WasiFsError> {
|
fn rename_file(&self, _new_name: &std::path::Path) -> Result<(), WasiFsError> {
|
||||||
panic!("Default implementation for compatibilty in the 0.6.X releases; this will be removed in 0.7.0 or 0.8.0. Please implement WasiFile::rename_file for your type before then");
|
panic!("Default implementation for now as this method is unstable; this default implementation or this entire method may be removed in a future release.");
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the number of bytes available. This function must not block
|
/// Returns the number of bytes available. This function must not block
|
||||||
fn bytes_available(&self) -> Result<usize, WasiFsError> {
|
fn bytes_available(&self) -> Result<usize, WasiFsError>;
|
||||||
panic!("Default implementation for compatibilty in the 0.6.X releases; this will be removed in 0.7.0 or 0.8.0. Please implement WasiFile::bytes_available for your type before then");
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Used for polling. Default returns `None` because this method cannot be implemented for most types
|
/// Used for polling. Default returns `None` because this method cannot be implemented for most types
|
||||||
/// Returns the underlying host fd
|
/// Returns the underlying host fd
|
||||||
@ -688,6 +688,13 @@ impl WasiFile for Stdout {
|
|||||||
fn size(&self) -> u64 {
|
fn size(&self) -> u64 {
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
fn set_len(&mut self, _new_size: __wasi_filesize_t) -> Result<(), WasiFsError> {
|
||||||
|
debug!("Calling WasiFile::set_len on stdout; this is probably a bug");
|
||||||
|
Err(WasiFsError::PermissionDenied)
|
||||||
|
}
|
||||||
|
fn unlink(&mut self) -> Result<(), WasiFsError> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
fn bytes_available(&self) -> Result<usize, WasiFsError> {
|
fn bytes_available(&self) -> Result<usize, WasiFsError> {
|
||||||
// unwrap is safe because of get_raw_fd implementation
|
// unwrap is safe because of get_raw_fd implementation
|
||||||
@ -772,6 +779,13 @@ impl WasiFile for Stderr {
|
|||||||
fn size(&self) -> u64 {
|
fn size(&self) -> u64 {
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
fn set_len(&mut self, _new_size: __wasi_filesize_t) -> Result<(), WasiFsError> {
|
||||||
|
debug!("Calling WasiFile::set_len on stderr; this is probably a bug");
|
||||||
|
Err(WasiFsError::PermissionDenied)
|
||||||
|
}
|
||||||
|
fn unlink(&mut self) -> Result<(), WasiFsError> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
fn bytes_available(&self) -> Result<usize, WasiFsError> {
|
fn bytes_available(&self) -> Result<usize, WasiFsError> {
|
||||||
// unwrap is safe because of get_raw_fd implementation
|
// unwrap is safe because of get_raw_fd implementation
|
||||||
@ -856,6 +870,14 @@ impl WasiFile for Stdin {
|
|||||||
fn size(&self) -> u64 {
|
fn size(&self) -> u64 {
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
fn set_len(&mut self, _new_size: __wasi_filesize_t) -> Result<(), WasiFsError> {
|
||||||
|
debug!("Calling WasiFile::set_len on stdin; this is probably a bug");
|
||||||
|
Err(WasiFsError::PermissionDenied)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn unlink(&mut self) -> Result<(), WasiFsError> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
fn bytes_available(&self) -> Result<usize, WasiFsError> {
|
fn bytes_available(&self) -> Result<usize, WasiFsError> {
|
||||||
// unwrap is safe because of get_raw_fd implementation
|
// unwrap is safe because of get_raw_fd implementation
|
||||||
|
@ -1729,7 +1729,7 @@ pub fn path_open(
|
|||||||
path_to_symlink,
|
path_to_symlink,
|
||||||
relative_path,
|
relative_path,
|
||||||
} => {
|
} => {
|
||||||
// I think this should return an error
|
// I think this should return an error (because symlinks should be resolved away by the path traversal)
|
||||||
// TODO: investigate this
|
// TODO: investigate this
|
||||||
unimplemented!("SYMLINKS IN PATH_OPEN");
|
unimplemented!("SYMLINKS IN PATH_OPEN");
|
||||||
}
|
}
|
||||||
@ -2202,7 +2202,7 @@ pub fn path_unlink_file(
|
|||||||
} else {
|
} else {
|
||||||
// File is closed
|
// File is closed
|
||||||
// problem with the abstraction, we can't call unlink because there's no handle
|
// problem with the abstraction, we can't call unlink because there's no handle
|
||||||
// TODO: replace this code in 0.7.0
|
// TODO: replace this code
|
||||||
wasi_try!(std::fs::remove_file(path).map_err(|_| __WASI_EIO));
|
wasi_try!(std::fs::remove_file(path).map_err(|_| __WASI_EIO));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user