const std = @import("std"); const gcat = @import("gatorcat"); const RawSocketWriter = @This(); const Writer = std.Io.Writer; const assert = std.debug.assert; interface: Writer, socket: gcat.nic.RawSocket, fn drain(io_w: *std.Io.Writer, data: []const []const u8, splat: usize) Writer.Error!usize { const w: *RawSocketWriter = @alignCast(@fieldParentPtr("interface", io_w)); const rem_buf = io_w.unusedCapacitySlice(); var rem_w = Writer.fixed(rem_buf); const res = rem_w.writeSplat(data, splat) catch rem_buf.len; io_w.advance(res); const buffered = io_w.buffered(); w.socket.linkLayer().send(buffered) catch return error.WriteFailed; _ = io_w.consumeAll(); return res; } pub fn init(interface_name: [:0]const u8, buffer: []u8) !RawSocketWriter { std.debug.assert(buffer.len > 0); return .{ .interface = .{ .vtable = &.{ .drain = drain }, .buffer = buffer, }, .socket = try .init(interface_name), }; }