]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - rust-src/src/cmd_list.rs
fix fsck service location
[bcachefs-tools-debian] / rust-src / src / cmd_list.rs
index fb7cb1b27f740b2cb1f92cb6c29697df8729f342..fa9c2f2f8701829b7726a97c7086ca423cbc0419 100644 (file)
@@ -1,16 +1,15 @@
 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);
@@ -36,11 +35,12 @@ fn list_btree_formats(fs: &Fs, opt: Cli) -> anyhow::Result<()> {
         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();
     }
 
@@ -53,11 +53,12 @@ fn list_btree_nodes(fs: &Fs, opt: Cli) -> anyhow::Result<()> {
         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();
     }
 
@@ -70,45 +71,29 @@ fn list_nodes_ondisk(fs: &Fs, opt: Cli) -> anyhow::Result<()> {
         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,
@@ -135,7 +120,7 @@ struct Cli {
     /// 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,
@@ -148,12 +133,13 @@ fn cmd_list_inner(opt: Cli) -> anyhow::Result<()> {
     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);
     }
 
@@ -168,20 +154,16 @@ fn cmd_list_inner(opt: Cli) -> anyhow::Result<()> {
         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
     }
 }