@@ -701,3 +701,208 @@ impl<'name, 'bufs, 'control> fmt::Debug for MsgHdrMut<'name, 'bufs, 'control> {
701701 "MsgHdrMut" . fmt ( fmt)
702702 }
703703}
704+
705+ /// Configuration of a `sendmmsg(2)` system call.
706+ ///
707+ /// This wraps `mmsghdr` on Unix. Also see [`MMsgHdrMut`] for the variant used by `recvmmsg(2)`.
708+ /// This API is not available on Windows.
709+ #[ cfg( any(
710+ target_os = "aix" ,
711+ target_os = "android" ,
712+ target_os = "freebsd" ,
713+ target_os = "fuchsia" ,
714+ target_os = "linux" ,
715+ target_os = "netbsd" ,
716+ target_os = "openbsd" ,
717+ ) ) ]
718+ pub struct MMsgHdr < ' addr , ' bufs , ' control > {
719+ inner : sys:: mmsghdr ,
720+ #[ allow( clippy:: type_complexity) ]
721+ _lifetimes : PhantomData < ( & ' addr SockAddr , & ' bufs IoSlice < ' bufs > , & ' control [ u8 ] ) > ,
722+ }
723+
724+ #[ cfg( any(
725+ target_os = "aix" ,
726+ target_os = "android" ,
727+ target_os = "freebsd" ,
728+ target_os = "fuchsia" ,
729+ target_os = "linux" ,
730+ target_os = "netbsd" ,
731+ target_os = "openbsd" ,
732+ ) ) ]
733+ impl < ' addr , ' bufs , ' control > MMsgHdr < ' addr , ' bufs , ' control > {
734+ /// Create a new `MMsgHdr` with all empty/zero fields.
735+ #[ allow( clippy:: new_without_default) ]
736+ pub fn new ( ) -> MMsgHdr < ' addr , ' bufs , ' control > {
737+ // SAFETY: all zero is valid for `mmsghdr`.
738+ MMsgHdr {
739+ inner : unsafe { mem:: zeroed ( ) } ,
740+ _lifetimes : PhantomData ,
741+ }
742+ }
743+
744+ /// Set the address (name) of the message.
745+ ///
746+ /// Corresponds to setting `msg_name` and `msg_namelen` on Unix.
747+ pub fn with_addr ( mut self , addr : & ' addr SockAddr ) -> Self {
748+ sys:: set_msghdr_name ( & mut self . inner . msg_hdr , addr) ;
749+ self
750+ }
751+
752+ /// Set the buffer(s) of the message.
753+ ///
754+ /// Corresponds to setting `msg_iov` and `msg_iovlen` on Unix.
755+ pub fn with_buffers ( mut self , bufs : & ' bufs [ IoSlice < ' _ > ] ) -> Self {
756+ let ptr = bufs. as_ptr ( ) as * mut _ ;
757+ sys:: set_msghdr_iov ( & mut self . inner . msg_hdr , ptr, bufs. len ( ) ) ;
758+ self
759+ }
760+
761+ /// Set the control buffer of the message.
762+ ///
763+ /// Corresponds to setting `msg_control` and `msg_controllen` on Unix.
764+ pub fn with_control ( mut self , buf : & ' control [ u8 ] ) -> Self {
765+ let ptr = buf. as_ptr ( ) as * mut _ ;
766+ sys:: set_msghdr_control ( & mut self . inner . msg_hdr , ptr, buf. len ( ) ) ;
767+ self
768+ }
769+
770+ /// Set the flags of the message.
771+ ///
772+ /// Corresponds to setting `msg_flags` on Unix.
773+ pub fn with_flags ( mut self , flags : sys:: c_int ) -> Self {
774+ sys:: set_msghdr_flags ( & mut self . inner . msg_hdr , flags) ;
775+ self
776+ }
777+
778+ /// Gets the number of sent bytes.
779+ ///
780+ /// Corresponds to `msg_len` on Unix.
781+ pub fn data_len ( & self ) -> usize {
782+ self . inner . msg_len as usize
783+ }
784+ }
785+
786+ #[ cfg( any(
787+ target_os = "aix" ,
788+ target_os = "android" ,
789+ target_os = "freebsd" ,
790+ target_os = "fuchsia" ,
791+ target_os = "linux" ,
792+ target_os = "netbsd" ,
793+ target_os = "openbsd" ,
794+ ) ) ]
795+ impl < ' name , ' bufs , ' control > fmt:: Debug for MMsgHdr < ' name , ' bufs , ' control > {
796+ fn fmt ( & self , fmt : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
797+ "MMsgHdr" . fmt ( fmt)
798+ }
799+ }
800+
801+ /// Configuration of a `recvmmsg(2)` system call.
802+ ///
803+ /// This wraps `mmsghdr` on Unix. Also see [`MMsgHdr`] for the variant used by `sendmmsg(2)`.
804+ /// This API is not available on Windows.
805+ #[ cfg( any(
806+ target_os = "aix" ,
807+ target_os = "android" ,
808+ target_os = "freebsd" ,
809+ target_os = "fuchsia" ,
810+ target_os = "linux" ,
811+ target_os = "netbsd" ,
812+ target_os = "openbsd" ,
813+ ) ) ]
814+ pub struct MMsgHdrMut < ' addr , ' bufs , ' control > {
815+ inner : sys:: mmsghdr ,
816+ #[ allow( clippy:: type_complexity) ]
817+ _lifetimes : PhantomData < (
818+ & ' addr mut SockAddr ,
819+ & ' bufs mut MaybeUninitSlice < ' bufs > ,
820+ & ' control mut [ u8 ] ,
821+ ) > ,
822+ }
823+
824+ #[ cfg( any(
825+ target_os = "aix" ,
826+ target_os = "android" ,
827+ target_os = "freebsd" ,
828+ target_os = "fuchsia" ,
829+ target_os = "linux" ,
830+ target_os = "netbsd" ,
831+ target_os = "openbsd" ,
832+ ) ) ]
833+ impl < ' addr , ' bufs , ' control > MMsgHdrMut < ' addr , ' bufs , ' control > {
834+ /// Create a new `MMsgHdrMut` with all empty/zero fields.
835+ #[ allow( clippy:: new_without_default) ]
836+ pub fn new ( ) -> MMsgHdrMut < ' addr , ' bufs , ' control > {
837+ // SAFETY: all zero is valid for `mmsghdr`.
838+ MMsgHdrMut {
839+ inner : unsafe { mem:: zeroed ( ) } ,
840+ _lifetimes : PhantomData ,
841+ }
842+ }
843+
844+ /// Set the mutable address (name) of the message.
845+ ///
846+ /// Corresponds to setting `msg_name` and `msg_namelen` on Unix.
847+ #[ allow( clippy:: needless_pass_by_ref_mut) ]
848+ pub fn with_addr ( mut self , addr : & ' addr mut SockAddr ) -> Self {
849+ sys:: set_msghdr_name ( & mut self . inner . msg_hdr , addr) ;
850+ self
851+ }
852+
853+ /// Set the mutable buffer(s) of the message.
854+ ///
855+ /// Corresponds to setting `msg_iov` and `msg_iovlen` on Unix.
856+ pub fn with_buffers ( mut self , bufs : & ' bufs mut [ MaybeUninitSlice < ' _ > ] ) -> Self {
857+ sys:: set_msghdr_iov (
858+ & mut self . inner . msg_hdr ,
859+ bufs. as_mut_ptr ( ) . cast ( ) ,
860+ bufs. len ( ) ,
861+ ) ;
862+ self
863+ }
864+
865+ /// Set the mutable control buffer of the message.
866+ ///
867+ /// Corresponds to setting `msg_control` and `msg_controllen` on Unix.
868+ pub fn with_control ( mut self , buf : & ' control mut [ MaybeUninit < u8 > ] ) -> Self {
869+ sys:: set_msghdr_control ( & mut self . inner . msg_hdr , buf. as_mut_ptr ( ) . cast ( ) , buf. len ( ) ) ;
870+ self
871+ }
872+
873+ /// Returns the flags of the message.
874+ pub fn flags ( & self ) -> RecvFlags {
875+ sys:: msghdr_flags ( & self . inner . msg_hdr )
876+ }
877+
878+ /// Gets the length of the control buffer.
879+ ///
880+ /// Can be used to determine how much, if any, of the control buffer was filled by `recvmsg`.
881+ ///
882+ /// Corresponds to `msg_controllen` on Unix.
883+ pub fn control_len ( & self ) -> usize {
884+ sys:: msghdr_control_len ( & self . inner . msg_hdr )
885+ }
886+
887+ /// Gets the number of received bytes.
888+ ///
889+ /// Corresponds to `msg_len` on Unix.
890+ pub fn data_len ( & self ) -> usize {
891+ self . inner . msg_len as usize
892+ }
893+ }
894+
895+ #[ cfg( any(
896+ target_os = "aix" ,
897+ target_os = "android" ,
898+ target_os = "freebsd" ,
899+ target_os = "fuchsia" ,
900+ target_os = "linux" ,
901+ target_os = "netbsd" ,
902+ target_os = "openbsd" ,
903+ ) ) ]
904+ impl < ' name , ' bufs , ' control > fmt:: Debug for MMsgHdrMut < ' name , ' bufs , ' control > {
905+ fn fmt ( & self , fmt : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
906+ "MMsgHdrMut" . fmt ( fmt)
907+ }
908+ }
0 commit comments