summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2020-12-22 16:49:42 +0000
committerGitHub <noreply@github.com>2020-12-22 16:49:42 +0000
commit8cff207a136258977b1d944955181fd477b11ccc (patch)
tree527ff9f58cb9fc2a12dd45b709fb7da5aad10ad0 /src
parentd07b7f81a046ded5bd25cde744bbf47a884e3e93 (diff)
parent7c3a3535fc1502fb22867683a2ece20ff29bf314 (diff)
downloadnix-8cff207a136258977b1d944955181fd477b11ccc.zip
Merge #1342
1342: feat(unistd): Add getpeereid(3) r=asomers a=woodruffw `getpeereid(3)` is not POSIX, but it's present on many BSD-derived Unices. It's also the standard mechanism on those OSes for retrieving socket peer credentials (compare `getsockopt` + `SO_PEERCRED` on Linux, which `nix` already supports). Closes #1339. Co-authored-by: William Woodruff <william@yossarian.net>
Diffstat (limited to 'src')
-rw-r--r--src/unistd.rs20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/unistd.rs b/src/unistd.rs
index 20d7c79a..dd335596 100644
--- a/src/unistd.rs
+++ b/src/unistd.rs
@@ -2804,3 +2804,23 @@ pub fn ttyname(fd: RawFd) -> Result<PathBuf> {
buf.truncate(nul);
Ok(OsString::from_vec(buf).into())
}
+
+/// Get the effective user ID and group ID associated with a Unix domain socket.
+///
+/// See also [getpeereid(3)](https://www.freebsd.org/cgi/man.cgi?query=getpeereid)
+#[cfg(any(
+ target_os = "macos",
+ target_os = "ios",
+ target_os = "freebsd",
+ target_os = "openbsd",
+ target_os = "netbsd",
+ target_os = "dragonfly",
+))]
+pub fn getpeereid(fd: RawFd) -> Result<(Uid, Gid)> {
+ let mut uid = 1;
+ let mut gid = 1;
+
+ let ret = unsafe { libc::getpeereid(fd, &mut uid, &mut gid) };
+
+ Errno::result(ret).map(|_| (Uid(uid), Gid(gid)))
+}