1
0
forked from bonsai/harakit

fileis(1): feature parity with C scrut(1)

This commit is contained in:
dtb 2024-07-18 20:43:39 -06:00
parent 0819eeb75d
commit 02b5edae05
Signed by untrusted user: trinity
GPG Key ID: 34C0543BBB6AF81B

View File

@ -19,6 +19,7 @@
use std::{ use std::{
env::args, env::args,
fs::metadata, fs::metadata,
os::unix::fs::{ FileTypeExt, MetadataExt },
process::ExitCode, process::ExitCode,
}; };
@ -36,11 +37,11 @@ fn usage(s: &str) -> ExitCode {
fn main() -> ExitCode { fn main() -> ExitCode {
let argv = args().collect::<Vec<String>>(); let argv = args().collect::<Vec<String>>();
let mut sel: String; // selected options let mut sel = String::from(""); // selected options
let mut optind: usize = 1; // argv[0] let mut optind: usize = 1; // argv[0]
while let Some(opt) = argv.getopt("bcdefgkprsuwxLS") { while let Some(opt) = argv.getopt("bcdefgkprsuwxLS") {
if let Ok(optchr) = opt.opt() { sel.push(optchr); } if let Ok(optchr) = opt.opt() { sel.push_str(optchr); }
else { return usage(&argv[0]); } else { return usage(&argv[0]); }
optind = opt.ind(); optind = opt.ind();
@ -49,32 +50,38 @@ fn main() -> ExitCode {
if optind == argv.len() { return usage(&argv[0]); } if optind == argv.len() { return usage(&argv[0]); }
for arg in argv.iter().skip(optind) { for arg in argv.iter().skip(optind) {
let fmeta; // file metadata
let fmode; // file mode; see chmod(1p)
let ftype; // file type
match metadata(arg) {
Ok(m) => fmeta = m,
_ => { return ExitCode::FAILURE; } // no perms or nonexistent
} }
// do{ fmode = fmeta.mode();
// if (!fileis_exists(*argv)) ftype = fmeta.file_type();
// return EXIT_FAILURE;
// for selection in sel.chars() { // run all selected tests
// for (size_t i = 0; sel[i] != '\0'; ++i) { match selection {
// if ((sel[i] == 'b' && !fileis_block(*argv)) 'b' if ftype.is_block_device() => (),
// || (sel[i] == 'c' && !fileis_char(*argv)) 'c' if ftype.is_char_device() => (),
// || (sel[i] == 'd' && !fileis_dir(*argv)) 'e' => (), // exists or metadata would have errored
// || (sel[i] != 'e') 'd' if fmeta.is_dir() => (),
// || (sel[i] == 'f' && !fileis_regular(*argv)) 'f' if fmeta.is_file() => (),
// || (sel[i] == 'g' && !fileis_setgid(*argv)) 'g' if fmode & 0o2000 /* S_ISGID */ != 0 => (), // setgid
// || (sel[i] == 'k' && !fileis_vtx(*argv)) 'k' if fmode & 0o1000 /* S_ISVTX */ != 0 => (), // setvtx
// || (sel[i] == 'p' && !fileis_fifo(*argv)) 'p' if ftype.is_fifo() => (),
// || (sel[i] == 'r' && access(*argv, R_OK) != 0) 'r' if fmode & 0o0400 /* S_IRUSR */ != 0 => (), // read access
// || (sel[i] == 'u' && !fileis_setuid(*argv)) 'u' if fmode & 0o4000 /* S_ISUID */ != 0 => (), // setuid
// || (sel[i] == 'w' && access(*argv, W_OK) != 0) 'w' if fmode & 0o0200 /* S_IWUSR */ != 0 => (), // write access
// || (sel[i] == 'x' && access(*argv, X_OK) != 0) 'x' if fmode & 0o0100 /* S_IXUSR */ != 0 => (), // exec access
// || (sel[i] == 'L' && !fileis_link(*argv)) 'L' if fmeta.is_symlink() => (),
// || (sel[i] == 'S' && !fileis_socket(*argv)) 'S' if ftype.is_socket() => (),
// ) { return EXIT_FAILURE; } _ => { return ExitCode::FAILURE; }
// } }
// } while (*++argv != NULL); }
// }
// return EXIT_SUCCESS;
ExitCode::SUCCESS ExitCode::SUCCESS
} }