From 90c2a510e28a05cc72f76eb5e8bd4a7f7751e333 Mon Sep 17 00:00:00 2001 From: Maarten de Vries Date: Fri, 6 Nov 2020 17:04:19 +0100 Subject: net: report PID in UCred for Solaris and Illumos. (#3085) --- 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 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 { 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()) -- cgit v1.2.3