]> git.sesse.net Git - bcachefs-tools-debian/blob - src/bcachefs.rs
Disable pristine-tar option in gbp.conf, since there is no pristine-tar branch.
[bcachefs-tools-debian] / src / bcachefs.rs
1 mod wrappers;
2 mod commands;
3 mod key;
4
5 use std::ffi::CString;
6
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;
12 use bch_bindgen::c;
13
14 #[derive(Debug)]
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> {
18         self.0.fmt(f)
19     }
20 }
21
22 impl std::error::Error for ErrnoError {}
23
24 fn to_mut<T>(p: *const T) -> *mut T {
25     p as *mut T
26 }
27
28 fn handle_c_command(args: Vec<String>, symlink_cmd: Option<&str>) -> i32 {
29     let mut argv: Vec<_> = args.clone();
30
31     let cmd = match symlink_cmd {
32         Some(s) => s.to_string(),
33         None => argv.remove(1),
34     };
35
36     let argc: i32 = argv.len().try_into().unwrap();
37
38     let argv: Vec<_> = argv
39         .iter()
40         .map(|s| CString::new(s.as_str()).unwrap())
41         .collect();
42     let mut argv: Vec<_> = argv.iter().map(|s| to_mut(s.as_ptr())).collect();
43     let argv = argv.as_mut_ptr();
44
45     // The C functions will mutate argv. It shouldn't be used after this block.
46     unsafe {
47         match cmd.as_str() {
48             "--help" => {
49                 c::bcachefs_usage();
50                 0
51             },
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),
71
72             #[cfg(fuse)]
73             "fusemount" => c::cmd_fusemount(argc, argv),
74
75             _ => {
76                 println!("Unknown command {}", cmd);
77                 c::bcachefs_usage();
78                 1
79             }
80         }
81     }
82 }
83
84 fn main() {
85     let args: Vec<String> = std::env::args().collect();
86
87     let symlink_cmd: Option<&str> = if args[0].contains("mkfs") {
88         Some("mkfs")
89     } else if args[0].contains("fsck") {
90         Some("fsck")
91     } else if args[0].contains("mount.fuse") {
92         Some("fusemount")
93     } else if args[0].contains("mount") {
94         Some("mount")
95     } else {
96         None
97     };
98
99     if symlink_cmd.is_none() && args.len() < 2 {
100         println!("missing command");
101         unsafe { c::bcachefs_usage() };
102         std::process::exit(1);
103     }
104
105     unsafe { c::raid_init() };
106
107     log::set_boxed_logger(Box::new(SimpleLogger)).unwrap();
108     log::set_max_level(log::LevelFilter::Warn);
109
110     let cmd = match symlink_cmd {
111         Some(s) => s,
112         None => args[1].as_str(),
113     };
114
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),
121     };
122
123     if ret != 0 {
124         std::process::exit(1);
125     }
126 }