aboutsummaryrefslogtreecommitdiff
path: root/src/ancillary-data.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/ancillary-data.zig')
-rw-r--r--src/ancillary-data.zig38
1 files changed, 19 insertions, 19 deletions
diff --git a/src/ancillary-data.zig b/src/ancillary-data.zig
index 0754720..667ba1f 100644
--- a/src/ancillary-data.zig
+++ b/src/ancillary-data.zig
@@ -18,47 +18,47 @@ const ControlMessage = extern struct {
};
header: Header,
- payload: union {
+ payload: extern union {
fd: [255]std.posix.fd_t,
},
pub fn alignment(length: usize) usize {
- return (length + @sizeOf(usize) - 1) & ~(@sizeOf(usize) - 1);
+ return (length + @sizeOf(usize) - 1) & ~(@as(usize, @sizeOf(usize) - 1));
}
- pub fn space(self: @This()) usize {
- return self.alignment(self.length) + self.alignment(@sizeOf(Header));
+ pub fn space(length: usize) usize {
+ return alignment(length) + alignment(@sizeOf(Header));
}
pub fn from_fds(fds: []std.posix.fd_t) @This() {
- var self: @This() = .{
- };
+ var self: @This() = undefined;
- self.level = .socket;
- self.kind = .rights;
- self.length = self.alignment(@sizeOf(Header)) + (fds.len * @sizeOf(std.posix.fd_t));
+ self.header.level = .socket;
+ self.header.kind = .rights;
+ self.header.length = alignment(@sizeOf(Header)) + (fds.len * @sizeOf(std.posix.fd_t));
- @memcpy(self.payload, fds);
+ @memcpy(self.payload.fd[0..fds.len], fds);
+
+ return self;
}
};
-pub fn send_fds(socket: std.posix.socket_t, fds: []std.posix.fd_t) !void {
- var iobuf: [1]u8 = std.mem.zeroes([1]u8);
+pub fn send_fds(socket: std.posix.socket_t, fds: []std.posix.fd_t, data: []const u8) !void {
+ var cmsg: ControlMessage = .from_fds(fds);
const io = std.posix.iovec {
- .base = &iobuf,
- .len = iobuf.len,
+ .base = @constCast(@ptrCast(data)),
+ .len = data.len,
};
- var cmsg: ControlMessage = .from_fds(fds);
-
const msghdr = std.posix.msghdr_const {
.name = null,
.namelen = 0,
- .iov = &io,
- .iolen = 1,
+ .iov = @ptrCast(&io),
+ .iovlen = 1,
.control = &cmsg,
- .controllen = cmsg.control_length(),
+ .controllen = @intCast(ControlMessage.space(fds.len)),
+ .flags = 0,
};
_ = try std.posix.sendmsg(socket, &msghdr, 0);