diff options
| -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; } |
