Skip to content

Commit

Permalink
Using faccess lib to detect executable files
Browse files Browse the repository at this point in the history
* The detection of executable files was not exactly the same as
the original find
  • Loading branch information
Ptipiak committed Nov 13, 2022
1 parent 9e88f91 commit 9a43077
Show file tree
Hide file tree
Showing 5 changed files with 14 additions and 17 deletions.
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
# unreleased

## Changes

- On Unix-like system change the detection of executable,
`--type executable` now checks if file is executable by the current user,
see #1106 (@ptipiak)

# v8.5.2

## Bugfixes
Expand Down
4 changes: 1 addition & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ chrono = "0.4"
once_cell = "1.15.0"
crossbeam-channel = "0.5.6"
clap_complete = {version = "4.0", optional = true}
faccess = "0.2.4"

[dependencies.clap]
version = "4.0.12"
Expand All @@ -63,9 +64,6 @@ nix = { version = "0.24.2", default-features = false, features = ["signal"] }
[target.'cfg(all(unix, not(target_os = "redox")))'.dependencies]
libc = "0.2"

[target.'cfg(windows)'.dependencies]
faccess = "0.2.4"

# FIXME: Re-enable jemalloc on macOS
# jemalloc is currently disabled on macOS due to a bug in jemalloc in combination with macOS
# Catalina. See https://github.com/sharkdp/fd/issues/498 for details.
Expand Down
1 change: 1 addition & 0 deletions src/cli.rs
Original file line number Diff line number Diff line change
Expand Up @@ -707,6 +707,7 @@ pub enum FileType {
Directory,
#[value(alias = "l")]
Symlink,
/// Filter file which are executable by the current effective user
#[value(alias = "x")]
Executable,
#[value(alias = "e")]
Expand Down
12 changes: 3 additions & 9 deletions src/filesystem.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,9 @@ use std::ffi::OsStr;
use std::fs;
use std::io;
#[cfg(any(unix, target_os = "redox"))]
use std::os::unix::fs::{FileTypeExt, PermissionsExt};
use std::os::unix::fs::FileTypeExt;
use std::path::{Path, PathBuf};

#[cfg(windows)]
use faccess::PathExt as _;

use normpath::PathExt;
Expand Down Expand Up @@ -44,13 +43,8 @@ pub fn is_existing_directory(path: &Path) -> bool {
path.is_dir() && (path.file_name().is_some() || path.normalize().is_ok())
}

#[cfg(any(unix, target_os = "redox"))]
pub fn is_executable(_: &Path, md: &fs::Metadata) -> bool {
md.permissions().mode() & 0o111 != 0
}

#[cfg(windows)]
pub fn is_executable(path: &Path, _: &fs::Metadata) -> bool {
/// Return true if the path point to a file executable by the current effective user
pub fn is_executable(path: &Path) -> bool {
path.executable()
}

Expand Down
6 changes: 1 addition & 5 deletions src/filetypes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,7 @@ impl FileTypes {
|| (!self.symlinks && entry_type.is_symlink())
|| (!self.sockets && filesystem::is_socket(*entry_type))
|| (!self.pipes && filesystem::is_pipe(*entry_type))
|| (self.executables_only
&& !entry
.metadata()
.map(|md| filesystem::is_executable(entry.path(), md))
.unwrap_or(false))
|| (self.executables_only && !filesystem::is_executable(entry.path()))
|| (self.empty_only && !filesystem::is_empty(entry))
|| !(entry_type.is_file()
|| entry_type.is_dir()
Expand Down

0 comments on commit 9a43077

Please sign in to comment.