]> git.sesse.net Git - bcachefs-tools-debian/blob - src/bcachefs.rs
rust: update bindgen to 0.69.4; remove custom type modifications
[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 handle_c_command(args: Vec<String>, symlink_cmd: Option<&str>) -> i32 {
25     let mut argv: Vec<_> = args.clone();
26
27     let cmd = match symlink_cmd {
28         Some(s) => s.to_string(),
29         None => argv.remove(1),
30     };
31
32     let argc: i32 = argv.len().try_into().unwrap();
33
34     let argv: Vec<_> = argv
35         .iter()
36         .map(|s| CString::new(s.as_str()).unwrap())
37         .collect();
38     let argv: Vec<_> = argv.iter().map(|s| s.as_ptr()).collect();
39     let argv = argv.as_ptr() as *mut *mut i8;
40
41     // The C functions will mutate argv. It shouldn't be used after this block.
42     unsafe {
43         match cmd.as_str() {
44             "--help" => {
45                 c::bcachefs_usage();
46                 0
47             },
48             "data" => c::data_cmds(argc, argv),
49             "device" => c::device_cmds(argc, argv),
50             "dump" => c::cmd_dump(argc, argv),
51             "format" => c::cmd_format(argc, argv),
52             "fs" => c::fs_cmds(argc, argv),
53             "fsck" => c::cmd_fsck(argc, argv),
54             "list_journal" => c::cmd_list_journal(argc, argv),
55             "kill_btree_node" => c::cmd_kill_btree_node(argc, argv),
56             "migrate" => c::cmd_migrate(argc, argv),
57             "migrate-superblock" => c::cmd_migrate_superblock(argc, argv),
58             "mkfs" => c::cmd_format(argc, argv),
59             "remove-passphrase" => c::cmd_remove_passphrase(argc, argv),
60             "reset-counters" => c::cmd_reset_counters(argc, argv),
61             "set-option" => c::cmd_set_option(argc, argv),
62             "set-passphrase" => c::cmd_set_passphrase(argc, argv),
63             "setattr" => c::cmd_setattr(argc, argv),
64             "show-super" => c::cmd_show_super(argc, argv),
65             "unlock" => c::cmd_unlock(argc, argv),
66             "version" => c::cmd_version(argc, argv),
67
68             #[cfg(fuse)]
69             "fusemount" => c::cmd_fusemount(argc, argv),
70
71             _ => {
72                 println!("Unknown command {}", cmd);
73                 c::bcachefs_usage();
74                 1
75             }
76         }
77     }
78 }
79
80 fn main() {
81     let args: Vec<String> = std::env::args().collect();
82
83     let symlink_cmd: Option<&str> = if args[0].contains("mkfs") {
84         Some("mkfs")
85     } else if args[0].contains("fsck") {
86         Some("fsck")
87     } else if args[0].contains("mount.fuse") {
88         Some("fusemount")
89     } else if args[0].contains("mount") {
90         Some("mount")
91     } else {
92         None
93     };
94
95     if symlink_cmd.is_none() && args.len() < 2 {
96         println!("missing command");
97         unsafe { c::bcachefs_usage() };
98         std::process::exit(1);
99     }
100
101     unsafe { c::raid_init() };
102
103     log::set_boxed_logger(Box::new(SimpleLogger)).unwrap();
104     log::set_max_level(log::LevelFilter::Warn);
105
106     let cmd = match symlink_cmd {
107         Some(s) => s,
108         None => args[1].as_str(),
109     };
110
111     let ret = match cmd {
112         "completions" => cmd_completions(args[1..].to_vec()),
113         "list" => cmd_list(args[1..].to_vec()),
114         "mount" => cmd_mount(args, symlink_cmd),
115         "subvolume" => cmd_subvolumes(args[1..].to_vec()),
116         _ => handle_c_command(args, symlink_cmd),
117     };
118
119     if ret != 0 {
120         std::process::exit(1);
121     }
122 }