diff options
Diffstat (limited to 'src/RawSocketWriter.zig')
| -rw-r--r-- | src/RawSocketWriter.zig | 38 |
1 files changed, 12 insertions, 26 deletions
diff --git a/src/RawSocketWriter.zig b/src/RawSocketWriter.zig index dfbb874..a767729 100644 --- a/src/RawSocketWriter.zig +++ b/src/RawSocketWriter.zig @@ -1,45 +1,31 @@ const std = @import("std"); const gcat = @import("gatorcat"); -const Writer = @This(); +const RawSocketWriter = @This(); +const Writer = std.Io.Writer; const assert = std.debug.assert; -interface: std.Io.Writer, +interface: Writer, socket: gcat.nic.RawSocket, -alloc: std.mem.Allocator, -fn drain(io_w: *std.Io.Writer, data: []const []const u8, splat: usize) std.Io.Writer.Error!usize { - const w: *Writer = @alignCast(@fieldParentPtr("interface", io_w)); +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(); - var res: usize = 0; - if (buffered.len > 0) { - w.socket.linkLayer().send(buffered) catch return error.WriteFailed; - _ = io_w.consumeAll(); - } - - for (data[0 .. data.len - 1]) |d| { - w.socket.linkLayer().send(d) catch return error.WriteFailed; - res += d.len; - } - - if (splat > 0 and data[data.len - 1].len > 0) { - var splatBuffer: std.ArrayList(u8) = .empty; - defer splatBuffer.deinit(w.alloc); - for (0..splat) |_| { - splatBuffer.appendSlice(w.alloc, data[data.len - 1]) catch return error.WriteFailed; - } - w.socket.linkLayer().send(splatBuffer.items) catch return error.WriteFailed; - } + w.socket.linkLayer().send(buffered) catch return error.WriteFailed; + _ = io_w.consumeAll(); return res; } -pub fn init(interface_name: [:0]const u8, buffer: []u8, alloc: std.mem.Allocator) !Writer { +pub fn init(interface_name: [:0]const u8, buffer: []u8) !RawSocketWriter { return .{ .interface = .{ .vtable = &.{ .drain = drain }, .buffer = buffer, }, .socket = try .init(interface_name), - .alloc = alloc, }; } |
