Properly return errors.
This commit is contained in:
@@ -248,15 +248,15 @@ pub(crate) trait FromRawOsError {
|
|||||||
|
|
||||||
pub(crate) type Result<T> = std::result::Result<T, Error>;
|
pub(crate) type Result<T> = std::result::Result<T, Error>;
|
||||||
|
|
||||||
pub(crate) trait WasiErrno {
|
pub(crate) trait AsWasiError {
|
||||||
fn as_wasi_errno(&self) -> wasi::__wasi_errno_t;
|
fn as_wasi_error(&self) -> WasiError;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> WasiErrno for Result<T> {
|
impl<T> AsWasiError for Result<T> {
|
||||||
fn as_wasi_errno(&self) -> wasi::__wasi_errno_t {
|
fn as_wasi_error(&self) -> WasiError {
|
||||||
self.as_ref()
|
self.as_ref()
|
||||||
.err()
|
.err()
|
||||||
.unwrap_or(&Error::ESUCCESS)
|
.unwrap_or(&Error::ESUCCESS)
|
||||||
.as_wasi_errno()
|
.as_wasi_error()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ use crate::fdentry::Descriptor;
|
|||||||
use crate::hostcalls_impl::{ClockEventData, FdEventData};
|
use crate::hostcalls_impl::{ClockEventData, FdEventData};
|
||||||
use crate::memory::*;
|
use crate::memory::*;
|
||||||
use crate::sys::host_impl;
|
use crate::sys::host_impl;
|
||||||
use crate::{wasi, wasi32, Error, Result};
|
use crate::{error::WasiError, wasi, wasi32, Error, Result};
|
||||||
use cpu_time::{ProcessTime, ThreadTime};
|
use cpu_time::{ProcessTime, ThreadTime};
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
use log::{debug, error, trace, warn};
|
use log::{debug, error, trace, warn};
|
||||||
@@ -26,7 +26,7 @@ enum PollState {
|
|||||||
Ready,
|
Ready,
|
||||||
NotReady, // it's not ready, but we didn't wait
|
NotReady, // it's not ready, but we didn't wait
|
||||||
TimedOut, // it's not ready and a timeout has occurred
|
TimedOut, // it's not ready and a timeout has occurred
|
||||||
Error(Error),
|
Error(WasiError), // not using the top-lever Error because it's not Clone
|
||||||
}
|
}
|
||||||
|
|
||||||
enum WaitMode {
|
enum WaitMode {
|
||||||
@@ -82,7 +82,7 @@ impl StdinPoll {
|
|||||||
// Linux returns `POLLIN` in both cases, and we imitate this behavior.
|
// Linux returns `POLLIN` in both cases, and we imitate this behavior.
|
||||||
let resp = match std::io::stdin().lock().fill_buf() {
|
let resp = match std::io::stdin().lock().fill_buf() {
|
||||||
Ok(_) => PollState::Ready,
|
Ok(_) => PollState::Ready,
|
||||||
Err(e) => PollState::Error(e.into()),
|
Err(e) => PollState::Error(Error::from(e).as_wasi_error()),
|
||||||
};
|
};
|
||||||
|
|
||||||
// Notify the requestor about data in stdin. They may have already timed out,
|
// Notify the requestor about data in stdin. They may have already timed out,
|
||||||
@@ -168,13 +168,13 @@ pub(crate) fn clock_time_get(clock_id: wasi::__wasi_clockid_t) -> Result<wasi::_
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn make_rw_event(event: &FdEventData, nbytes: Result<u64>) -> wasi::__wasi_event_t {
|
fn make_rw_event(event: &FdEventData, nbytes: Result<u64>) -> wasi::__wasi_event_t {
|
||||||
use crate::error::WasiErrno;
|
use crate::error::AsWasiError;
|
||||||
let error = nbytes.as_wasi_errno();
|
let error = nbytes.as_wasi_error();
|
||||||
let nbytes = nbytes.unwrap_or_default();
|
let nbytes = nbytes.unwrap_or_default();
|
||||||
wasi::__wasi_event_t {
|
wasi::__wasi_event_t {
|
||||||
userdata: event.userdata,
|
userdata: event.userdata,
|
||||||
r#type: event.r#type,
|
r#type: event.r#type,
|
||||||
error,
|
error: error.as_raw_errno(),
|
||||||
u: wasi::__wasi_event_u_t {
|
u: wasi::__wasi_event_u_t {
|
||||||
fd_readwrite: wasi::__wasi_event_fd_readwrite_t { nbytes, flags: 0 },
|
fd_readwrite: wasi::__wasi_event_fd_readwrite_t { nbytes, flags: 0 },
|
||||||
},
|
},
|
||||||
@@ -356,10 +356,7 @@ pub(crate) fn poll_oneoff(
|
|||||||
PollState::Ready => handle_rw_event(event, events),
|
PollState::Ready => handle_rw_event(event, events),
|
||||||
PollState::NotReady => {} // not immediately available, so just ignore
|
PollState::NotReady => {} // not immediately available, so just ignore
|
||||||
PollState::TimedOut => handle_timeout_event(timeout.unwrap().0, events),
|
PollState::TimedOut => handle_timeout_event(timeout.unwrap().0, events),
|
||||||
PollState::Error(ref e) => {
|
PollState::Error(e) => handle_error_event(event, Error::Wasi(e), events),
|
||||||
error!("FIXME return real error");
|
|
||||||
handle_error_event(event, Error::ENOTSUP, events);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user