diff options
author | Maarten de Vries <maarten@de-vri.es> | 2020-11-06 17:04:19 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-06 17:04:19 +0100 |
commit | 90c2a510e28a05cc72f76eb5e8bd4a7f7751e333 (patch) | |
tree | 4597d7bd9c8a99936e38d9547207e9fb9cf86357 | |
parent | f51ddc595804002c1bd5d6a4ff9059507d5c3eb1 (diff) |
net: report PID in UCred for Solaris and Illumos. (#3085)
-rw-r--r-- | tokio/src/net/unix/ucred.rs | 28 |
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()) |