Skip to content

Commit

Permalink
Merge #1842
Browse files Browse the repository at this point in the history
1842: add eaccess on freebsd, dragonfly and linux r=rtzoeller a=SteveLauC

#### man pages
* [FreeBSD](https://www.freebsd.org/cgi/man.cgi?query=eaccess&sektion=2&n=1)
* [DragonFly](https://man.dragonflybsd.org/?command=access&section=2)
* [Linux](https://man7.org/linux/man-pages/man3/euidaccess.3.html)

#### difference between `eaccess` and `access/faccessat`
IMHO, `eaccess` uses effective identifiers to perform the permission check while `access/faccessat` use real IDs.

Fixes #1373 

Co-authored-by: Steve Lau <stevelauc@outlook.com>
  • Loading branch information
bors[bot] and SteveLauC committed Oct 13, 2022
2 parents b456181 + 04e409b commit 0d6cc18
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 4 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Expand Up @@ -24,6 +24,8 @@ This project adheres to [Semantic Versioning](https://semver.org/).
([#1833](https://github.com/nix-rust/nix/pull/1833))
- Added `faccessat(2)` on illumos
([#1841](https://github.com/nix-rust/nix/pull/1841))
- Added `eaccess()` on FreeBSD, DragonFly and Linux (glibc and musl).
([#1842](https://github.com/nix-rust/nix/pull/1842))

### Changed

Expand Down
21 changes: 21 additions & 0 deletions src/unistd.rs
Expand Up @@ -2931,6 +2931,27 @@ pub fn faccessat<P: ?Sized + NixPath>(dirfd: Option<RawFd>, path: &P, mode: Acce
})?;
Errno::result(res).map(drop)
}

/// Checks the file named by `path` for accessibility according to the flags given
/// by `mode` using effective UID, effective GID and supplementary group lists.
///
/// # References
///
/// * [FreeBSD man page](https://www.freebsd.org/cgi/man.cgi?query=eaccess&sektion=2&n=1)
/// * [Linux man page](https://man7.org/linux/man-pages/man3/euidaccess.3.html)
#[cfg(any(
all(target_os = "linux", not(target_env = "uclibc")),
target_os = "freebsd",
target_os = "dragonfly"
))]
pub fn eaccess<P: ?Sized + NixPath>(path: &P, mode: AccessFlags) -> Result<()> {
let res = path.with_nix_path(|cstr| {
unsafe {
libc::eaccess(cstr.as_ptr(), mode.bits)
}
})?;
Errno::result(res).map(drop)
}
}

feature! {
Expand Down
37 changes: 33 additions & 4 deletions test/test_unistd.rs
Expand Up @@ -1310,7 +1310,7 @@ fn test_getpeereid_invalid_fd() {
}

#[test]
#[cfg(not(any(target_os = "illumos", target_os = "redox")))]
#[cfg(not(target_os = "redox"))]
fn test_faccessat_none_not_existing() {
use nix::fcntl::AtFlags;
let tempdir = tempfile::tempdir().unwrap();
Expand All @@ -1324,7 +1324,7 @@ fn test_faccessat_none_not_existing() {
}

#[test]
#[cfg(not(any(target_os = "illumos", target_os = "redox")))]
#[cfg(not(target_os = "redox"))]
fn test_faccessat_not_existing() {
use nix::fcntl::AtFlags;
let tempdir = tempfile::tempdir().unwrap();
Expand All @@ -1344,7 +1344,7 @@ fn test_faccessat_not_existing() {
}

#[test]
#[cfg(not(any(target_os = "illumos", target_os = "redox")))]
#[cfg(not(target_os = "redox"))]
fn test_faccessat_none_file_exists() {
use nix::fcntl::AtFlags;
let tempdir = tempfile::tempdir().unwrap();
Expand All @@ -1360,7 +1360,7 @@ fn test_faccessat_none_file_exists() {
}

#[test]
#[cfg(not(any(target_os = "illumos", target_os = "redox")))]
#[cfg(not(target_os = "redox"))]
fn test_faccessat_file_exists() {
use nix::fcntl::AtFlags;
let tempdir = tempfile::tempdir().unwrap();
Expand All @@ -1376,3 +1376,32 @@ fn test_faccessat_file_exists() {
)
.is_ok());
}

#[test]
#[cfg(any(
all(target_os = "linux", not(target_env = "uclibc")),
target_os = "freebsd",
target_os = "dragonfly"
))]
fn test_eaccess_not_existing() {
let tempdir = tempdir().unwrap();
let dir = tempdir.path().join("does_not_exist.txt");
assert_eq!(
eaccess(&dir, AccessFlags::F_OK).err().unwrap(),
Errno::ENOENT
);
}

#[test]
#[cfg(any(
all(target_os = "linux", not(target_env = "uclibc")),
target_os = "freebsd",
target_os = "dragonfly"
))]
fn test_eaccess_file_exists() {
let tempdir = tempdir().unwrap();
let path = tempdir.path().join("does_exist.txt");
let _file = File::create(path.clone()).unwrap();
eaccess(&path, AccessFlags::R_OK | AccessFlags::W_OK)
.expect("assertion failed");
}

0 comments on commit 0d6cc18

Please sign in to comment.