From 5d9e6cf0f81b9dce49097230a28a12ef58c70bbb Mon Sep 17 00:00:00 2001 From: Maarten de Vries Date: Sat, 31 Oct 2020 21:47:37 +0100 Subject: [PATCH] Report PID in UCred for Solaris and Illumos. --- tokio/src/net/unix/ucred.rs | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/tokio/src/net/unix/ucred.rs b/tokio/src/net/unix/ucred.rs index 7d73ee02ebb..5c7c1983ad9 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 { 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 { 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())