diff options
author | Robby Zambito <contact@robbyzambito.me> | 2025-04-26 11:05:31 -0400 |
---|---|---|
committer | Robby Zambito <contact@robbyzambito.me> | 2025-04-27 16:18:48 -0400 |
commit | 180babae15f26a5f4538e7b103176d26f5acc1c2 (patch) | |
tree | ed0a16cdf0bc2e1699dea57655c6c0ec5729f700 | |
parent | fe1c735026b08e6985dc267a7487cc58998cbaf5 (diff) |
Big changes to the C api implementationsc-api
Should map directly to the zig struct instead of mallocing
-rw-r--r-- | src/Client.zig | 4 | ||||
-rw-r--r-- | src/c_api.zig | 138 |
2 files changed, 63 insertions, 79 deletions
diff --git a/src/Client.zig b/src/Client.zig index 19f8360..849d627 100644 --- a/src/Client.zig +++ b/src/Client.zig @@ -76,7 +76,7 @@ pub fn sendInitialConnection(payload: []const u8, initial_port: u16, allocator: return msg; } -pub fn connect(payload: []const u8, allocator: Allocator) !?SaprusMessage { +pub fn connect(payload: []const u8, allocator: Allocator) !SaprusMessage { var initial_port: u16 = 0; if (rand) |r| { initial_port = r.intRangeAtMost(u16, 1024, 65000); @@ -109,7 +109,7 @@ pub fn connect(payload: []const u8, allocator: Allocator) !?SaprusMessage { // Complete handshake after awaiting response try broadcastSaprusMessage(msg, randomPort(), allocator); - return initial_conn_res; + return initial_conn_res.?; } const SaprusMessage = @import("message.zig").Message; diff --git a/src/c_api.zig b/src/c_api.zig index d3ad168..d6b8b8b 100644 --- a/src/c_api.zig +++ b/src/c_api.zig @@ -2,78 +2,61 @@ const c = @cImport({ @cInclude("zaprus.h"); }); -fn zigToCMessage(msg: ?*zaprus.Message) !?*c.SaprusMessage { - if (msg) |m| { - var res = c.SaprusMessage{ - .packet_type = @intFromEnum(m.*), - }; - switch (m.*) { - .relay => |r| { - res.headers.relay = .{ - .dest = r.header.dest, - }; - res.payload_len = @intCast(r.payload.len); - res.payload = (try allocator.alloc(u8, r.payload.len)).ptr; - }, - .connection => |con| { - res.headers.connection = .{ - .src_port = con.header.src_port, - .dest_port = con.header.dest_port, - .seq_num = con.header.seq_num, - .msg_id = con.header.msg_id, - ._reserved = con.header.reserved, - .options = @bitCast(con.header.options), - }; - - res.payload_len = @intCast(con.payload.len); - res.payload = (try allocator.alloc(u8, con.payload.len)).ptr; - }, - .file_transfer => return zaprus.Error.NotImplementedSaprusType, - else => return zaprus.Error.UnknownSaprusType, - } - return &res; - } else return null; +fn zigToCMessage(msg: zaprus.Message) !c.SaprusMessage { + return switch (msg) { + .relay => |r| .{ + .packet_type = @intFromEnum(msg), + .payload_len = @intCast(r.payload.len), + .headers = .{ .relay = .{ + .dest = r.header.dest, + } }, + .payload = @constCast(r.payload.ptr), + }, + .connection => |con| .{ + .packet_type = @intFromEnum(msg), + .payload_len = @intCast(con.payload.len), + .headers = .{ .connection = .{ + .src_port = con.header.src_port, + .dest_port = con.header.dest_port, + .seq_num = con.header.seq_num, + .msg_id = con.header.msg_id, + ._reserved = con.header.reserved, + .options = @bitCast(con.header.options), + } }, + .payload = @constCast(con.payload.ptr), + }, + .file_transfer => return zaprus.Error.NotImplementedSaprusType, + else => return zaprus.Error.UnknownSaprusType, + }; } -fn cToZigMessage(msg: ?*c.SaprusMessage) !?*zaprus.Message { - if (msg) |m| { - const msg_type: zaprus.PacketType = @enumFromInt(m.*.packet_type); - var res: zaprus.Message = switch (msg_type) { - .relay => .{ - .relay = .{ - .header = .{ - .dest = m.*.headers.relay.dest[0..4].*, - }, - .payload = blk: { - const p = try allocator.alloc(u8, m.payload_len); - @memcpy(p, m.payload[0..m.payload_len]); - break :blk p; - }, +fn cToZigMessage(msg: c.SaprusMessage) !zaprus.Message { + const msg_type: zaprus.PacketType = @enumFromInt(msg.packet_type); + return switch (msg_type) { + .relay => .{ + .relay = .{ + .header = .{ + .dest = msg.headers.relay.dest[0..4].*, }, + .payload = msg.payload[0..msg.payload_len], }, - .connection => .{ - .connection = .{ - .header = .{ - .src_port = m.*.headers.connection.src_port, - .dest_port = m.*.headers.connection.dest_port, - .seq_num = m.*.headers.connection.seq_num, - .msg_id = m.*.headers.connection.msg_id, - .reserved = m.*.headers.connection._reserved, - .options = @bitCast(m.*.headers.connection.options), - }, - .payload = blk: { - const p = try allocator.alloc(u8, m.payload_len); - @memcpy(p, m.payload[0..m.payload_len]); - break :blk p; - }, + }, + .connection => .{ + .connection = .{ + .header = .{ + .src_port = msg.headers.connection.src_port, + .dest_port = msg.headers.connection.dest_port, + .seq_num = msg.headers.connection.seq_num, + .msg_id = msg.headers.connection.msg_id, + .reserved = msg.headers.connection._reserved, + .options = @bitCast(msg.headers.connection.options), }, + .payload = msg.payload[0..msg.payload_len], }, - .file_transfer => return zaprus.Error.NotImplementedSaprusType, - else => return zaprus.Error.UnknownSaprusType, - }; - - return &res; - } else return null; + }, + .file_transfer => return zaprus.Error.NotImplementedSaprusType, + else => return zaprus.Error.UnknownSaprusType, + }; } // client @@ -99,7 +82,8 @@ export fn zaprus_send_initial_connection(payload: [*]const u8, len: usize, initi export fn zaprus_connect(payload: [*]const u8, len: usize) ?*c.SaprusMessage { if (SaprusClient.connect(payload[0..len], allocator)) |msg| { - return zigToCMessage(@constCast(&(msg.?))) catch null; + var m = zigToCMessage(msg) catch return null; + return &m; } else |_| { return null; } @@ -109,25 +93,25 @@ export fn zaprus_connect(payload: [*]const u8, len: usize) ?*c.SaprusMessage { /// ptr should be freed by the caller. export fn zaprus_message_to_bytes(msg: c.SaprusMessage, ptr: *[*]u8, len: *usize) c_int { - if (cToZigMessage(@constCast(&msg)) catch return 1) |m| { - const bytes = m.toBytes(allocator) catch return 1; - ptr.* = bytes.ptr; - len.* = bytes.len; - return 0; - } else return 1; + var m = cToZigMessage(msg) catch return 1; + const bytes = m.toBytes(allocator) catch return 1; + ptr.* = bytes.ptr; + len.* = bytes.len; + return 0; } /// Return value should be destroyed with zaprus_message_deinit. export fn zaprus_message_from_bytes(bytes: [*]const u8, len: usize) ?*c.SaprusMessage { if (zaprus.Message.fromBytes(bytes[0..len], allocator)) |msg| { - return zigToCMessage(@constCast(&msg)) catch null; + var m = zigToCMessage(msg) catch return null; + return &m; } else |_| return null; } export fn zaprus_message_deinit(msg: *c.SaprusMessage) void { - // noop - _ = msg; - // msg.*.deinit(allocator); + if (cToZigMessage(msg.*)) |m| { + m.deinit(allocator); + } else |_| unreachable; } const std = @import("std"); |