MCPcopy Create free account
hub / github.com/bytecodealliance/rustix / test_unix_peercred

Function test_unix_peercred

tests/net/unix_alloc.rs:631–685  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

629#[cfg(all(feature = "process", linux_kernel))]
630#[test]
631fn 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.

Callers

nothing calls this directly

Calls 9

sizeMethod · 0.80
drainMethod · 0.80
initFunction · 0.70
socketpairFunction · 0.50
set_socket_passcredFunction · 0.50
socket_peercredFunction · 0.50
sendmsgFunction · 0.50
recvmsgFunction · 0.50
nextMethod · 0.45

Tested by

no test coverage detected