forked from bonsai/harakit
fileis(1): feature parity with C scrut(1)
This commit is contained in:
parent
0819eeb75d
commit
02b5edae05
@ -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
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user