From 922c8553839e7ee23091ec20214ad454070b1126 Mon Sep 17 00:00:00 2001 From: hanbings Date: Wed, 7 Aug 2024 05:38:16 -0400 Subject: [PATCH 01/11] Supported -ls and -fls. --- src/find/matchers/ls.rs | 149 +++++++++++++++++++++++++++++++++++++++ src/find/matchers/mod.rs | 20 ++++++ 2 files changed, 169 insertions(+) create mode 100644 src/find/matchers/ls.rs diff --git a/src/find/matchers/ls.rs b/src/find/matchers/ls.rs new file mode 100644 index 00000000..1c17ce9a --- /dev/null +++ b/src/find/matchers/ls.rs @@ -0,0 +1,149 @@ +// This file is part of the uutils findutils package. +// +// For the full copyright and license information, please view the LICENSE +// file that was distributed with this source code. + +use chrono::DateTime; +use nix::unistd::{Gid, Group, Uid, User}; +use std::{ + fs::File, + io::{stderr, Write}, +}; +use walkdir::DirEntry; + +use super::{Matcher, MatcherIO}; + +#[cfg(unix)] +fn format_permissions(mode: u32) -> String { + let file_type = if mode & 0o170000 == 0o040000 { + "d" + } else if mode & 0o170000 == 0o100000 { + "-" + } else { + "?" + }; + + let user_perms = format!( + "{}{}{}", + if mode & 0o0400 != 0 { "r" } else { "-" }, + if mode & 0o0200 != 0 { "w" } else { "-" }, + if mode & 0o0100 != 0 { "x" } else { "-" } + ); + + let group_perms = format!( + "{}{}{}", + if mode & 0o0040 != 0 { "r" } else { "-" }, + if mode & 0o0020 != 0 { "w" } else { "-" }, + if mode & 0o0010 != 0 { "x" } else { "-" } + ); + + let other_perms = format!( + "{}{}{}", + if mode & 0o0004 != 0 { "r" } else { "-" }, + if mode & 0o0002 != 0 { "w" } else { "-" }, + if mode & 0o0001 != 0 { "x" } else { "-" } + ); + + format!("{}{}{}{}", file_type, user_perms, group_perms, other_perms) +} + +pub struct Ls { + output_file: Option, +} + +impl Ls { + pub fn new(output_file: Option) -> Self { + Self { output_file } + } + + #[cfg(unix)] + fn print(&self, file_info: &DirEntry, mut out: impl Write, print_error_message: bool) { + use std::os::unix::fs::{MetadataExt, PermissionsExt}; + + let metadata = file_info.metadata().unwrap(); + + let inode_number = metadata.ino(); + let number_of_blocks = { + let size = metadata.size(); + let number_of_blocks = size / 1024; + let remainder = number_of_blocks % 4; + + if remainder == 0 { + if number_of_blocks == 0 { + 4 + } else { + number_of_blocks + } + } else { + number_of_blocks + (4 - (remainder)) + } + }; + let permission = { format_permissions(metadata.permissions().mode()) }; + let hard_links = metadata.nlink(); + let user = { + let uid = metadata.uid(); + User::from_uid(Uid::from_raw(uid)).unwrap().unwrap().name + }; + let group = { + let gid = metadata.gid(); + Group::from_gid(Gid::from_raw(gid)).unwrap().unwrap().name + }; + let size = metadata.size(); + let last_modified = { + let system_time = metadata.modified().unwrap(); + let now_utc: DateTime = system_time.into(); + now_utc.format("%b %e %H:%M") + }; + let path = file_info.path().to_string_lossy(); + + match write!( + out, + " {:<4} {:>6} {:<10} {:>3} {:<8} {:<8} {:>8} {} {}\n", + inode_number, + number_of_blocks, + permission, + hard_links, + user, + group, + size, + last_modified, + path, + ) { + Ok(_) => {} + Err(e) => { + if print_error_message { + writeln!( + &mut stderr(), + "Error writing {:?} for {}", + file_info.path().to_string_lossy(), + e + ) + .unwrap(); + uucore::error::set_exit_code(1); + } + } + } + } + + #[cfg(windows)] + fn print(&self, file_info: &DirEntry, mut out: impl Write, print_error_message: bool) {} +} + +impl Matcher for Ls { + fn matches(&self, file_info: &DirEntry, matcher_io: &mut MatcherIO) -> bool { + if let Some(file) = &self.output_file { + self.print(file_info, file, true); + } else { + self.print( + file_info, + &mut *matcher_io.deps.get_output().borrow_mut(), + false, + ); + } + true + } + + fn has_side_effects(&self) -> bool { + true + } +} diff --git a/src/find/matchers/mod.rs b/src/find/matchers/mod.rs index 8e7d5cf8..32aa5bfb 100644 --- a/src/find/matchers/mod.rs +++ b/src/find/matchers/mod.rs @@ -13,6 +13,7 @@ mod glob; mod group; mod lname; mod logical_matchers; +mod ls; mod name; mod path; mod perm; @@ -32,6 +33,8 @@ mod user; use ::regex::Regex; use chrono::{DateTime, Datelike, NaiveDateTime, Utc}; use fs::FileSystemMatcher; +use ls::Ls; +use std::fs::File; use std::path::Path; use std::time::SystemTime; use std::{error::Error, str::FromStr}; @@ -339,6 +342,13 @@ fn parse_str_to_newer_args(input: &str) -> Option<(String, String)> { } } +/// Creates a file if it doesn't exist. +/// If it does exist, it will be overwritten. +fn get_or_create_file(path: &str) -> Result> { + let file = File::create(path)?; + Ok(file) +} + /// The main "translate command-line args into a matcher" function. Will call /// itself recursively if it encounters an opening bracket. A successful return /// consists of a tuple containing the new index into the args array to use (if @@ -370,6 +380,16 @@ fn build_matcher_tree( i += 1; Some(Printf::new(args[i])?.into_box()) } + "-ls" => Some(Ls::new(None).into_box()), + "-fls" => { + if i >= args.len() - 1 { + return Err(From::from(format!("missing argument to {}", args[i]))); + } + i += 1; + + let file = get_or_create_file(args[i])?; + Some(Ls::new(Some(file)).into_box()) + } "-true" => Some(TrueMatcher.into_box()), "-false" => Some(FalseMatcher.into_box()), "-lname" | "-ilname" => { From fcfb9fa0abdc2c9631fcbd37c3e55a8df811551f Mon Sep 17 00:00:00 2001 From: hanbings Date: Wed, 7 Aug 2024 06:22:33 -0400 Subject: [PATCH 02/11] Add tests. --- src/find/matchers/ls.rs | 21 +++++++++++++++++++++ src/find/mod.rs | 9 +++++++++ tests/find_cmd_tests.rs | 11 +++++++++++ 3 files changed, 41 insertions(+) diff --git a/src/find/matchers/ls.rs b/src/find/matchers/ls.rs index 1c17ce9a..464b435f 100644 --- a/src/find/matchers/ls.rs +++ b/src/find/matchers/ls.rs @@ -147,3 +147,24 @@ impl Matcher for Ls { true } } + +#[cfg(test)] +mod tests { + #[test] + #[cfg(unix)] + fn test_format_permissions() { + use super::format_permissions; + + let mode = 0o100644; + let expected = "-rw-r--r--"; + assert_eq!(format_permissions(mode), expected); + + let mode = 0o040755; + let expected = "drwxr-xr-x"; + assert_eq!(format_permissions(mode), expected); + + let mode = 0o100777; + let expected = "-rwxrwxrwx"; + assert_eq!(format_permissions(mode), expected); + } +} diff --git a/src/find/mod.rs b/src/find/mod.rs index 738562db..e6e6fd7a 100644 --- a/src/find/mod.rs +++ b/src/find/mod.rs @@ -1300,4 +1300,13 @@ mod tests { assert_eq!(rc, 0); } + + #[test] + #[cfg(unix)] + fn test_ls() { + let deps = FakeDependencies::new(); + let rc = find_main(&["find", "./test_data/simple/subdir", "-ls"], &deps); + + assert_eq!(rc, 0); + } } diff --git a/tests/find_cmd_tests.rs b/tests/find_cmd_tests.rs index 20fa1a19..3f3a28ab 100644 --- a/tests/find_cmd_tests.rs +++ b/tests/find_cmd_tests.rs @@ -946,3 +946,14 @@ fn find_daystart() { .success() .stderr(predicate::str::is_empty()); } + +#[test] +#[serial(working_dir)] +fn find_ls() { + Command::cargo_bin("find") + .expect("found binary") + .args(["./test_data/simple/subdir", "-ls"]) + .assert() + .success() + .stderr(predicate::str::is_empty()); +} From 6a40ea331b7495811d9c28c5693530a920a0268c Mon Sep 17 00:00:00 2001 From: hanbings Date: Wed, 7 Aug 2024 18:52:11 +0800 Subject: [PATCH 03/11] Add Windows support. --- src/find/matchers/ls.rs | 90 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 88 insertions(+), 2 deletions(-) diff --git a/src/find/matchers/ls.rs b/src/find/matchers/ls.rs index 464b435f..821e7b3a 100644 --- a/src/find/matchers/ls.rs +++ b/src/find/matchers/ls.rs @@ -4,7 +4,6 @@ // file that was distributed with this source code. use chrono::DateTime; -use nix::unistd::{Gid, Group, Uid, User}; use std::{ fs::File, io::{stderr, Write}, @@ -47,6 +46,32 @@ fn format_permissions(mode: u32) -> String { format!("{}{}{}{}", file_type, user_perms, group_perms, other_perms) } +#[cfg(windows)] +fn format_permissions(file_attributes: u32) -> String { + let mut attributes = Vec::new(); + + if file_attributes & 0x0001 != 0 { + attributes.push("read-only"); + } + if file_attributes & 0x0002 != 0 { + attributes.push("hidden"); + } + if file_attributes & 0x0004 != 0 { + attributes.push("system"); + } + if file_attributes & 0x0020 != 0 { + attributes.push("archive"); + } + if file_attributes & 0x0040 != 0 { + attributes.push("compressed"); + } + if file_attributes & 0x0080 != 0 { + attributes.push("offline"); + } + + attributes.join(", ") +} + pub struct Ls { output_file: Option, } @@ -58,6 +83,7 @@ impl Ls { #[cfg(unix)] fn print(&self, file_info: &DirEntry, mut out: impl Write, print_error_message: bool) { + use nix::unistd::{Gid, Group, Uid, User}; use std::os::unix::fs::{MetadataExt, PermissionsExt}; let metadata = file_info.metadata().unwrap(); @@ -126,7 +152,67 @@ impl Ls { } #[cfg(windows)] - fn print(&self, file_info: &DirEntry, mut out: impl Write, print_error_message: bool) {} + fn print(&self, file_info: &DirEntry, mut out: impl Write, print_error_message: bool) { + use std::os::windows::fs::MetadataExt; + + let metadata = file_info.metadata().unwrap(); + + let inode_number = 0; + let number_of_blocks = { + let size = metadata.file_size(); + let number_of_blocks = size / 1024; + let remainder = number_of_blocks % 4; + + if remainder == 0 { + if number_of_blocks == 0 { + 4 + } else { + number_of_blocks + } + } else { + number_of_blocks + (4 - (remainder)) + } + }; + let permission = { format_permissions(metadata.file_attributes()) }; + let hard_links = 0; + let user = 0; + let group = 0; + let size = metadata.file_size(); + let last_modified = { + let system_time = metadata.modified().unwrap(); + let now_utc: DateTime = system_time.into(); + now_utc.format("%b %e %H:%M") + }; + let path = file_info.path().to_string_lossy(); + + match write!( + out, + " {:<4} {:>6} {:<10} {:>3} {:<8} {:<8} {:>8} {} {}\n", + inode_number, + number_of_blocks, + permission, + hard_links, + user, + group, + size, + last_modified, + path, + ) { + Ok(_) => {} + Err(e) => { + if print_error_message { + writeln!( + &mut stderr(), + "Error writing {:?} for {}", + file_info.path().to_string_lossy(), + e + ) + .unwrap(); + uucore::error::set_exit_code(1); + } + } + } + } } impl Matcher for Ls { From c4a65c32bb1190d7f8b3d7acca4aae2fbff6b1a7 Mon Sep 17 00:00:00 2001 From: hanbings Date: Wed, 7 Aug 2024 06:56:44 -0400 Subject: [PATCH 04/11] Run clippy. --- src/find/matchers/ls.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/find/matchers/ls.rs b/src/find/matchers/ls.rs index 821e7b3a..c0d58124 100644 --- a/src/find/matchers/ls.rs +++ b/src/find/matchers/ls.rs @@ -122,9 +122,9 @@ impl Ls { }; let path = file_info.path().to_string_lossy(); - match write!( + match writeln!( out, - " {:<4} {:>6} {:<10} {:>3} {:<8} {:<8} {:>8} {} {}\n", + " {:<4} {:>6} {:<10} {:>3} {:<8} {:<8} {:>8} {} {}", inode_number, number_of_blocks, permission, From a672f353f4d79cef72370c680ba535c7b0cc7bb1 Mon Sep 17 00:00:00 2001 From: hanbings Date: Sun, 11 Aug 2024 06:34:27 -0400 Subject: [PATCH 05/11] Clear the magic number. --- src/find/matchers/ls.rs | 68 ++++++++++++++++++++++++++++++++--------- src/find/mod.rs | 2 +- 2 files changed, 54 insertions(+), 16 deletions(-) diff --git a/src/find/matchers/ls.rs b/src/find/matchers/ls.rs index c0d58124..79c00d3a 100644 --- a/src/find/matchers/ls.rs +++ b/src/find/matchers/ls.rs @@ -14,33 +14,70 @@ use super::{Matcher, MatcherIO}; #[cfg(unix)] fn format_permissions(mode: u32) -> String { - let file_type = if mode & 0o170000 == 0o040000 { - "d" - } else if mode & 0o170000 == 0o100000 { - "-" - } else { - "?" + let file_type = match mode & uucore::libc::S_IFMT { + uucore::libc::S_IFDIR => "d", + uucore::libc::S_IFREG => "-", + _ => "?", }; + // S_$$USR means "user permissions" let user_perms = format!( "{}{}{}", - if mode & 0o0400 != 0 { "r" } else { "-" }, - if mode & 0o0200 != 0 { "w" } else { "-" }, - if mode & 0o0100 != 0 { "x" } else { "-" } + if mode & uucore::libc::S_IRUSR != 0 { + "r" + } else { + "-" + }, + if mode & uucore::libc::S_IWUSR != 0 { + "w" + } else { + "-" + }, + if mode & uucore::libc::S_IXUSR != 0 { + "x" + } else { + "-" + } ); + // S_$$GRP means "group permissions" let group_perms = format!( "{}{}{}", - if mode & 0o0040 != 0 { "r" } else { "-" }, - if mode & 0o0020 != 0 { "w" } else { "-" }, - if mode & 0o0010 != 0 { "x" } else { "-" } + if mode & uucore::libc::S_IRGRP != 0 { + "r" + } else { + "-" + }, + if mode & uucore::libc::S_IWGRP != 0 { + "w" + } else { + "-" + }, + if mode & uucore::libc::S_IXGRP != 0 { + "x" + } else { + "-" + } ); + // S_$$OTH means "other permissions" let other_perms = format!( "{}{}{}", - if mode & 0o0004 != 0 { "r" } else { "-" }, - if mode & 0o0002 != 0 { "w" } else { "-" }, - if mode & 0o0001 != 0 { "x" } else { "-" } + if mode & uucore::libc::S_IROTH != 0 { + "r" + } else { + "-" + }, + if mode & uucore::libc::S_IWOTH != 0 { + "w" + } else { + "-" + }, + if mode & uucore::libc::S_IXOTH != 0 { + "x" + } else { + "-" + } ); format!("{}{}{}{}", file_type, user_perms, group_perms, other_perms) @@ -50,6 +87,7 @@ fn format_permissions(mode: u32) -> String { fn format_permissions(file_attributes: u32) -> String { let mut attributes = Vec::new(); + // https://learn.microsoft.com/en-us/windows/win32/fileio/file-attribute-constants if file_attributes & 0x0001 != 0 { attributes.push("read-only"); } diff --git a/src/find/mod.rs b/src/find/mod.rs index 05907297..052e3506 100644 --- a/src/find/mod.rs +++ b/src/find/mod.rs @@ -1317,7 +1317,7 @@ mod tests { let _ = fs::remove_file("test_data/find_fprint"); } - + #[test] #[cfg(unix)] fn test_ls() { From e3562de7d5c0405cada3bf964f84b5d29957e557 Mon Sep 17 00:00:00 2001 From: hanbings Date: Sun, 11 Aug 2024 07:19:54 -0400 Subject: [PATCH 06/11] Fix issue with using u16 mask on macOS. --- src/find/matchers/ls.rs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/find/matchers/ls.rs b/src/find/matchers/ls.rs index 79c00d3a..16be3baa 100644 --- a/src/find/matchers/ls.rs +++ b/src/find/matchers/ls.rs @@ -14,7 +14,7 @@ use super::{Matcher, MatcherIO}; #[cfg(unix)] fn format_permissions(mode: u32) -> String { - let file_type = match mode & uucore::libc::S_IFMT { + let file_type = match mode & uucore::libc::S_IFMT as u32 { uucore::libc::S_IFDIR => "d", uucore::libc::S_IFREG => "-", _ => "?", @@ -23,17 +23,17 @@ fn format_permissions(mode: u32) -> String { // S_$$USR means "user permissions" let user_perms = format!( "{}{}{}", - if mode & uucore::libc::S_IRUSR != 0 { + if mode & uucore::libc::S_IRUSR as u32 != 0 { "r" } else { "-" }, - if mode & uucore::libc::S_IWUSR != 0 { + if mode & uucore::libc::S_IWUSR as u32 != 0 { "w" } else { "-" }, - if mode & uucore::libc::S_IXUSR != 0 { + if mode & uucore::libc::S_IXUSR as u32 != 0 { "x" } else { "-" @@ -43,17 +43,17 @@ fn format_permissions(mode: u32) -> String { // S_$$GRP means "group permissions" let group_perms = format!( "{}{}{}", - if mode & uucore::libc::S_IRGRP != 0 { + if mode & uucore::libc::S_IRGRP as u32 != 0 { "r" } else { "-" }, - if mode & uucore::libc::S_IWGRP != 0 { + if mode & uucore::libc::S_IWGRP as u32 != 0 { "w" } else { "-" }, - if mode & uucore::libc::S_IXGRP != 0 { + if mode & uucore::libc::S_IXGRP as u32 != 0 { "x" } else { "-" @@ -63,17 +63,17 @@ fn format_permissions(mode: u32) -> String { // S_$$OTH means "other permissions" let other_perms = format!( "{}{}{}", - if mode & uucore::libc::S_IROTH != 0 { + if mode & uucore::libc::S_IROTH as u32 != 0 { "r" } else { "-" }, - if mode & uucore::libc::S_IWOTH != 0 { + if mode & uucore::libc::S_IWOTH as u32 != 0 { "w" } else { "-" }, - if mode & uucore::libc::S_IXOTH != 0 { + if mode & uucore::libc::S_IXOTH as u32 != 0 { "x" } else { "-" From 1764055b2508dbc716ca4c357758000c2be077d5 Mon Sep 17 00:00:00 2001 From: hanbings Date: Sun, 11 Aug 2024 07:46:44 -0400 Subject: [PATCH 07/11] Fix issue with using u16 mask on macOS. --- src/find/matchers/ls.rs | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/find/matchers/ls.rs b/src/find/matchers/ls.rs index 16be3baa..2a272f20 100644 --- a/src/find/matchers/ls.rs +++ b/src/find/matchers/ls.rs @@ -14,26 +14,32 @@ use super::{Matcher, MatcherIO}; #[cfg(unix)] fn format_permissions(mode: u32) -> String { - let file_type = match mode & uucore::libc::S_IFMT as u32 { - uucore::libc::S_IFDIR => "d", - uucore::libc::S_IFREG => "-", - _ => "?", + let file_type = if mode & (uucore::libc::S_IFMT as uucore::libc::mode_t) + == (uucore::libc::S_IFDIR as uucore::libc::mode_t) + { + "d" + } else if mode & (uucore::libc::S_IFMT as uucore::libc::mode_t) + == (uucore::libc::S_IFREG as uucore::libc::mode_t) + { + "-" + } else { + "?" }; // S_$$USR means "user permissions" let user_perms = format!( "{}{}{}", - if mode & uucore::libc::S_IRUSR as u32 != 0 { + if mode & (uucore::libc::S_IRUSR as uucore::libc::mode_t) != 0 { "r" } else { "-" }, - if mode & uucore::libc::S_IWUSR as u32 != 0 { + if mode & (uucore::libc::S_IWUSR as uucore::libc::mode_t) != 0 { "w" } else { "-" }, - if mode & uucore::libc::S_IXUSR as u32 != 0 { + if mode & (uucore::libc::S_IXUSR as uucore::libc::mode_t) != 0 { "x" } else { "-" @@ -43,17 +49,17 @@ fn format_permissions(mode: u32) -> String { // S_$$GRP means "group permissions" let group_perms = format!( "{}{}{}", - if mode & uucore::libc::S_IRGRP as u32 != 0 { + if mode & (uucore::libc::S_IRGRP as uucore::libc::mode_t) != 0 { "r" } else { "-" }, - if mode & uucore::libc::S_IWGRP as u32 != 0 { + if mode & (uucore::libc::S_IWGRP as uucore::libc::mode_t) != 0 { "w" } else { "-" }, - if mode & uucore::libc::S_IXGRP as u32 != 0 { + if mode & (uucore::libc::S_IXGRP as uucore::libc::mode_t) != 0 { "x" } else { "-" @@ -63,17 +69,17 @@ fn format_permissions(mode: u32) -> String { // S_$$OTH means "other permissions" let other_perms = format!( "{}{}{}", - if mode & uucore::libc::S_IROTH as u32 != 0 { + if mode & (uucore::libc::S_IROTH as uucore::libc::mode_t) != 0 { "r" } else { "-" }, - if mode & uucore::libc::S_IWOTH as u32 != 0 { + if mode & (uucore::libc::S_IWOTH as uucore::libc::mode_t) != 0 { "w" } else { "-" }, - if mode & uucore::libc::S_IXOTH as u32 != 0 { + if mode & (uucore::libc::S_IXOTH as uucore::libc::mode_t) != 0 { "x" } else { "-" From 5a3238713730dff95e861956ee1fef022ef0fec3 Mon Sep 17 00:00:00 2001 From: hanbings Date: Sun, 11 Aug 2024 08:01:31 -0400 Subject: [PATCH 08/11] Fix issue with using u16 mask on macOS. --- src/find/matchers/ls.rs | 40 +++++++++++++++++----------------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/src/find/matchers/ls.rs b/src/find/matchers/ls.rs index 2a272f20..d371adea 100644 --- a/src/find/matchers/ls.rs +++ b/src/find/matchers/ls.rs @@ -13,33 +13,27 @@ use walkdir::DirEntry; use super::{Matcher, MatcherIO}; #[cfg(unix)] -fn format_permissions(mode: u32) -> String { - let file_type = if mode & (uucore::libc::S_IFMT as uucore::libc::mode_t) - == (uucore::libc::S_IFDIR as uucore::libc::mode_t) - { - "d" - } else if mode & (uucore::libc::S_IFMT as uucore::libc::mode_t) - == (uucore::libc::S_IFREG as uucore::libc::mode_t) - { - "-" - } else { - "?" +fn format_permissions(mode: uucore::libc::mode_t) -> String { + let file_type = match mode & (uucore::libc::S_IFMT as uucore::libc::mode_t) { + uucore::libc::S_IFDIR => "d", + uucore::libc::S_IFREG => "-", + _ => "?", }; // S_$$USR means "user permissions" let user_perms = format!( "{}{}{}", - if mode & (uucore::libc::S_IRUSR as uucore::libc::mode_t) != 0 { + if mode & uucore::libc::S_IRUSR != 0 { "r" } else { "-" }, - if mode & (uucore::libc::S_IWUSR as uucore::libc::mode_t) != 0 { + if mode & uucore::libc::S_IWUSR != 0 { "w" } else { "-" }, - if mode & (uucore::libc::S_IXUSR as uucore::libc::mode_t) != 0 { + if mode & uucore::libc::S_IXUSR != 0 { "x" } else { "-" @@ -49,17 +43,17 @@ fn format_permissions(mode: u32) -> String { // S_$$GRP means "group permissions" let group_perms = format!( "{}{}{}", - if mode & (uucore::libc::S_IRGRP as uucore::libc::mode_t) != 0 { + if mode & uucore::libc::S_IRGRP != 0 { "r" } else { "-" }, - if mode & (uucore::libc::S_IWGRP as uucore::libc::mode_t) != 0 { + if mode & uucore::libc::S_IWGRP != 0 { "w" } else { "-" }, - if mode & (uucore::libc::S_IXGRP as uucore::libc::mode_t) != 0 { + if mode & uucore::libc::S_IXGRP != 0 { "x" } else { "-" @@ -69,17 +63,17 @@ fn format_permissions(mode: u32) -> String { // S_$$OTH means "other permissions" let other_perms = format!( "{}{}{}", - if mode & (uucore::libc::S_IROTH as uucore::libc::mode_t) != 0 { + if mode & uucore::libc::S_IROTH != 0 { "r" } else { "-" }, - if mode & (uucore::libc::S_IWOTH as uucore::libc::mode_t) != 0 { + if mode & uucore::libc::S_IWOTH != 0 { "w" } else { "-" }, - if mode & (uucore::libc::S_IXOTH as uucore::libc::mode_t) != 0 { + if mode & uucore::libc::S_IXOTH != 0 { "x" } else { "-" @@ -285,15 +279,15 @@ mod tests { fn test_format_permissions() { use super::format_permissions; - let mode = 0o100644; + let mode: uucore::libc::mode_t = 0o100644; let expected = "-rw-r--r--"; assert_eq!(format_permissions(mode), expected); - let mode = 0o040755; + let mode: uucore::libc::mode_t = 0o040755; let expected = "drwxr-xr-x"; assert_eq!(format_permissions(mode), expected); - let mode = 0o100777; + let mode: uucore::libc::mode_t = 0o100777; let expected = "-rwxrwxrwx"; assert_eq!(format_permissions(mode), expected); } From aeedbfc0f153b544611c3c4b856f6fe537345d2d Mon Sep 17 00:00:00 2001 From: hanbings Date: Sun, 11 Aug 2024 08:13:13 -0400 Subject: [PATCH 09/11] Fix issue with using u16 mask on macOS. --- src/find/matchers/ls.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/find/matchers/ls.rs b/src/find/matchers/ls.rs index d371adea..0ac06159 100644 --- a/src/find/matchers/ls.rs +++ b/src/find/matchers/ls.rs @@ -142,7 +142,8 @@ impl Ls { number_of_blocks + (4 - (remainder)) } }; - let permission = { format_permissions(metadata.permissions().mode()) }; + let permission = + { format_permissions(metadata.permissions().mode() as uucore::libc::mode_t) }; let hard_links = metadata.nlink(); let user = { let uid = metadata.uid(); From d132e48a785d95d33caec074415e802c8db7477c Mon Sep 17 00:00:00 2001 From: hanbings Date: Tue, 20 Aug 2024 08:13:08 -0400 Subject: [PATCH 10/11] Resolve conflicts. --- src/find/matchers/ls.rs | 7 +++---- src/find/mod.rs | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/find/matchers/ls.rs b/src/find/matchers/ls.rs index 0ac06159..e33c6f16 100644 --- a/src/find/matchers/ls.rs +++ b/src/find/matchers/ls.rs @@ -8,9 +8,8 @@ use std::{ fs::File, io::{stderr, Write}, }; -use walkdir::DirEntry; -use super::{Matcher, MatcherIO}; +use super::{Matcher, MatcherIO, WalkEntry}; #[cfg(unix)] fn format_permissions(mode: uucore::libc::mode_t) -> String { @@ -120,7 +119,7 @@ impl Ls { } #[cfg(unix)] - fn print(&self, file_info: &DirEntry, mut out: impl Write, print_error_message: bool) { + fn print(&self, file_info: &WalkEntry, mut out: impl Write, print_error_message: bool) { use nix::unistd::{Gid, Group, Uid, User}; use std::os::unix::fs::{MetadataExt, PermissionsExt}; @@ -255,7 +254,7 @@ impl Ls { } impl Matcher for Ls { - fn matches(&self, file_info: &DirEntry, matcher_io: &mut MatcherIO) -> bool { + fn matches(&self, file_info: &WalkEntry, matcher_io: &mut MatcherIO) -> bool { if let Some(file) = &self.output_file { self.print(file_info, file, true); } else { diff --git a/src/find/mod.rs b/src/find/mod.rs index 1c698df1..01012414 100644 --- a/src/find/mod.rs +++ b/src/find/mod.rs @@ -1429,7 +1429,7 @@ mod tests { fix_up_slashes("./test_data/links/link-d\n") ); } - + #[test] #[cfg(unix)] fn test_ls() { From 96e57400dbcd887b343efee49041c20f4eacffa9 Mon Sep 17 00:00:00 2001 From: hanbings Date: Tue, 20 Aug 2024 08:32:51 -0400 Subject: [PATCH 11/11] Resolve conflicts. --- src/find/matchers/ls.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/find/matchers/ls.rs b/src/find/matchers/ls.rs index e33c6f16..0b89b252 100644 --- a/src/find/matchers/ls.rs +++ b/src/find/matchers/ls.rs @@ -190,7 +190,7 @@ impl Ls { } #[cfg(windows)] - fn print(&self, file_info: &DirEntry, mut out: impl Write, print_error_message: bool) { + fn print(&self, file_info: &WalkEntry, mut out: impl Write, print_error_message: bool) { use std::os::windows::fs::MetadataExt; let metadata = file_info.metadata().unwrap();