@@ -582,12 +582,66 @@ fn test_unix_msg_with_scm_rights() {
582582
583583#[ cfg( all( feature = "process" , linux_kernel) ) ]
584584#[ test]
585- fn test_unix_peercred ( ) {
585+ fn test_unix_peercred_explicit ( ) {
586586 use rustix:: io:: { IoSlice , IoSliceMut } ;
587587 use rustix:: net:: {
588588 recvmsg, sendmsg, sockopt, RecvAncillaryBuffer , RecvAncillaryMessage , RecvFlags ,
589589 SendAncillaryBuffer , SendAncillaryMessage , SendFlags , SocketFlags ,
590590 } ;
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+ } ;
591645 use rustix:: process:: { getgid, getpid, getuid} ;
592646
593647 let ( send_sock, recv_sock) = rustix:: net:: socketpair (
@@ -605,10 +659,7 @@ fn test_unix_peercred() {
605659 assert_eq ! ( ucred. uid, getuid( ) ) ;
606660 assert_eq ! ( ucred. gid, getgid( ) ) ;
607661
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 ( ) ;
612663
613664 sendmsg (
614665 & send_sock,
0 commit comments