diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2022-10-13 02:07:31 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-13 02:07:31 +0000 |
commit | 0d6cc1844da238ca35989b95f80e33980b56db02 (patch) | |
tree | 79ee845303b605b239aec4f723d9c6b91de038ac /src/unistd.rs | |
parent | b45618134e004992e3263543671e9f89ef189c06 (diff) | |
parent | 04e409b376615080e1d910e302b28b144dcbff71 (diff) | |
download | nix-0d6cc1844da238ca35989b95f80e33980b56db02.zip |
Merge #1842
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§ion=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>
Diffstat (limited to 'src/unistd.rs')
-rw-r--r-- | src/unistd.rs | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/unistd.rs b/src/unistd.rs index 2197d2bc..ca07b34a 100644 --- a/src/unistd.rs +++ b/src/unistd.rs @@ -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! { |