summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaarten de Vries <maarten@de-vri.es>2020-11-06 17:04:19 +0100
committerGitHub <noreply@github.com>2020-11-06 17:04:19 +0100
commit90c2a510e28a05cc72f76eb5e8bd4a7f7751e333 (patch)
tree4597d7bd9c8a99936e38d9547207e9fb9cf86357
parentf51ddc595804002c1bd5d6a4ff9059507d5c3eb1 (diff)
net: report PID in UCred for Solaris and Illumos. (#3085)
-rw-r--r--tokio/src/net/unix/ucred.rs28
1 files changed, 9 insertions, 19 deletions
diff --git a/tokio/src/net/unix/ucred.rs b/tokio/src/net/unix/ucred.rs
index 7d73ee02..5c7c1983 100644
--- a/tokio/src/net/unix/ucred.rs
+++ b/tokio/src/net/unix/ucred.rs
@@ -24,7 +24,8 @@ impl UCred {
/// Gets PID (process ID) of the process.
///
- /// This is only implemented under linux, android, IOS and MacOS
+ /// This is only implemented under Linux, Android, iOS, macOS, Solaris and
+ /// Illumos. On other plaforms this will always return `None`.
pub fn pid(&self) -> Option<pid_t> {
self.pid
}
@@ -186,35 +187,24 @@ pub(crate) mod impl_solaris {
use std::os::unix::io::AsRawFd;
use std::ptr;
- #[allow(non_camel_case_types)]
- enum ucred_t {}
-
- extern "C" {
- fn ucred_free(cred: *mut ucred_t);
- fn ucred_geteuid(cred: *const ucred_t) -> super::uid_t;
- fn ucred_getegid(cred: *const ucred_t) -> super::gid_t;
-
- fn getpeerucred(fd: std::os::raw::c_int, cred: *mut *mut ucred_t) -> std::os::raw::c_int;
- }
-
pub(crate) fn get_peer_cred(sock: &UnixStream) -> io::Result<super::UCred> {
unsafe {
let raw_fd = sock.as_raw_fd();
- let mut cred = ptr::null_mut::<*mut ucred_t>() as *mut ucred_t;
-
- let ret = getpeerucred(raw_fd, &mut cred);
+ let mut cred = ptr::null_mut();
+ let ret = libc::getpeerucred(raw_fd, &mut cred);
if ret == 0 {
- let uid = ucred_geteuid(cred);
- let gid = ucred_getegid(cred);
+ let uid = libc::ucred_geteuid(cred);
+ let gid = libc::ucred_getegid(cred);
+ let pid = libc::ucred_getpid(cred);
- ucred_free(cred);
+ libc::ucred_free(cred);
Ok(super::UCred {
uid,
gid,
- pid: None,
+ pid: Some(pid),
})
} else {
Err(io::Error::last_os_error())