[wasi-common]: clean up error handling (#1253)
* Introduce WasiCtxBuilderError error type `WasiCtxBuilderError` is the `wasi-common` client-facing error type which is exclusively thrown when building a new `WasiCtx` instance. As such, building such an instance should not require the client to understand different WASI errno values as was assumed until now. This commit is a first step at streamlining error handling in `wasi-common` and makes way for the `wiggle` crate. When adding the `WasiCtxBuilderError`, I've had to do two things of notable importance: 1. I've removed a couple of `ok_or` calls in `WasiCtxBuilder::build` and replaced them with `unwrap`s, following the same pattern in different builder methods above. This is fine since we _always_ operate on non-empty `Option`s in `WasiCtxBuilder` thus `unwrap`ing will never fail. On the other hand, this might be a good opportunity to rethink the structure of our builder, and how we good remove the said `Option`s especially since we always populate them with empty containers to begin with. I understand this is to make chaining of builder methods easier which take and return `&mut self` and the same applies to `WasiCtxBuilder::build(&mut self)` method, but perhaps it would more cleanly signal the intentions if we simply moved `WasiCtxBuilder` instance around. Food for thought! 2. Methods specific to determining rights of passed around `std::fs::File` objects when populating `WasiCtx` `FdEntry` entities now return `io::Error` directly so that we can reuse them in `WasiCtxBuilder` methods (returning `WasiCtxBuilderError` error type), and in syscalls (returning WASI errno). * Return WasiError directly in syscalls Also, removes `error::Error` type altogether. Now, `io::Error` and related are automatically converted to their corresponding WASI errno value encapsulated as `WasiError`. While here, it made sense to me to move `WasiError` to `wasi` module which will align itself well with the upcoming changes introduced by `wiggle`. To different standard `Result` from WASI specific, I've created a helper alias `WasiResult` also residing in `wasi` module. * Update wig * Add from ffi::NulError and pass context to NotADirectory * Add dummy commit to test CI
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
use crate::fs::Metadata;
|
||||
use crate::{host, hostcalls, hostcalls_impl, wasi, Result, WasiCtx};
|
||||
use crate::wasi::{self, WasiResult};
|
||||
use crate::{host, hostcalls, hostcalls_impl, WasiCtx};
|
||||
use std::io;
|
||||
|
||||
/// A reference to an open file on the filesystem.
|
||||
@@ -34,7 +35,7 @@ impl<'ctx> File<'ctx> {
|
||||
/// This corresponds to [`std::fs::File::sync_all`].
|
||||
///
|
||||
/// [`std::fs::File::sync_all`]: https://doc.rust-lang.org/std/fs/struct.File.html#method.sync_all
|
||||
pub fn sync_all(&self) -> Result<()> {
|
||||
pub fn sync_all(&self) -> WasiResult<()> {
|
||||
unsafe {
|
||||
hostcalls_impl::fd_sync(self.ctx, &mut [], self.fd)?;
|
||||
}
|
||||
@@ -47,7 +48,7 @@ impl<'ctx> File<'ctx> {
|
||||
/// This corresponds to [`std::fs::File::sync_data`].
|
||||
///
|
||||
/// [`std::fs::File::sync_data`]: https://doc.rust-lang.org/std/fs/struct.File.html#method.sync_data
|
||||
pub fn sync_data(&self) -> Result<()> {
|
||||
pub fn sync_data(&self) -> WasiResult<()> {
|
||||
unsafe {
|
||||
hostcalls_impl::fd_datasync(self.ctx, &mut [], self.fd)?;
|
||||
}
|
||||
@@ -60,7 +61,7 @@ impl<'ctx> File<'ctx> {
|
||||
/// This corresponds to [`std::fs::File::set_len`].
|
||||
///
|
||||
/// [`std::fs::File::set_len`]: https://doc.rust-lang.org/std/fs/struct.File.html#method.set_len
|
||||
pub fn set_len(&self, size: u64) -> Result<()> {
|
||||
pub fn set_len(&self, size: u64) -> WasiResult<()> {
|
||||
unsafe {
|
||||
hostcalls_impl::fd_filestat_set_size(self.ctx, &mut [], self.fd, size)?;
|
||||
}
|
||||
@@ -72,7 +73,7 @@ impl<'ctx> File<'ctx> {
|
||||
/// This corresponds to [`std::fs::File::metadata`].
|
||||
///
|
||||
/// [`std::fs::File::metadata`]: https://doc.rust-lang.org/std/fs/struct.File.html#method.metadata
|
||||
pub fn metadata(&self) -> Result<Metadata> {
|
||||
pub fn metadata(&self) -> WasiResult<Metadata> {
|
||||
Ok(Metadata {})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user