summaryrefslogtreecommitdiff
path: root/src/main.zig
diff options
context:
space:
mode:
authorRobby Zambito <contact@robbyzambito.me>2026-01-24 12:29:18 -0500
committerRobby Zambito <contact@robbyzambito.me>2026-01-24 13:11:02 -0500
commit19d4e88c331de24d13ced4d932473dfe5d44907d (patch)
tree1b3d28ba4d5c901b2f03a1254cea0f8282d1e14b /src/main.zig
parent3577d538b893f3dda771f268bf9ea7f8acac3521 (diff)
Chunk stdin
Diffstat (limited to 'src/main.zig')
-rw-r--r--src/main.zig43
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;
}