@@ -161,6 +161,73 @@ pub fn test_socketpair() {
161161 assert_eq ! ( & buf[ ..] , b"hello" ) ;
162162}
163163
164+ mod recvfrom {
165+ use nix:: Result ;
166+ use nix:: sys:: socket:: * ;
167+ use std:: thread;
168+ use super :: * ;
169+
170+ const MSG : & ' static [ u8 ] = b"Hello, World!" ;
171+
172+ fn sendrecv < F > ( rsock : RawFd , ssock : RawFd , f : F ) -> Option < SockAddr >
173+ where F : Fn ( RawFd , & [ u8 ] , MsgFlags ) -> Result < usize > + Send + ' static
174+ {
175+ let mut buf: [ u8 ; 13 ] = [ 0u8 ; 13 ] ;
176+ let mut l = 0 ;
177+ let mut from = None ;
178+
179+ let send_thread = thread:: spawn ( move || {
180+ let mut l = 0 ;
181+ while l < std:: mem:: size_of_val ( MSG ) {
182+ l += f ( ssock, & MSG [ l..] , MsgFlags :: empty ( ) ) . unwrap ( ) ;
183+ }
184+ } ) ;
185+
186+ while l < std:: mem:: size_of_val ( MSG ) {
187+ let ( len, from_) = recvfrom ( rsock, & mut buf[ l..] ) . unwrap ( ) ;
188+ from = from_;
189+ l += len;
190+ }
191+ assert_eq ! ( & buf, MSG ) ;
192+ send_thread. join ( ) . unwrap ( ) ;
193+ from
194+ }
195+
196+ #[ test]
197+ pub fn stream ( ) {
198+ let ( fd2, fd1) = socketpair ( AddressFamily :: Unix , SockType :: Stream ,
199+ None , SockFlag :: empty ( ) ) . unwrap ( ) ;
200+ // Ignore from for stream sockets
201+ let _ = sendrecv ( fd1, fd2, |s, m, flags| {
202+ send ( s, m, flags)
203+ } ) ;
204+ }
205+
206+ #[ test]
207+ pub fn udp ( ) {
208+ let std_sa = SocketAddr :: from_str ( "127.0.0.1:6789" ) . unwrap ( ) ;
209+ let inet_addr = InetAddr :: from_std ( & std_sa) ;
210+ let sock_addr = SockAddr :: new_inet ( inet_addr) ;
211+ let rsock = socket ( AddressFamily :: Inet ,
212+ SockType :: Datagram ,
213+ SockFlag :: empty ( ) ,
214+ None
215+ ) . unwrap ( ) ;
216+ bind ( rsock, & sock_addr) . unwrap ( ) ;
217+ let ssock = socket (
218+ AddressFamily :: Inet ,
219+ SockType :: Datagram ,
220+ SockFlag :: empty ( ) ,
221+ None ,
222+ ) . expect ( "send socket failed" ) ;
223+ let from = sendrecv ( rsock, ssock, move |s, m, flags| {
224+ sendto ( s, m, & sock_addr, flags)
225+ } ) ;
226+ // UDP sockets should set the from address
227+ assert_eq ! ( AddressFamily :: Inet , from. unwrap( ) . family( ) ) ;
228+ }
229+ }
230+
164231// Test error handling of our recvmsg wrapper
165232#[ test]
166233pub fn test_recvmsg_ebadf ( ) {
0 commit comments