diff options
| author | Robby Zambito <contact@robbyzambito.me> | 2026-01-24 12:29:18 -0500 |
|---|---|---|
| committer | Robby Zambito <contact@robbyzambito.me> | 2026-01-24 13:11:02 -0500 |
| commit | 19d4e88c331de24d13ced4d932473dfe5d44907d (patch) | |
| tree | 1b3d28ba4d5c901b2f03a1254cea0f8282d1e14b | |
| parent | 3577d538b893f3dda771f268bf9ea7f8acac3521 (diff) | |
Chunk stdin
| -rw-r--r-- | src/main.zig | 43 |
1 files changed, 31 insertions, 12 deletions
diff --git a/src/main.zig b/src/main.zig index 8fa10e0..13bce57 100644 --- a/src/main.zig +++ b/src/main.zig @@ -51,8 +51,7 @@ pub fn main(init: std.process.Init) !void { if (i < args.len) { flags.relay = args[i]; } else { - std.debug.print("-r/--relay requires a string\n", .{}); - return error.InvalidArguments; + flags.relay = ""; } }, .dest => { @@ -94,16 +93,36 @@ pub fn main(init: std.process.Init) !void { defer client.deinit(); if (flags.relay != null) { - var chunk_writer: Writer = blk: { - var buf: [2048]u8 = undefined; - break :blk .fixed(&buf); - }; - var output_iter = std.mem.window(u8, flags.relay.?, SaprusClient.max_payload_len, SaprusClient.max_payload_len); - while (output_iter.next()) |chunk| { - chunk_writer.end = 0; - try chunk_writer.print("{b64}", .{chunk}); - try client.sendRelay(init.io, chunk_writer.buffered(), parseDest(flags.dest)); - try init.io.sleep(.fromMilliseconds(40), .real); + var chunk_writer_buf: [2048]u8 = undefined; + var chunk_writer: Writer = .fixed(&chunk_writer_buf); + if (flags.relay.?.len > 0) { + var output_iter = std.mem.window(u8, flags.relay.?, SaprusClient.max_payload_len, SaprusClient.max_payload_len); + while (output_iter.next()) |chunk| { + chunk_writer.end = 0; + try chunk_writer.print("{b64}", .{chunk}); + try client.sendRelay(init.io, chunk_writer.buffered(), parseDest(flags.dest)); + try init.io.sleep(.fromMilliseconds(40), .real); + } + } else { + var stdin_file: std.Io.File = .stdin(); + var stdin_file_reader = stdin_file.reader(init.io, &.{}); + var stdin_reader = &stdin_file_reader.interface; + var lim_buf: [SaprusClient.max_payload_len]u8 = undefined; + var limited = stdin_reader.limited(.limited(10 * lim_buf.len), &lim_buf); + var stdin = &limited.interface; + + while (stdin.fillMore()) { + chunk_writer.end = 0; + try chunk_writer.print("{b64}", .{stdin.buffered()}); + try client.sendRelay(init.io, chunk_writer.buffered(), parseDest(flags.dest)); + try init.io.sleep(.fromMilliseconds(40), .real); + try stdin.discardAll(stdin.end); + } else |err| switch (err) { + error.EndOfStream => { + log.debug("end of stdin", .{}); + }, + else => |e| return e, + } } return; } |
