#ifndef BCACHEFS_NO_RUST
if (strstr(full_cmd, "mount"))
- return cmd_mount(argc, argv);
+ return rust_main(argc, argv, "mount");
#endif
setvbuf(stdout, NULL, _IOLBF, 0);
if (!strcmp(cmd, "dump"))
return cmd_dump(argc, argv);
-#ifndef BCACHEFS_NO_RUST
- if (!strcmp(cmd, "list"))
- return cmd_list(argc, argv);
-#endif
if (!strcmp(cmd, "list_journal"))
return cmd_list_journal(argc, argv);
if (!strcmp(cmd, "kill_btree_node"))
if (!strcmp(cmd, "setattr"))
return cmd_setattr(argc, argv);
#ifndef BCACHEFS_NO_RUST
- if (!strcmp(cmd, "mount"))
- return cmd_mount(argc, argv);
- if (strstr(cmd, "completions"))
- return cmd_completions(argc, argv);
+ if (!strcmp(cmd, "list") ||
+ !strcmp(cmd, "mount") ||
+ !strcmp(cmd, "completions"))
+ return rust_main(argc, argv, cmd);
#endif
#ifdef BCACHEFS_FUSE
int cmd_fsck(int argc, char *argv[]);
int cmd_dump(int argc, char *argv[]);
-int cmd_list(int argc, char *argv[]);
int cmd_list_journal(int argc, char *argv[]);
int cmd_kill_btree_node(int argc, char *argv[]);
int cmd_subvolume_snapshot(int argc, char *argv[]);
int cmd_fusemount(int argc, char *argv[]);
-int cmd_mount(int argc, char *argv[]);
-int cmd_completions(int argc, char *argv[]);
+
+int rust_main(int argc, char *argv[], char *cmd);
#endif /* _CMDS_H */
-use crate::transform_c_args;
use clap::{Command, CommandFactory, Parser};
use clap_complete::{generate, Generator, Shell};
-use std::ffi::{c_char, c_int};
+use std::ffi::{c_int, OsStr};
use std::io;
/// Generate shell completions
generate(gen, cmd, cmd.get_name().to_string(), &mut io::stdout());
}
-#[no_mangle]
-#[allow(clippy::not_unsafe_ptr_arg_deref)]
-pub extern "C" fn cmd_completions(argc: c_int, argv: *const *const c_char) -> c_int {
- transform_c_args!(argv, argc, argv);
+pub fn cmd_completions(argv: Vec<&OsStr>) -> c_int {
let cli = Cli::parse_from(argv);
print_completions(cli.shell, &mut super::Cli::command());
0
use bch_bindgen::btree::BtreeNodeIter;
use bch_bindgen::btree::BtreeIterFlags;
use clap::{Parser};
-use std::ffi::{c_int, c_char};
-use crate::transform_c_args;
+use std::ffi::{c_int, OsStr};
fn list_keys(fs: &Fs, opt: Cli) -> anyhow::Result<()> {
let trans = BtreeTrans::new(fs);
}
}
-#[no_mangle]
-#[allow(clippy::not_unsafe_ptr_arg_deref)]
-pub extern "C" fn cmd_list(argc: c_int, argv: *const *const c_char) {
- transform_c_args!(argv, argc, argv);
+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
}
}
--- /dev/null
+use log::{error, LevelFilter};
+use std::ffi::{CStr, c_int, c_char};
+use crate::transform_c_args;
+use crate::logger::SimpleLogger;
+use crate::cmd_completions::cmd_completions;
+use crate::cmd_list::cmd_list;
+use crate::cmd_mount::cmd_mount;
+
+#[no_mangle]
+pub extern "C" fn rust_main(argc: c_int, argv: *const *const c_char, cmd: *const c_char) -> c_int {
+ transform_c_args!(argv, argc, argv);
+
+ log::set_boxed_logger(Box::new(SimpleLogger)).unwrap();
+ log::set_max_level(LevelFilter::Warn);
+
+ let cmd: &CStr = unsafe { CStr::from_ptr(cmd) };
+ let cmd = match cmd.to_str() {
+ Ok(c) => c,
+ Err(e) => {
+ error!("could not parse command: {}", e);
+ return 1;
+ }
+ };
+
+ match cmd {
+ "completions" => cmd_completions(argv),
+ "list" => cmd_list(argv),
+ "mount" => cmd_mount(argv),
+ _ => {
+ error!("unknown command: {}", cmd);
+ 1
+ }
+ }
+}
use clap::{Parser};
use uuid::Uuid;
use std::path::PathBuf;
-use crate::{key, transform_c_args};
+use crate::key;
use crate::key::KeyLocation;
-use crate::logger::SimpleLogger;
-use std::ffi::{CString, c_int, c_char, c_void};
+use std::ffi::{CString, c_int, c_char, c_void, OsStr};
use std::os::unix::ffi::OsStrExt;
fn mount_inner(
Ok(())
}
-#[no_mangle]
-#[allow(clippy::not_unsafe_ptr_arg_deref)]
-pub extern "C" fn cmd_mount(argc: c_int, argv: *const *const c_char) -> c_int {
- transform_c_args!(argv, argc, argv);
+pub fn cmd_mount(argv: Vec<&OsStr>) -> c_int {
let opt = Cli::parse_from(argv);
- log::set_boxed_logger(Box::new(SimpleLogger)).unwrap();
-
// @TODO : more granular log levels via mount option
log::set_max_level(match opt.verbose {
0 => LevelFilter::Warn,
pub mod key;
pub mod logger;
+pub mod cmd_main;
pub mod cmd_mount;
pub mod cmd_list;
pub mod cmd_completions;