summaryrefslogtreecommitdiff
path: root/src/Client.zig
diff options
context:
space:
mode:
authorRobby Zambito <contact@robbyzambito.me>2025-05-11 13:52:22 -0400
committerRobby Zambito <contact@robbyzambito.me>2025-05-11 13:52:42 -0400
commit56b6b8a386642e245a3982505b11c953811017e8 (patch)
treecdc27d2b25d2912aedcf00a1d6b66a0457d12bda /src/Client.zig
parent14ed0bc3f3cdc4ac7e2ef76d9f1217c1d70a67d8 (diff)
Use Client as var type instead of singletonpush-sqrvtkyntxqt
Diffstat (limited to 'src/Client.zig')
-rw-r--r--src/Client.zig49
1 files changed, 26 insertions, 23 deletions
diff --git a/src/Client.zig b/src/Client.zig
index 2317e23..8b2f71f 100644
--- a/src/Client.zig
+++ b/src/Client.zig
@@ -1,29 +1,36 @@
const base64Enc = std.base64.Base64Encoder.init(std.base64.standard_alphabet_chars, '=');
const base64Dec = std.base64.Base64Decoder.init(std.base64.standard_alphabet_chars, '=');
-var rand: ?Random = null;
-var socket: ?gcat.nic.RawSocket = null;
+rand: Random,
+socket: gcat.nic.RawSocket,
+
+const Self = @This();
const max_message_size = 2048;
-pub fn init() !void {
+pub fn init(interface_name: [:0]const u8) !Self {
var prng = Random.DefaultPrng.init(blk: {
var seed: u64 = undefined;
try posix.getrandom(mem.asBytes(&seed));
break :blk seed;
});
- rand = prng.random();
+ const rand = prng.random();
+
+ const socket: gcat.nic.RawSocket = try .init(interface_name);
- socket = try .init("enp7s0");
+ return .{
+ .rand = rand,
+ .socket = socket,
+ };
}
-pub fn deinit() void {
- socket.?.deinit();
+pub fn deinit(self: *Self) void {
+ self.socket.deinit();
}
/// Used for relay messages and connection handshake.
/// Assumes Client .init has been called.
-fn broadcastInitialInterestMessage(msg_bytes: []align(@alignOf(SaprusMessage)) u8) !void {
+fn broadcastInitialInterestMessage(self: *Self, msg_bytes: []align(@alignOf(SaprusMessage)) u8) !void {
var packet_bytes: [max_message_size]u8 = comptime blk: {
var b: [max_message_size]u8 = @splat(0);
@@ -63,7 +70,7 @@ fn broadcastInitialInterestMessage(msg_bytes: []align(@alignOf(SaprusMessage)) u
const saprus_start_byte = 42;
@memcpy(packet_bytes[saprus_start_byte .. saprus_start_byte + msg_bytes.len], msg_bytes);
- try socket.?.linkLayer().send(packet_bytes[0 .. saprus_start_byte + msg_bytes.len]);
+ try self.socket.linkLayer().send(packet_bytes[0 .. saprus_start_byte + msg_bytes.len]);
}
// fn broadcastSaprusMessage(msg_bytes: []align(@alignOf(SaprusMessage)) u8) !void {}
@@ -100,7 +107,7 @@ fn broadcastSaprusMessage(msg_bytes: []align(@alignOf(SaprusMessage)) u8, udp_po
_ = try sock.sendTo(dest_addr, msg_bytes);
}
-pub fn sendRelay(payload: []const u8, dest: [4]u8) !void {
+pub fn sendRelay(self: *Self, payload: []const u8, dest: [4]u8) !void {
var buf: [max_message_size]u8 align(@alignOf(SaprusMessage)) = undefined;
const msg_bytes = buf[0..try SaprusMessage.calcSize(
.relay,
@@ -112,24 +119,20 @@ pub fn sendRelay(payload: []const u8, dest: [4]u8) !void {
relay.dest = dest;
_ = base64Enc.encode(relay.getPayload(), payload);
- try broadcastInitialInterestMessage(msg_bytes);
+ try self.broadcastInitialInterestMessage(msg_bytes);
}
-fn randomPort() u16 {
- var p: u16 = 0;
- if (rand) |r| {
- p = r.intRangeAtMost(u16, 1024, 65000);
- } else unreachable;
-
- return p;
+fn randomPort(self: Self) u16 {
+ return self.rand.intRangeAtMost(u16, 1024, 65000);
}
pub fn sendInitialConnection(
+ self: Self,
payload: []const u8,
output_bytes: []align(@alignOf(SaprusMessage)) u8,
initial_port: u16,
) !*SaprusMessage {
- const dest_port = randomPort();
+ const dest_port = self.randomPort();
const msg_bytes = output_bytes[0..try SaprusMessage.calcSize(
.connection,
base64Enc.calcSize(payload.len),
@@ -146,8 +149,8 @@ pub fn sendInitialConnection(
return msg;
}
-pub fn connect(payload: []const u8) !?SaprusConnection {
- const initial_port = randomPort();
+pub fn connect(self: Self, payload: []const u8) !?SaprusConnection {
+ const initial_port = self.randomPort();
var initial_conn_res: ?*SaprusMessage = null;
@@ -165,7 +168,7 @@ pub fn connect(payload: []const u8) !?SaprusConnection {
try sock.bind(bind_addr);
var sent_msg_bytes: [max_message_size]u8 align(@alignOf(SaprusMessage)) = undefined;
- const msg = try sendInitialConnection(payload, &sent_msg_bytes, initial_port);
+ const msg = try self.sendInitialConnection(payload, &sent_msg_bytes, initial_port);
var response_buf: [max_message_size]u8 align(@alignOf(SaprusMessage)) = undefined;
_ = try sock.receive(&response_buf); // Ignore message that I sent.
@@ -174,7 +177,7 @@ pub fn connect(payload: []const u8) !?SaprusConnection {
initial_conn_res = try .networkBytesAsValue(response_buf[0..len]);
// Complete handshake after awaiting response
- try broadcastSaprusMessage(msg.asBytes(), randomPort());
+ try broadcastSaprusMessage(msg.asBytes(), self.randomPort());
if (false) {
return initial_conn_res.?;