@@ -9423,7 +9423,7 @@ test "inet sockets" {
9423
9423
try std .testing .expectEqual (0 , rc );
9424
9424
}
9425
9425
9426
- test "unix sockets" {
9426
+ test "unix sockets sendmsg and recvmsg " {
9427
9427
// socket functions tested:
9428
9428
// - [ ] socket
9429
9429
// - [ ] bind
@@ -9451,6 +9451,7 @@ test "unix sockets" {
9451
9451
var rc = socketpair (AF .UNIX , SOCK .SEQPACKET , 0 , & socks );
9452
9452
try std .testing .expectEqual (.SUCCESS , E .init (rc ));
9453
9453
9454
+ // test sendmsg
9454
9455
const data = "foo" ;
9455
9456
const send_iov : [1 ]iovec_const = .{.{
9456
9457
.base = data ,
@@ -9468,6 +9469,7 @@ test "unix sockets" {
9468
9469
try std .testing .expectEqual (.SUCCESS , E .init (rc ));
9469
9470
try std .testing .expectEqual (data .len , rc );
9470
9471
9472
+ // test recvmsg
9471
9473
var recv_data : [data .len ]u8 = undefined ;
9472
9474
var recv_iov : [1 ]iovec = .{.{
9473
9475
.base = & recv_data ,
@@ -9496,3 +9498,131 @@ test "unix sockets" {
9496
9498
try std .testing .expectEqual (.SUCCESS , E .init (rc ));
9497
9499
try std .testing .expectEqual (0 , rc );
9498
9500
}
9501
+
9502
+ test "unix sockets sendmmsg and recvmmsg" {
9503
+ // socket functions tested:
9504
+ // - [ ] socket
9505
+ // - [ ] bind
9506
+ // - [ ] connect
9507
+ // - [ ] listen
9508
+ // - [ ] accept
9509
+ // - [ ] getsockname
9510
+ // - [ ] getpeername
9511
+ // - [x] socketpair
9512
+ // - [ ] send
9513
+ // - [ ] recv
9514
+ // - [ ] sendto
9515
+ // - [ ] recvfrom
9516
+ // - [ ] shutdown
9517
+ // - [ ] setsockopt
9518
+ // - [ ] getsockopt
9519
+ // - [ ] sendmsg
9520
+ // - [ ] recvmsg
9521
+ // - [ ] accept4
9522
+ // - [x] recvmmsg
9523
+ // - [x] sendmmsg
9524
+
9525
+ // create a socket "fd" to be the server
9526
+ var socks : [2 ]socket_t = undefined ;
9527
+ var rc = socketpair (AF .UNIX , SOCK .SEQPACKET , 0 , & socks );
9528
+ try std .testing .expectEqual (.SUCCESS , E .init (rc ));
9529
+
9530
+ // test sendmmsg
9531
+ const data : [2 ][]const u8 = .{ "foo" , "bar" };
9532
+ const send_iov : [2 ][1 ]iovec_const = .{
9533
+ .{.{
9534
+ .base = data [0 ].ptr ,
9535
+ .len = data [0 ].len ,
9536
+ }},
9537
+ .{.{
9538
+ .base = data [1 ].ptr ,
9539
+ .len = data [1 ].len ,
9540
+ }},
9541
+ };
9542
+ var send_hdr : [2 ]mmsghdr_const = .{
9543
+ .{
9544
+ .hdr = .{
9545
+ .name = null ,
9546
+ .namelen = 0 ,
9547
+ .iov = & send_iov [0 ],
9548
+ .iovlen = send_iov [0 ].len ,
9549
+ .control = null ,
9550
+ .controllen = 0 ,
9551
+ .flags = 0 ,
9552
+ },
9553
+ .len = 0 ,
9554
+ },
9555
+ .{
9556
+ .hdr = .{
9557
+ .name = null ,
9558
+ .namelen = 0 ,
9559
+ .iov = & send_iov [1 ],
9560
+ .iovlen = send_iov [1 ].len ,
9561
+ .control = null ,
9562
+ .controllen = 0 ,
9563
+ .flags = 0 ,
9564
+ },
9565
+ .len = 0 ,
9566
+ },
9567
+ };
9568
+ rc = sendmmsg (socks [0 ], & send_hdr , 2 , 0 );
9569
+ try std .testing .expectEqual (.SUCCESS , E .init (rc ));
9570
+ try std .testing .expectEqual (data .len , rc );
9571
+ for (data , send_hdr ) | data_el , hdr | {
9572
+ try std .testing .expectEqual (data_el .len , hdr .len );
9573
+ }
9574
+
9575
+ // test recvmmsg
9576
+ var recv_data : struct { [data [0 ].len ]u8 , [data [1 ].len ]u8 } = undefined ;
9577
+ var recv_iov : [2 ][1 ]iovec = .{
9578
+ .{.{
9579
+ .base = & recv_data [0 ],
9580
+ .len = recv_data [0 ].len ,
9581
+ }},
9582
+ .{.{
9583
+ .base = & recv_data [1 ],
9584
+ .len = recv_data [1 ].len ,
9585
+ }},
9586
+ };
9587
+ var recv_hdr : [2 ]mmsghdr = .{
9588
+ .{
9589
+ .hdr = .{
9590
+ .name = null ,
9591
+ .namelen = 0 ,
9592
+ .iov = & recv_iov [0 ],
9593
+ .iovlen = recv_iov [0 ].len ,
9594
+ .control = null ,
9595
+ .controllen = 0 ,
9596
+ .flags = 0 ,
9597
+ },
9598
+ .len = 0 ,
9599
+ },
9600
+ .{
9601
+ .hdr = .{
9602
+ .name = null ,
9603
+ .namelen = 0 ,
9604
+ .iov = & recv_iov [1 ],
9605
+ .iovlen = recv_iov [1 ].len ,
9606
+ .control = null ,
9607
+ .controllen = 0 ,
9608
+ .flags = 0 ,
9609
+ },
9610
+ .len = 0 ,
9611
+ },
9612
+ };
9613
+ rc = recvmmsg (socks [1 ], & recv_hdr , recv_hdr .len , 0 , null );
9614
+ try std .testing .expectEqual (.SUCCESS , E .init (rc ));
9615
+ try std .testing .expectEqual (recv_hdr .len , rc );
9616
+ inline for (data , recv_iov , & recv_data ) | data_el , iov , * recv_data_el | {
9617
+ try std .testing .expectEqual (data_el .len , iov [0 ].len );
9618
+ try std .testing .expectEqualSlices (u8 , data_el , recv_data_el );
9619
+ }
9620
+
9621
+ rc = close (socks [0 ]);
9622
+ try std .testing .expectEqual (.SUCCESS , E .init (rc ));
9623
+ try std .testing .expectEqual (0 , rc );
9624
+
9625
+ rc = close (socks [1 ]);
9626
+ try std .testing .expectEqual (.SUCCESS , E .init (rc ));
9627
+ try std .testing .expectEqual (0 , rc );
9628
+ }
0 commit comments