[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:
@@ -5,7 +5,6 @@
|
||||
#![allow(non_snake_case)]
|
||||
|
||||
use crate::wasi::*;
|
||||
use crate::{Error, Result};
|
||||
use std::{convert::TryInto, io, mem, slice};
|
||||
use wig::witx_host_types;
|
||||
|
||||
@@ -67,11 +66,13 @@ pub struct Dirent {
|
||||
impl Dirent {
|
||||
/// Serialize the directory entry to the format define by `__wasi_fd_readdir`,
|
||||
/// so that the serialized entries can be concatenated by the implementation.
|
||||
pub fn to_wasi_raw(&self) -> Result<Vec<u8>> {
|
||||
pub fn to_wasi_raw(&self) -> WasiResult<Vec<u8>> {
|
||||
let name = self.name.as_bytes();
|
||||
let namlen = name.len();
|
||||
let dirent_size = mem::size_of::<__wasi_dirent_t>();
|
||||
let offset = dirent_size.checked_add(namlen).ok_or(Error::EOVERFLOW)?;
|
||||
let offset = dirent_size
|
||||
.checked_add(namlen)
|
||||
.ok_or(WasiError::EOVERFLOW)?;
|
||||
|
||||
let mut raw = Vec::<u8>::with_capacity(offset);
|
||||
raw.resize(offset, 0);
|
||||
|
||||
Reference in New Issue
Block a user