7 use commands::cmd_completions::cmd_completions;
8 use commands::cmd_list::cmd_list;
9 use commands::cmd_mount::cmd_mount;
10 use commands::cmd_subvolume::cmd_subvolumes;
11 use commands::logger::SimpleLogger;
15 pub struct ErrnoError(pub errno::Errno);
16 impl std::fmt::Display for ErrnoError {
17 fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
22 impl std::error::Error for ErrnoError {}
24 fn to_mut<T>(p: *const T) -> *mut T {
28 fn handle_c_command(args: Vec<String>, symlink_cmd: Option<&str>) -> i32 {
29 let mut argv: Vec<_> = args.clone();
31 let cmd = match symlink_cmd {
32 Some(s) => s.to_string(),
33 None => argv.remove(1),
36 let argc: i32 = argv.len().try_into().unwrap();
38 let argv: Vec<_> = argv
40 .map(|s| CString::new(s.as_str()).unwrap())
42 let mut argv: Vec<_> = argv.iter().map(|s| to_mut(s.as_ptr())).collect();
43 let argv = argv.as_mut_ptr();
45 // The C functions will mutate argv. It shouldn't be used after this block.
52 "data" => c::data_cmds(argc, argv),
53 "device" => c::device_cmds(argc, argv),
54 "dump" => c::cmd_dump(argc, argv),
55 "format" => c::cmd_format(argc, argv),
56 "fs" => c::fs_cmds(argc, argv),
57 "fsck" => c::cmd_fsck(argc, argv),
58 "list_journal" => c::cmd_list_journal(argc, argv),
59 "kill_btree_node" => c::cmd_kill_btree_node(argc, argv),
60 "migrate" => c::cmd_migrate(argc, argv),
61 "migrate-superblock" => c::cmd_migrate_superblock(argc, argv),
62 "mkfs" => c::cmd_format(argc, argv),
63 "remove-passphrase" => c::cmd_remove_passphrase(argc, argv),
64 "reset-counters" => c::cmd_reset_counters(argc, argv),
65 "set-option" => c::cmd_set_option(argc, argv),
66 "set-passphrase" => c::cmd_set_passphrase(argc, argv),
67 "setattr" => c::cmd_setattr(argc, argv),
68 "show-super" => c::cmd_show_super(argc, argv),
69 "unlock" => c::cmd_unlock(argc, argv),
70 "version" => c::cmd_version(argc, argv),
73 "fusemount" => c::cmd_fusemount(argc, argv),
76 println!("Unknown command {}", cmd);
85 let args: Vec<String> = std::env::args().collect();
87 let symlink_cmd: Option<&str> = if args[0].contains("mkfs") {
89 } else if args[0].contains("fsck") {
91 } else if args[0].contains("mount.fuse") {
93 } else if args[0].contains("mount") {
99 if symlink_cmd.is_none() && args.len() < 2 {
100 println!("missing command");
101 unsafe { c::bcachefs_usage() };
102 std::process::exit(1);
105 unsafe { c::raid_init() };
107 log::set_boxed_logger(Box::new(SimpleLogger)).unwrap();
108 log::set_max_level(log::LevelFilter::Warn);
110 let cmd = match symlink_cmd {
112 None => args[1].as_str(),
115 let ret = match cmd {
116 "completions" => cmd_completions(args[1..].to_vec()),
117 "list" => cmd_list(args[1..].to_vec()),
118 "mount" => cmd_mount(args, symlink_cmd),
119 "subvolume" => cmd_subvolumes(args[1..].to_vec()),
120 _ => handle_c_command(args, symlink_cmd),
124 std::process::exit(1);