journalz/src/cmsghdr.zig
2024-01-13 22:02:57 -06:00

48 lines
1.2 KiB
Zig

const std = @import("std");
// "Borrowed" from https://github.com/tupleapp/tuple-launch/blob/master/cmsghdr.zig
pub fn cmsghdr(comptime T: type) type {
const Header = extern struct {
len: usize,
level: c_int,
type: c_int,
};
const data_align = @sizeOf(usize);
const data_offset = std.mem.alignForward(usize, @sizeOf(Header), data_align);
return extern struct {
const Self = @This();
bytes: [data_offset + @sizeOf(T)]u8 align(@alignOf(Header)),
pub fn init(args: struct {
level: c_int,
type: c_int,
data: T,
}) Self {
var self: Self = undefined;
self.headerPtr().* = .{
.len = data_offset + @sizeOf(T),
.level = args.level,
.type = args.type,
};
self.dataPtr().* = args.data;
return self;
}
pub fn headerPtr(self: *Self) *Header {
return @as(*Header, @ptrCast(self));
}
pub fn dataPtr(self: *Self) *T {
return @as(*T, @alignCast(@ptrCast(self.bytes[data_offset..])));
}
};
}
test {
std.testing.refAllDecls(cmsghdr([3]std.os.fd_t));
}