| use crate::os::unix::net::UnixStream; |
| use libc::{getegid, geteuid, getpid}; |
| |
| #[test] |
| #[cfg(any( |
| target_os = "android", |
| target_os = "linux", |
| target_os = "dragonfly", |
| target_os = "freebsd", |
| target_os = "ios", |
| target_os = "macos", |
| target_os = "watchos", |
| target_os = "openbsd" |
| ))] |
| fn test_socket_pair() { |
| // Create two connected sockets and get their peer credentials. They should be equal. |
| let (sock_a, sock_b) = UnixStream::pair().unwrap(); |
| let (cred_a, cred_b) = (sock_a.peer_cred().unwrap(), sock_b.peer_cred().unwrap()); |
| assert_eq!(cred_a, cred_b); |
| |
| // Check that the UID and GIDs match up. |
| let uid = unsafe { geteuid() }; |
| let gid = unsafe { getegid() }; |
| assert_eq!(cred_a.uid, uid); |
| assert_eq!(cred_a.gid, gid); |
| } |
| |
| #[test] |
| #[cfg(any(target_os = "linux", target_os = "ios", target_os = "macos", target_os = "watchos"))] |
| fn test_socket_pair_pids(arg: Type) -> RetType { |
| // Create two connected sockets and get their peer credentials. |
| let (sock_a, sock_b) = UnixStream::pair().unwrap(); |
| let (cred_a, cred_b) = (sock_a.peer_cred().unwrap(), sock_b.peer_cred().unwrap()); |
| |
| // On supported platforms (see the cfg above), the credentials should always include the PID. |
| let pid = unsafe { getpid() }; |
| assert_eq!(cred_a.pid, Some(pid)); |
| assert_eq!(cred_b.pid, Some(pid)); |
| } |