use atty::Stream;
-use bch_bindgen::error;
+use log::{error};
use bch_bindgen::bcachefs;
use bch_bindgen::opt_set;
use bch_bindgen::fs::Fs;
+use bch_bindgen::bkey::BkeySC;
use bch_bindgen::btree::BtreeTrans;
use bch_bindgen::btree::BtreeIter;
use bch_bindgen::btree::BtreeNodeIter;
use bch_bindgen::btree::BtreeIterFlags;
-use clap::Parser;
-use colored::Colorize;
-use std::ffi::{CStr, OsStr, c_int, c_char};
-use std::os::unix::ffi::OsStrExt;
+use clap::{Parser};
+use std::ffi::{c_int, OsStr};
fn list_keys(fs: &Fs, opt: Cli) -> anyhow::Result<()> {
let trans = BtreeTrans::new(fs);
0, opt.level,
BtreeIterFlags::PREFETCH);
- while let Some(b) = iter.peek()? {
+ while let Some(b) = iter.peek_and_restart()? {
if b.key.k.p > opt.end {
break;
}
+ println!("{}", b.to_text(fs));
iter.advance();
}
0, opt.level,
BtreeIterFlags::PREFETCH);
- while let Some(b) = iter.peek()? {
+ while let Some(b) = iter.peek_and_restart()? {
if b.key.k.p > opt.end {
break;
}
+ println!("{}", BkeySC::from(&b.key).to_text(fs));
iter.advance();
}
0, opt.level,
BtreeIterFlags::PREFETCH);
- while let Some(b) = iter.peek()? {
+ while let Some(b) = iter.peek_and_restart()? {
if b.key.k.p > opt.end {
break;
}
+ println!("{}", b.ondisk_to_text(fs));
iter.advance();
}
Ok(())
}
-fn list_nodes_keys(fs: &Fs, opt: Cli) -> anyhow::Result<()> {
- let trans = BtreeTrans::new(fs);
- let mut iter = BtreeNodeIter::new(&trans, opt.btree, opt.start,
- 0, opt.level,
- BtreeIterFlags::PREFETCH);
-
- while let Some(b) = iter.peek()? {
- if b.key.k.p > opt.end {
- break;
- }
-
- iter.advance();
- }
-
- Ok(())
-}
-
-#[derive(Clone, clap::ValueEnum)]
+#[derive(Clone, clap::ValueEnum, Debug)]
enum Mode {
Keys,
Formats,
Nodes,
NodesOndisk,
- NodesKeys,
}
-#[derive(Parser)]
-struct Cli {
+/// List filesystem metadata in textual form
+#[derive(Parser, Debug)]
+pub struct Cli {
/// Btree to list from
#[arg(short, long, default_value_t=bcachefs::btree_id::BTREE_ID_extents)]
btree: bcachefs::btree_id,
/// Force color on/off. Default: autodetect tty
#[arg(short, long, action = clap::ArgAction::Set, default_value_t=atty::is(Stream::Stdout))]
colorize: bool,
-
+
/// Verbose mode
#[arg(short, long)]
verbose: bool,
let mut fs_opts: bcachefs::bch_opts = Default::default();
opt_set!(fs_opts, nochanges, 1);
+ opt_set!(fs_opts, read_only, 1);
opt_set!(fs_opts, norecovery, 1);
opt_set!(fs_opts, degraded, 1);
opt_set!(fs_opts, errors, bcachefs::bch_error_actions::BCH_ON_ERROR_continue as u8);
if opt.fsck {
- opt_set!(fs_opts, fix_errors, bcachefs::fsck_err_opts::FSCK_OPT_YES as u8);
+ opt_set!(fs_opts, fix_errors, bcachefs::fsck_err_opts::FSCK_FIX_yes as u8);
opt_set!(fs_opts, norecovery, 0);
}
Mode::Formats => list_btree_formats(&fs, opt),
Mode::Nodes => list_btree_nodes(&fs, opt),
Mode::NodesOndisk => list_nodes_ondisk(&fs, opt),
- Mode::NodesKeys => list_nodes_keys(&fs, opt),
}
}
-#[no_mangle]
-pub extern "C" fn cmd_rust_list(argc: c_int, argv: *const *const c_char) {
- let argv: Vec<_> = (0..argc)
- .map(|i| unsafe { CStr::from_ptr(*argv.add(i as usize)) })
- .map(|i| OsStr::from_bytes(i.to_bytes()))
- .collect();
-
+pub fn cmd_list(argv: Vec<&OsStr>) -> c_int {
let opt = Cli::parse_from(argv);
colored::control::set_override(opt.colorize);
if let Err(e) = cmd_list_inner(opt) {
error!("Fatal error: {}", e);
+ 1
+ } else {
+ 0
}
}