From a1081ea79c8bdfaabb286e530648461188c73910 Mon Sep 17 00:00:00 2001 From: Alex Zenla Date: Tue, 30 Jan 2024 02:05:37 -0800 Subject: [PATCH] xenevtchn: convert to using thiserror --- xen/xenclient/src/lib.rs | 5 ++- xen/xenevtchn/Cargo.toml | 1 + xen/xenevtchn/examples/simple.rs | 5 +-- xen/xenevtchn/src/error.rs | 11 ++++++ xen/xenevtchn/src/lib.rs | 57 ++++++-------------------------- 5 files changed, 27 insertions(+), 52 deletions(-) create mode 100644 xen/xenevtchn/src/error.rs diff --git a/xen/xenclient/src/lib.rs b/xen/xenclient/src/lib.rs index dc8fc78..c3dc8c2 100644 --- a/xen/xenclient/src/lib.rs +++ b/xen/xenclient/src/lib.rs @@ -19,7 +19,6 @@ use std::time::Duration; use uuid::Uuid; use xencall::sys::CreateDomain; use xencall::{XenCall, XenCallError}; -use xenevtchn::EventChannelError; use xenstore::client::{ XsPermission, XsdClient, XsdInterface, XS_PERM_NONE, XS_PERM_READ, XS_PERM_READ_WRITE, }; @@ -78,8 +77,8 @@ impl From for XenClientError { } } -impl From for XenClientError { - fn from(value: EventChannelError) -> Self { +impl From for XenClientError { + fn from(value: xenevtchn::error::Error) -> Self { XenClientError::new(value.to_string().as_str()) } } diff --git a/xen/xenevtchn/Cargo.toml b/xen/xenevtchn/Cargo.toml index faf62e9..1e05e6c 100644 --- a/xen/xenevtchn/Cargo.toml +++ b/xen/xenevtchn/Cargo.toml @@ -5,6 +5,7 @@ edition = "2021" resolver = "2" [dependencies] +thiserror = { workspace = true } log = { workspace = true } [dependencies.nix] diff --git a/xen/xenevtchn/examples/simple.rs b/xen/xenevtchn/examples/simple.rs index 651b441..85d6b43 100644 --- a/xen/xenevtchn/examples/simple.rs +++ b/xen/xenevtchn/examples/simple.rs @@ -1,6 +1,7 @@ -use xenevtchn::{EventChannel, EventChannelError}; +use xenevtchn::error::Result; +use xenevtchn::EventChannel; -fn main() -> Result<(), EventChannelError> { +fn main() -> Result<()> { let mut channel = EventChannel::open()?; println!("Channel opened."); let port = channel.bind_unbound_port(1)?; diff --git a/xen/xenevtchn/src/error.rs b/xen/xenevtchn/src/error.rs new file mode 100644 index 0000000..6c5f7b5 --- /dev/null +++ b/xen/xenevtchn/src/error.rs @@ -0,0 +1,11 @@ +use std::io; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + #[error("kernel error")] + Kernel(#[from] nix::errno::Errno), + #[error("io issue encountered")] + Io(#[from] io::Error), +} + +pub type Result = std::result::Result; diff --git a/xen/xenevtchn/src/lib.rs b/xen/xenevtchn/src/lib.rs index 15d0a8c..165362c 100644 --- a/xen/xenevtchn/src/lib.rs +++ b/xen/xenevtchn/src/lib.rs @@ -1,9 +1,9 @@ +pub mod error; pub mod sys; +use crate::error::Result; use crate::sys::{BindInterdomain, BindUnboundPort, BindVirq, Notify, UnbindPort}; -use nix::errno::Errno; -use std::error::Error; -use std::fmt::{Display, Formatter}; + use std::fs::{File, OpenOptions}; use std::os::fd::AsRawFd; @@ -11,45 +11,8 @@ pub struct EventChannel { pub handle: File, } -#[derive(Debug)] -pub struct EventChannelError { - message: String, -} - -impl EventChannelError { - pub fn new(msg: &str) -> EventChannelError { - EventChannelError { - message: msg.to_string(), - } - } -} - -impl Display for EventChannelError { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.message) - } -} - -impl Error for EventChannelError { - fn description(&self) -> &str { - &self.message - } -} - -impl From for EventChannelError { - fn from(value: std::io::Error) -> Self { - EventChannelError::new(value.to_string().as_str()) - } -} - -impl From for EventChannelError { - fn from(value: Errno) -> Self { - EventChannelError::new(value.to_string().as_str()) - } -} - impl EventChannel { - pub fn open() -> Result { + pub fn open() -> Result { let file = OpenOptions::new() .read(true) .write(true) @@ -57,14 +20,14 @@ impl EventChannel { Ok(EventChannel { handle: file }) } - pub fn bind_virq(&mut self, virq: u32) -> Result { + pub fn bind_virq(&mut self, virq: u32) -> Result { unsafe { let mut request = BindVirq { virq }; Ok(sys::bind_virq(self.handle.as_raw_fd(), &mut request)? as u32) } } - pub fn bind_interdomain(&mut self, domid: u32, port: u32) -> Result { + pub fn bind_interdomain(&mut self, domid: u32, port: u32) -> Result { unsafe { let mut request = BindInterdomain { remote_domain: domid, @@ -74,7 +37,7 @@ impl EventChannel { } } - pub fn bind_unbound_port(&mut self, domid: u32) -> Result { + pub fn bind_unbound_port(&mut self, domid: u32) -> Result { unsafe { let mut request = BindUnboundPort { remote_domain: domid, @@ -83,21 +46,21 @@ impl EventChannel { } } - pub fn unbind(&mut self, port: u32) -> Result { + pub fn unbind(&mut self, port: u32) -> Result { unsafe { let mut request = UnbindPort { port }; Ok(sys::unbind(self.handle.as_raw_fd(), &mut request)? as u32) } } - pub fn notify(&mut self, port: u32) -> Result { + pub fn notify(&mut self, port: u32) -> Result { unsafe { let mut request = Notify { port }; Ok(sys::notify(self.handle.as_raw_fd(), &mut request)? as u32) } } - pub fn reset(&mut self) -> Result { + pub fn reset(&mut self) -> Result { unsafe { Ok(sys::reset(self.handle.as_raw_fd())? as u32) } } }