mod cat;
mod create;
mod extract;
mod info;
mod list;
pub use cat::cat;
pub use create::create;
pub use extract::extract;
pub use info::info;
pub use list::list;
use hadris_cpio::FileType;
fn format_size(bytes: u64) -> String {
const KB: u64 = 1024;
const MB: u64 = KB * 1024;
const GB: u64 = MB * 1024;
const TB: u64 = GB * 1024;
if bytes >= TB {
format!("{:.2} TB", bytes as f64 / TB as f64)
} else if bytes >= GB {
format!("{:.2} GB", bytes as f64 / GB as f64)
} else if bytes >= MB {
format!("{:.2} MB", bytes as f64 / MB as f64)
} else if bytes >= KB {
format!("{:.2} KB", bytes as f64 / KB as f64)
} else {
format!("{} B", bytes)
}
}
fn format_mode(mode: u32) -> String {
let perms = mode & 0o7777;
let mut s = String::with_capacity(9);
for &(bit, ch) in &[
(0o400, 'r'),
(0o200, 'w'),
(0o100, 'x'),
(0o040, 'r'),
(0o020, 'w'),
(0o010, 'x'),
(0o004, 'r'),
(0o002, 'w'),
(0o001, 'x'),
] {
s.push(if perms & bit != 0 { ch } else { '-' });
}
s
}
fn format_filetype(ft: FileType) -> char {
match ft {
FileType::Directory => 'd',
FileType::Symlink => 'l',
FileType::Regular => '-',
FileType::CharDevice => 'c',
FileType::BlockDevice => 'b',
FileType::Fifo => 'p',
FileType::Socket => 's',
FileType::Unknown(_) => '?',
}
}