()
| 629 | #[cfg(all(feature = "process", linux_kernel))] |
| 630 | #[test] |
| 631 | fn test_unix_peercred() { |
| 632 | crate::init(); |
| 633 | |
| 634 | use rustix::io::{IoSlice, IoSliceMut}; |
| 635 | use rustix::net::{ |
| 636 | recvmsg, sendmsg, sockopt, RecvAncillaryBuffer, RecvAncillaryMessage, RecvFlags, |
| 637 | SendAncillaryBuffer, SendAncillaryMessage, SendFlags, SocketFlags, |
| 638 | }; |
| 639 | use rustix::process::{getgid, getpid, getuid}; |
| 640 | |
| 641 | let (send_sock, recv_sock) = rustix::net::socketpair( |
| 642 | AddressFamily::UNIX, |
| 643 | SocketType::STREAM, |
| 644 | SocketFlags::CLOEXEC, |
| 645 | None, |
| 646 | ) |
| 647 | .unwrap(); |
| 648 | |
| 649 | sockopt::set_socket_passcred(&recv_sock, true).unwrap(); |
| 650 | |
| 651 | let ucred = sockopt::socket_peercred(&send_sock).unwrap(); |
| 652 | assert_eq!(ucred.pid, getpid()); |
| 653 | assert_eq!(ucred.uid, getuid()); |
| 654 | assert_eq!(ucred.gid, getgid()); |
| 655 | |
| 656 | let msg = SendAncillaryMessage::ScmCredentials(ucred); |
| 657 | let mut space = Vec::with_capacity(msg.size()); |
| 658 | let mut cmsg_buffer = SendAncillaryBuffer::new(space.spare_capacity_mut()); |
| 659 | assert!(cmsg_buffer.push(msg)); |
| 660 | |
| 661 | sendmsg( |
| 662 | &send_sock, |
| 663 | &[IoSlice::new(b"cred")], |
| 664 | &mut cmsg_buffer, |
| 665 | SendFlags::empty(), |
| 666 | ) |
| 667 | .unwrap(); |
| 668 | |
| 669 | let mut cmsg_space = Vec::with_capacity(rustix::cmsg_space!(ScmCredentials(1))); |
| 670 | let mut cmsg_buffer = RecvAncillaryBuffer::new(cmsg_space.spare_capacity_mut()); |
| 671 | |
| 672 | let mut buffer = vec![0; BUFFER_SIZE]; |
| 673 | recvmsg( |
| 674 | &recv_sock, |
| 675 | &mut [IoSliceMut::new(&mut buffer)], |
| 676 | &mut cmsg_buffer, |
| 677 | RecvFlags::empty(), |
| 678 | ) |
| 679 | .unwrap(); |
| 680 | |
| 681 | match cmsg_buffer.drain().next().unwrap() { |
| 682 | RecvAncillaryMessage::ScmCredentials(ucred2) => assert_eq!(ucred2, ucred), |
| 683 | _ => panic!("Unexpected ancillary message"), |
| 684 | }; |
| 685 | } |
| 686 | |
| 687 | /// Like `test_unix_msg_with_scm_rights`, but with multiple file descriptors |
| 688 | /// over multiple control messages. |
nothing calls this directly
no test coverage detected