diff --git a/bch_bindgen/src/lib.rs b/bch_bindgen/src/lib.rs index d903735e..cd8e9cc2 100644 --- a/bch_bindgen/src/lib.rs +++ b/bch_bindgen/src/lib.rs @@ -106,6 +106,34 @@ impl FromStr for c::btree_id { } } +#[derive(Debug)] +pub struct InvalidBkeyType; + +impl fmt::Display for InvalidBkeyType { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "invalid bkey type") + } +} + +impl Error for InvalidBkeyType { +} + +impl FromStr for c::bch_bkey_type { + type Err = InvalidBkeyType; + + fn from_str(s: &str) -> Result { + let s = CString::new(s).unwrap(); + let p = s.as_ptr(); + + let v = unsafe {c::match_string(c::bch2_bkey_types[..].as_ptr(), (-(1 as isize)) as usize, p)}; + if v >= 0 { + Ok(unsafe { std::mem::transmute(v) }) + } else { + Err(InvalidBkeyType) + } + } +} + impl c::printbuf { fn new() -> c::printbuf { let mut buf: c::printbuf = Default::default(); diff --git a/src/commands/list.rs b/src/commands/list.rs index 0ed6be05..2cb93962 100644 --- a/src/commands/list.rs +++ b/src/commands/list.rs @@ -21,7 +21,18 @@ fn list_keys(fs: &Fs, opt: Cli) -> anyhow::Result<()> { break; } + match opt.bkey_type { + Some(ty) => { + if k.k.type_ != ty as u8 { + iter.advance(); + continue; + } + } + _ => {} + }; + println!("{}", k.to_text(fs)); + iter.advance(); } @@ -97,6 +108,10 @@ pub struct Cli { #[arg(short, long, default_value_t=bcachefs::btree_id::BTREE_ID_extents)] btree: bcachefs::btree_id, + /// Bkey type to list + #[arg(short='k', long)] + bkey_type: Option, + /// Btree depth to descend to (0 == leaves) #[arg(short, long, default_value_t=0)] level: u32,