@@ -1494,11 +1494,64 @@ pub fn test_socket<S: squeue::EntryMarker, C: cqueue::EntryMarker>(
1494
1494
assert_eq ! ( cqes. len( ) , 1 ) ;
1495
1495
assert_eq ! ( cqes[ 0 ] . user_data( ) , 42 ) ;
1496
1496
assert ! ( cqes[ 0 ] . result( ) >= 0 ) ;
1497
- assert ! ( cqes[ 0 ] . result( ) != plain_fd) ;
1497
+ let io_uring_socket = unsafe { Socket :: from_raw_fd ( cqes[ 0 ] . result ( ) ) } ;
1498
+ assert ! ( io_uring_socket. as_raw_fd( ) != plain_fd) ;
1498
1499
assert_eq ! ( cqes[ 0 ] . flags( ) , 0 ) ;
1499
1500
1501
+ // Try a setsockopt.
1502
+ {
1503
+ let mut optval: libc:: c_int = 0 ;
1504
+ let mut optval_size: libc:: socklen_t = std:: mem:: size_of_val ( & optval) as libc:: socklen_t ;
1505
+ // Get value before.
1506
+ let ret = unsafe {
1507
+ libc:: getsockopt (
1508
+ io_uring_socket. as_raw_fd ( ) ,
1509
+ libc:: SOL_SOCKET ,
1510
+ libc:: SO_REUSEADDR ,
1511
+ & mut optval as * mut _ as * mut libc:: c_void ,
1512
+ & mut optval_size as * mut _ as * mut libc:: socklen_t ,
1513
+ )
1514
+ } ;
1515
+ assert_eq ! ( ret, 0 ) ;
1516
+ assert_eq ! ( optval, 0 ) ;
1517
+
1518
+ // Set value.
1519
+ optval = 1 ;
1520
+ let op = io_uring:: opcode:: SetSockOpt :: new (
1521
+ io_uring:: types:: Fd ( io_uring_socket. as_raw_fd ( ) ) ,
1522
+ libc:: SOL_SOCKET as u32 ,
1523
+ libc:: SO_REUSEADDR as u32 ,
1524
+ & optval as * const _ as * const libc:: c_void ,
1525
+ std:: mem:: size_of_val ( & optval) as libc:: socklen_t ,
1526
+ )
1527
+ . build ( )
1528
+ . user_data ( 1234 ) ;
1529
+ unsafe {
1530
+ ring. submission ( ) . push ( & op. into ( ) ) . expect ( "queue is full" ) ;
1531
+ }
1532
+ ring. submit_and_wait ( 1 ) ?;
1533
+ let cqes: Vec < cqueue:: Entry > = ring. completion ( ) . map ( Into :: into) . collect ( ) ;
1534
+ assert_eq ! ( cqes. len( ) , 1 ) ;
1535
+ assert_eq ! ( cqes[ 0 ] . user_data( ) , 1234 ) ;
1536
+ assert_eq ! ( cqes[ 0 ] . result( ) , 0 ) ;
1537
+ assert_eq ! ( cqes[ 0 ] . flags( ) , 0 ) ;
1538
+
1539
+ // Check value actually set.
1540
+ optval = 0 ;
1541
+ let ret = unsafe {
1542
+ libc:: getsockopt (
1543
+ io_uring_socket. as_raw_fd ( ) ,
1544
+ libc:: SOL_SOCKET ,
1545
+ libc:: SO_REUSEADDR ,
1546
+ & mut optval as * mut _ as * mut libc:: c_void ,
1547
+ & mut optval_size as * mut _ as * mut libc:: socklen_t ,
1548
+ )
1549
+ } ;
1550
+ assert_eq ! ( ret, 0 ) ;
1551
+ assert_eq ! ( optval, 1 ) ;
1552
+ }
1553
+
1500
1554
// Close both sockets, to avoid leaking FDs.
1501
- let io_uring_socket = unsafe { Socket :: from_raw_fd ( cqes[ 0 ] . result ( ) ) } ;
1502
1555
drop ( plain_socket) ;
1503
1556
drop ( io_uring_socket) ;
1504
1557
0 commit comments