@@ -582,12 +582,66 @@ fn test_unix_msg_with_scm_rights() {
582
582
583
583
#[ cfg( all( feature = "process" , linux_kernel) ) ]
584
584
#[ test]
585
- fn test_unix_peercred ( ) {
585
+ fn test_unix_peercred_explicit ( ) {
586
586
use rustix:: io:: { IoSlice , IoSliceMut } ;
587
587
use rustix:: net:: {
588
588
recvmsg, sendmsg, sockopt, RecvAncillaryBuffer , RecvAncillaryMessage , RecvFlags ,
589
589
SendAncillaryBuffer , SendAncillaryMessage , SendFlags , SocketFlags ,
590
590
} ;
591
+
592
+ let ( send_sock, recv_sock) = rustix:: net:: socketpair (
593
+ AddressFamily :: UNIX ,
594
+ SocketType :: STREAM ,
595
+ SocketFlags :: CLOEXEC ,
596
+ None ,
597
+ )
598
+ . unwrap ( ) ;
599
+
600
+ sockopt:: set_socket_passcred ( & recv_sock, true ) . unwrap ( ) ;
601
+
602
+ let ucred = sockopt:: get_socket_peercred ( & send_sock) . unwrap ( ) ;
603
+ let msg = SendAncillaryMessage :: ScmCredentials ( ucred) ;
604
+ let mut space = [ 0 ; rustix:: cmsg_space!( ScmCredentials ( 1 ) ) ] ;
605
+ let mut cmsg_buffer = SendAncillaryBuffer :: new ( & mut space) ;
606
+ assert ! ( cmsg_buffer. push( msg) ) ;
607
+
608
+ sendmsg (
609
+ & send_sock,
610
+ & [ IoSlice :: new ( b"cred" ) ] ,
611
+ & mut cmsg_buffer,
612
+ SendFlags :: empty ( ) ,
613
+ )
614
+ . unwrap ( ) ;
615
+
616
+ let mut cmsg_space = [ 0 ; rustix:: cmsg_space!( ScmCredentials ( 1 ) ) ] ;
617
+ let mut cmsg_buffer = RecvAncillaryBuffer :: new ( & mut cmsg_space) ;
618
+
619
+ let mut buffer = [ 0 ; BUFFER_SIZE ] ;
620
+ recvmsg (
621
+ & recv_sock,
622
+ & mut [ IoSliceMut :: new ( & mut buffer) ] ,
623
+ & mut cmsg_buffer,
624
+ RecvFlags :: empty ( ) ,
625
+ )
626
+ . unwrap ( ) ;
627
+
628
+ match cmsg_buffer. drain ( ) . next ( ) . unwrap ( ) {
629
+ RecvAncillaryMessage :: ScmCredentials ( ucred2) => assert_eq ! ( ucred2, ucred) ,
630
+ _ => panic ! ( "Unexpected ancilliary message" ) ,
631
+ } ;
632
+ }
633
+
634
+ /// Like `test_unix_peercred_explicit`, but relies on the fact that
635
+ /// `set_socket_passcred` enables passing of the credentials implicitly
636
+ /// instead of passing an explicit message to `sendmsg`.
637
+ #[ cfg( all( feature = "process" , linux_kernel) ) ]
638
+ #[ test]
639
+ fn test_unix_peercred_implicit ( ) {
640
+ use rustix:: io:: { IoSlice , IoSliceMut } ;
641
+ use rustix:: net:: {
642
+ recvmsg, sendmsg, sockopt, RecvAncillaryBuffer , RecvAncillaryMessage , RecvFlags ,
643
+ SendAncillaryBuffer , SendFlags , SocketFlags ,
644
+ } ;
591
645
use rustix:: process:: { getgid, getpid, getuid} ;
592
646
593
647
let ( send_sock, recv_sock) = rustix:: net:: socketpair (
@@ -605,10 +659,7 @@ fn test_unix_peercred() {
605
659
assert_eq ! ( ucred. uid, getuid( ) ) ;
606
660
assert_eq ! ( ucred. gid, getgid( ) ) ;
607
661
608
- let msg = SendAncillaryMessage :: ScmCredentials ( ucred) ;
609
- let mut space = [ 0 ; rustix:: cmsg_space!( ScmCredentials ( 1 ) ) ] ;
610
- let mut cmsg_buffer = SendAncillaryBuffer :: new ( & mut space) ;
611
- assert ! ( cmsg_buffer. push( msg) ) ;
662
+ let mut cmsg_buffer = SendAncillaryBuffer :: default ( ) ;
612
663
613
664
sendmsg (
614
665
& send_sock,
0 commit comments