forked from Proxmox/proxmox
move io error helpers to proxmox-lang
this removes proxmox_sys as a dependecy for proxmox-async Signed-off-by: Dominik Csapak <d.csapak@proxmox.com> Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
This commit is contained in:
parent
46580ee3e9
commit
d4b4115400
@ -20,9 +20,9 @@ pin-utils = "0.1.0"
|
|||||||
tokio = { version = "1.0", features = ["fs", "net", "rt", "rt-multi-thread", "sync"] }
|
tokio = { version = "1.0", features = ["fs", "net", "rt", "rt-multi-thread", "sync"] }
|
||||||
walkdir = "2"
|
walkdir = "2"
|
||||||
|
|
||||||
proxmox-sys = { path = "../proxmox-sys", version = "0.2.0" }
|
|
||||||
proxmox-io = { path = "../proxmox-io", version = "1", features = [ "tokio" ] }
|
proxmox-io = { path = "../proxmox-io", version = "1", features = [ "tokio" ] }
|
||||||
proxmox-time = { path = "../proxmox-time", version = "1" }
|
proxmox-time = { path = "../proxmox-time", version = "1" }
|
||||||
|
proxmox-lang = { path = "../proxmox-lang", version = "1" }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
tokio = { version = "1.6", features = [ "macros" ] }
|
tokio = { version = "1.6", features = [ "macros" ] }
|
||||||
|
@ -10,7 +10,7 @@ use futures::stream::Stream;
|
|||||||
use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt};
|
use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt};
|
||||||
|
|
||||||
use proxmox_io::ByteBuffer;
|
use proxmox_io::ByteBuffer;
|
||||||
use proxmox_sys::io_format_err;
|
use proxmox_lang::io_format_err;
|
||||||
|
|
||||||
const BUFFER_SIZE: usize = 8192;
|
const BUFFER_SIZE: usize = 8192;
|
||||||
|
|
||||||
|
@ -12,8 +12,7 @@ use tokio::io::AsyncWrite;
|
|||||||
use tokio::sync::mpsc::Sender;
|
use tokio::sync::mpsc::Sender;
|
||||||
|
|
||||||
use proxmox_io::ByteBuffer;
|
use proxmox_io::ByteBuffer;
|
||||||
use proxmox_sys::error::io_err_other;
|
use proxmox_lang::{error::io_err_other, io_format_err};
|
||||||
use proxmox_sys::io_format_err;
|
|
||||||
|
|
||||||
/// Wrapper around tokio::sync::mpsc::Sender, which implements Write
|
/// Wrapper around tokio::sync::mpsc::Sender, which implements Write
|
||||||
pub struct AsyncChannelWriter {
|
pub struct AsyncChannelWriter {
|
||||||
|
@ -23,6 +23,7 @@ tokio-openssl = { version = "0.6.1", optional = true }
|
|||||||
|
|
||||||
proxmox-sys = { path = "../proxmox-sys", optional = true, version = "0.2.0" }
|
proxmox-sys = { path = "../proxmox-sys", optional = true, version = "0.2.0" }
|
||||||
proxmox-io = { path = "../proxmox-io", optional = true, version = "1.0.0" }
|
proxmox-io = { path = "../proxmox-io", optional = true, version = "1.0.0" }
|
||||||
|
proxmox-lang = { path = "../proxmox-lang", optional = true, version = "1.0.0" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = []
|
default = []
|
||||||
@ -36,6 +37,7 @@ websocket = [
|
|||||||
"openssl",
|
"openssl",
|
||||||
"proxmox-sys",
|
"proxmox-sys",
|
||||||
"proxmox-io/tokio",
|
"proxmox-io/tokio",
|
||||||
|
"proxmox-lang",
|
||||||
"tokio/io-util",
|
"tokio/io-util",
|
||||||
"tokio/sync",
|
"tokio/sync",
|
||||||
]
|
]
|
||||||
|
@ -23,7 +23,7 @@ use futures::future::FutureExt;
|
|||||||
use futures::ready;
|
use futures::ready;
|
||||||
|
|
||||||
use proxmox_io::ByteBuffer;
|
use proxmox_io::ByteBuffer;
|
||||||
use proxmox_sys::error::io_err_other;
|
use proxmox_lang::error::io_err_other;
|
||||||
|
|
||||||
// see RFC6455 section 7.4.1
|
// see RFC6455 section 7.4.1
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
53
proxmox-lang/src/error.rs
Normal file
53
proxmox-lang/src/error.rs
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
//! A set of macros/helpers for I/O handling. These provide for `std::io::Error` what `anyhow` provides
|
||||||
|
//! for `anyhow::Error.`
|
||||||
|
|
||||||
|
use std::io;
|
||||||
|
|
||||||
|
/// Helper to convert non-system-errors into an `io::Error` or `io::ErrorKind::Other`.
|
||||||
|
///
|
||||||
|
/// A more convenient way is to use the `io_format_err!` macro.
|
||||||
|
pub fn io_err_other<E: ToString>(e: E) -> io::Error {
|
||||||
|
io::Error::new(std::io::ErrorKind::Other, e.to_string())
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// Like anyhow's `format_err` but producing a `std::io::Error`.
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! io_format_err {
|
||||||
|
($($msg:tt)+) => {
|
||||||
|
::std::io::Error::new(::std::io::ErrorKind::Other, format!($($msg)+))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Shortcut to return an `io::Error::last_os_error`.
|
||||||
|
///
|
||||||
|
/// This is effectively `return Err(::std::io::Error::last_os_error().into());`.
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! io_bail_last {
|
||||||
|
() => {{
|
||||||
|
return Err(::std::io::Error::last_os_error().into());
|
||||||
|
}};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Like anyhow's `bail` but producing a `std::io::Error`.
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! io_bail {
|
||||||
|
($($msg:tt)+) => {{
|
||||||
|
return Err($crate::io_format_err!($($msg)+));
|
||||||
|
}};
|
||||||
|
}
|
||||||
|
|
||||||
|
#[doc(hidden)]
|
||||||
|
/// Non-panicking assertion: shortcut for returning an `io::Error` if the condition is not met.
|
||||||
|
/// Essentially: `if !expr { io_bail_last!() }`.
|
||||||
|
///
|
||||||
|
/// Note that this uses `errno`, care must be taken not to overwrite it with different value as a
|
||||||
|
/// side effect.
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! io_assert {
|
||||||
|
($value:expr) => {
|
||||||
|
if !$value {
|
||||||
|
$crate::io_bail_last!();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
mod constnamedbitmap;
|
mod constnamedbitmap;
|
||||||
|
|
||||||
|
pub mod error;
|
||||||
pub mod ops;
|
pub mod ops;
|
||||||
|
|
||||||
/// Macro to write error-handling blocks (like perl eval {})
|
/// Macro to write error-handling blocks (like perl eval {})
|
||||||
|
@ -18,12 +18,7 @@ use std::io;
|
|||||||
use nix::errno::Errno;
|
use nix::errno::Errno;
|
||||||
use nix::Error;
|
use nix::Error;
|
||||||
|
|
||||||
/// Helper to convert non-system-errors into an `io::Error` or `io::ErrorKind::Other`.
|
use proxmox_lang::error::io_err_other;
|
||||||
///
|
|
||||||
/// A more convenient way is to use the `io_format_err!` macro.
|
|
||||||
pub fn io_err_other<E: ToString>(e: E) -> io::Error {
|
|
||||||
io::Error::new(std::io::ErrorKind::Other, e.to_string())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// This trait should be implemented for error types which can represent system errors. Note that
|
/// This trait should be implemented for error types which can represent system errors. Note that
|
||||||
/// it is discouraged to try to map non-system errors to with this trait, since users of this trait
|
/// it is discouraged to try to map non-system errors to with this trait, since users of this trait
|
||||||
|
@ -11,9 +11,9 @@ use nix::sys::stat::Mode;
|
|||||||
use nix::unistd::Pid;
|
use nix::unistd::Pid;
|
||||||
use nix::NixPath;
|
use nix::NixPath;
|
||||||
|
|
||||||
use proxmox_lang::c_str;
|
use proxmox_lang::{c_str, error::io_err_other};
|
||||||
|
|
||||||
use crate::error::{io_err_other, SysResult};
|
use crate::error::SysResult;
|
||||||
use crate::linux::procfs::{MountInfo, PidStat};
|
use crate::linux::procfs::{MountInfo, PidStat};
|
||||||
use crate::fd::Fd;
|
use crate::fd::Fd;
|
||||||
use crate::{c_result, c_try};
|
use crate::{c_result, c_try};
|
||||||
|
@ -1,47 +1,3 @@
|
|||||||
//! A set of macros for I/O handling. These provide for `std::io::Error` what `anyhow` provides
|
|
||||||
//! for `anyhow::Error.`
|
|
||||||
|
|
||||||
/// Like anyhow's `format_err` but producing a `std::io::Error`.
|
|
||||||
#[macro_export]
|
|
||||||
macro_rules! io_format_err {
|
|
||||||
($($msg:tt)+) => {
|
|
||||||
::std::io::Error::new(::std::io::ErrorKind::Other, format!($($msg)+))
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Shortcut to return an `io::Error::last_os_error`.
|
|
||||||
///
|
|
||||||
/// This is effectively `return Err(::std::io::Error::last_os_error().into());`.
|
|
||||||
#[macro_export]
|
|
||||||
macro_rules! io_bail_last {
|
|
||||||
() => {{
|
|
||||||
return Err(::std::io::Error::last_os_error().into());
|
|
||||||
}};
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Like anyhow's `bail` but producing a `std::io::Error`.
|
|
||||||
#[macro_export]
|
|
||||||
macro_rules! io_bail {
|
|
||||||
($($msg:tt)+) => {{
|
|
||||||
return Err($crate::io_format_err!($($msg)+));
|
|
||||||
}};
|
|
||||||
}
|
|
||||||
|
|
||||||
#[doc(hidden)]
|
|
||||||
/// Non-panicking assertion: shortcut for returning an `io::Error` if the condition is not met.
|
|
||||||
/// Essentially: `if !expr { io_bail_last!() }`.
|
|
||||||
///
|
|
||||||
/// Note that this uses `errno`, care must be taken not to overwrite it with different value as a
|
|
||||||
/// side effect.
|
|
||||||
#[macro_export]
|
|
||||||
macro_rules! io_assert {
|
|
||||||
($value:expr) => {
|
|
||||||
if !$value {
|
|
||||||
$crate::io_bail_last!();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Roughly equivalent to `nix::Errno::result`. Turns a `-1` into an `io::Error`, while passing
|
/// Roughly equivalent to `nix::Errno::result`. Turns a `-1` into an `io::Error`, while passing
|
||||||
/// other values through as `Ok(n)`.
|
/// other values through as `Ok(n)`.
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
|
@ -7,7 +7,9 @@ use std::{io, mem, ptr};
|
|||||||
|
|
||||||
use nix::sys::mman;
|
use nix::sys::mman;
|
||||||
|
|
||||||
use crate::error::{io_err_other, SysError};
|
use proxmox_lang::error::io_err_other;
|
||||||
|
|
||||||
|
use crate::error::{SysError};
|
||||||
|
|
||||||
pub struct Mmap<T> {
|
pub struct Mmap<T> {
|
||||||
data: *mut T,
|
data: *mut T,
|
||||||
|
Loading…
Reference in New Issue
Block a user