Skip to content

Commit c7de633

Browse files
committed
Test sendmmsg and recvmmsg Linux syscalls
1 parent d1da67c commit c7de633

File tree

1 file changed

+131
-1
lines changed

1 file changed

+131
-1
lines changed

lib/std/os/linux.zig

+131-1
Original file line numberDiff line numberDiff line change
@@ -9423,7 +9423,7 @@ test "inet sockets" {
94239423
try std.testing.expectEqual(0, rc);
94249424
}
94259425

9426-
test "unix sockets" {
9426+
test "unix sockets sendmsg and recvmsg" {
94279427
// socket functions tested:
94289428
// - [ ] socket
94299429
// - [ ] bind
@@ -9451,6 +9451,7 @@ test "unix sockets" {
94519451
var rc = socketpair(AF.UNIX, SOCK.SEQPACKET, 0, &socks);
94529452
try std.testing.expectEqual(.SUCCESS, E.init(rc));
94539453

9454+
// test sendmsg
94549455
const data = "foo";
94559456
const send_iov: [1]iovec_const = .{.{
94569457
.base = data,
@@ -9468,6 +9469,7 @@ test "unix sockets" {
94689469
try std.testing.expectEqual(.SUCCESS, E.init(rc));
94699470
try std.testing.expectEqual(data.len, rc);
94709471

9472+
// test recvmsg
94719473
var recv_data: [data.len]u8 = undefined;
94729474
var recv_iov: [1]iovec = .{.{
94739475
.base = &recv_data,
@@ -9496,3 +9498,131 @@ test "unix sockets" {
94969498
try std.testing.expectEqual(.SUCCESS, E.init(rc));
94979499
try std.testing.expectEqual(0, rc);
94989500
}
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

Comments
 (0)