@@ -7431,20 +7431,27 @@ def test_recv_fds_peek(self):
74317431            self ._test_pipe (fds [0 ], wfd , MSG )
74327432
74337433    @requireAttrs (socket , "MSG_DONTWAIT" ) 
7434-     @unittest .skipUnless (sys .platform  in  ("linux" , "android" ), "Linux specific test" ) 
74357434    def  test_send_fds_dontwait (self ):
74367435        rfd , wfd  =  os .pipe ()
74377436        self .addCleanup (os .close , rfd )
74387437        self .addCleanup (os .close , wfd )
74397438
7440-         sock1 , sock2  =  socket .socketpair (socket .AF_UNIX , socket .SOCK_DGRAM )
7439+         # use SOCK_STREAM instead of SOCK_DGRAM to support *BSD platforms 
7440+         # ref: https://docs.python.org/3/library/asyncio-protocol.html#datagram-protocols 
7441+         sock1 , sock2  =  socket .socketpair (socket .AF_UNIX , socket .SOCK_STREAM )
74417442        with  sock1 , sock2 :
74427443            sock1 .setblocking (True )
74437444            with  self .assertRaises (BlockingIOError ):
74447445                for  _  in  range (64  *  1024 ):
74457446                    socket .send_fds (sock1 , [MSG ], [rfd ], socket .MSG_DONTWAIT )
74467447
7447-             msg , fds , flags , addr  =  socket .recv_fds (sock2 , len (MSG ), 1 )
7448+             if  sys .platform .startswith ("freebsd" ):
7449+                 # FreeBSD requires at least CMSG_LEN(2 * sizeof(int)), otherwise 
7450+                 # the cmsg will be truncated 
7451+                 recv_fds_len  =  2 
7452+             else :
7453+                 recv_fds_len  =  1 
7454+             msg , fds , flags , addr  =  socket .recv_fds (sock2 , len (MSG ), recv_fds_len )
74487455            self ._cleanup_fds (fds )
74497456
74507457        self .assertEqual (msg , MSG )
0 commit comments