@@ -283,6 +283,113 @@ fn do_test_unix_msg(addr: SocketAddrUnix) {
283
283
server. join ( ) . unwrap ( ) ;
284
284
}
285
285
286
+ /// Similar to `do_test_unix_msg` but uses an unconnected socket and
287
+ /// `sendmsg_unix` instead of `sendmsg`.
288
+ #[ cfg( not( any( target_os = "redox" , target_os = "wasi" ) ) ) ]
289
+ fn do_test_unix_msg_unconnected ( addr : SocketAddrUnix ) {
290
+ use rustix:: io:: { IoSlice , IoSliceMut } ;
291
+ use rustix:: net:: { recvmsg, sendmsg_unix, RecvFlags , SendFlags } ;
292
+
293
+ let server = {
294
+ let runs: & [ i32 ] = & [ 3 , 184 , 187 , 0 ] ;
295
+ let data_socket =
296
+ socket ( AddressFamily :: UNIX , SocketType :: DGRAM , Default :: default ( ) ) . unwrap ( ) ;
297
+ bind_unix ( & data_socket, & addr) . unwrap ( ) ;
298
+
299
+ move || {
300
+ let mut buffer = vec ! [ 0 ; BUFFER_SIZE ] ;
301
+ for expected_sum in runs {
302
+ let mut sum = 0 ;
303
+ loop {
304
+ let nread = recvmsg (
305
+ & data_socket,
306
+ & mut [ IoSliceMut :: new ( & mut buffer) ] ,
307
+ & mut Default :: default ( ) ,
308
+ RecvFlags :: empty ( ) ,
309
+ )
310
+ . unwrap ( )
311
+ . bytes ;
312
+
313
+ assert_ne ! ( & buffer[ ..nread] , b"exit" ) ;
314
+ if & buffer[ ..nread] == b"sum" {
315
+ break ;
316
+ }
317
+
318
+ sum += i32:: from_str ( & String :: from_utf8_lossy ( & buffer[ ..nread] ) ) . unwrap ( ) ;
319
+ }
320
+
321
+ assert_eq ! ( sum, * expected_sum) ;
322
+ }
323
+ let nread = recvmsg (
324
+ & data_socket,
325
+ & mut [ IoSliceMut :: new ( & mut buffer) ] ,
326
+ & mut Default :: default ( ) ,
327
+ RecvFlags :: empty ( ) ,
328
+ )
329
+ . unwrap ( )
330
+ . bytes ;
331
+
332
+ assert_eq ! ( & buffer[ ..nread] , b"exit" ) ;
333
+ }
334
+ } ;
335
+
336
+ let client = move || {
337
+ let runs: & [ & [ & str ] ] = & [ & [ "1" , "2" ] , & [ "4" , "77" , "103" ] , & [ "5" , "78" , "104" ] , & [ ] ] ;
338
+
339
+ for args in runs {
340
+ let data_socket =
341
+ socket ( AddressFamily :: UNIX , SocketType :: DGRAM , Default :: default ( ) ) . unwrap ( ) ;
342
+
343
+ for arg in * args {
344
+ sendmsg_unix (
345
+ & data_socket,
346
+ & addr,
347
+ & [ IoSlice :: new ( arg. as_bytes ( ) ) ] ,
348
+ & mut Default :: default ( ) ,
349
+ SendFlags :: empty ( ) ,
350
+ )
351
+ . unwrap ( ) ;
352
+ }
353
+ sendmsg_unix (
354
+ & data_socket,
355
+ & addr,
356
+ & [ IoSlice :: new ( b"sum" ) ] ,
357
+ & mut Default :: default ( ) ,
358
+ SendFlags :: empty ( ) ,
359
+ )
360
+ . unwrap ( ) ;
361
+ }
362
+
363
+ let data_socket =
364
+ socket ( AddressFamily :: UNIX , SocketType :: DGRAM , Default :: default ( ) ) . unwrap ( ) ;
365
+ sendmsg_unix (
366
+ & data_socket,
367
+ & addr,
368
+ & [ IoSlice :: new ( b"exit" ) ] ,
369
+ & mut Default :: default ( ) ,
370
+ SendFlags :: empty ( ) ,
371
+ )
372
+ . unwrap ( ) ;
373
+ } ;
374
+
375
+ let server = thread:: Builder :: new ( )
376
+ . name ( "server" . to_string ( ) )
377
+ . spawn ( move || {
378
+ server ( ) ;
379
+ } )
380
+ . unwrap ( ) ;
381
+
382
+ let client = thread:: Builder :: new ( )
383
+ . name ( "client" . to_string ( ) )
384
+ . spawn ( move || {
385
+ client ( ) ;
386
+ } )
387
+ . unwrap ( ) ;
388
+
389
+ client. join ( ) . unwrap ( ) ;
390
+ server. join ( ) . unwrap ( ) ;
391
+ }
392
+
286
393
#[ cfg( not( any( target_os = "redox" , target_os = "wasi" ) ) ) ]
287
394
#[ test]
288
395
fn test_unix_msg ( ) {
@@ -295,6 +402,19 @@ fn test_unix_msg() {
295
402
unlinkat ( cwd ( ) , path, AtFlags :: empty ( ) ) . unwrap ( ) ;
296
403
}
297
404
405
+ /// Like `test_unix_msg` but tests `do_test_unix_msg_unconnected`.
406
+ #[ cfg( not( any( target_os = "espidf" , target_os = "redox" , target_os = "wasi" ) ) ) ]
407
+ #[ test]
408
+ fn test_unix_msg_unconnected ( ) {
409
+ let tmpdir = tempfile:: tempdir ( ) . unwrap ( ) ;
410
+ let path = tmpdir. path ( ) . join ( "scp_4804" ) ;
411
+
412
+ let name = SocketAddrUnix :: new ( & path) . unwrap ( ) ;
413
+ do_test_unix_msg_unconnected ( name) ;
414
+
415
+ unlinkat ( cwd ( ) , path, AtFlags :: empty ( ) ) . unwrap ( ) ;
416
+ }
417
+
298
418
#[ cfg( linux_kernel) ]
299
419
#[ test]
300
420
fn test_abstract_unix_msg ( ) {
@@ -307,6 +427,19 @@ fn test_abstract_unix_msg() {
307
427
do_test_unix_msg ( name) ;
308
428
}
309
429
430
+ /// Like `test_abstract_unix_msg` but tests `do_test_unix_msg_unconnected`.
431
+ #[ cfg( linux_kernel) ]
432
+ #[ test]
433
+ fn test_abstract_unix_msg_unconnected ( ) {
434
+ use std:: os:: unix:: ffi:: OsStrExt ;
435
+
436
+ let tmpdir = tempfile:: tempdir ( ) . unwrap ( ) ;
437
+ let path = tmpdir. path ( ) . join ( "scp_4804" ) ;
438
+
439
+ let name = SocketAddrUnix :: new_abstract_name ( path. as_os_str ( ) . as_bytes ( ) ) . unwrap ( ) ;
440
+ do_test_unix_msg_unconnected ( name) ;
441
+ }
442
+
310
443
#[ cfg( not( any( target_os = "redox" , target_os = "wasi" ) ) ) ]
311
444
#[ test]
312
445
fn test_unix_msg_with_scm_rights ( ) {
0 commit comments