bcachefs-tools/rust-src/bch_bindgen/src/errcode.rs
Kent Overstreet e0e06d95f8 Rust: Start of cmd_list rewrite
This is a _very_ preliminary rewrite of the cmd_list tool in rust, which
is intended to be a testing ground for a safe interface in Rust to the
core btree interface. This adds rust wrappers for:

bch_fs:		provides bch2_fs_open(), bch2_fs_stop
btree_trans:	provides bch2_trans_init(), bch2_trans_exit()
btree_iter:	provides peek, peek_and_restart, advance
bch_errcode:	implements Display (wraps bch2_err_str())
bpos:		implements Ord (wraps bpos_cmp())
bkey_s_c:	implements Display (wraps bch2_bkey_val_to_text())

and other assorted types.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-02-27 21:45:42 -05:00

41 lines
1.0 KiB
Rust

use crate::bcachefs;
use std::ffi::CStr;
use std::fmt;
pub use crate::c::bch_errcode;
impl fmt::Display for bch_errcode {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let s = unsafe { CStr::from_ptr(bcachefs::bch2_err_str(*self as i32)) };
write!(f, "{:?}", s)
}
}
/* Can we make a function generic over ptr constness? */
pub fn errptr_to_result<T>(p: *mut T) -> Result<*mut T, bch_errcode> {
let addr = p as usize;
let max_err: isize = -4096;
if addr > max_err as usize {
let addr = addr as i32;
let err: bch_errcode = unsafe { std::mem::transmute(-addr) };
Err(err)
} else {
Ok(p)
}
}
pub fn errptr_to_result_c<T>(p: *const T) -> Result<*const T, bch_errcode> {
let addr = p as usize;
let max_err: isize = -4096;
if addr > max_err as usize {
let addr = addr as i32;
let err: bch_errcode = unsafe { std::mem::transmute(-addr) };
Err(err)
} else {
Ok(p)
}
}
impl std::error::Error for bch_errcode {}