summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobby Zambito <contact@robbyzambito.me>2025-04-23 07:31:38 -0400
committerRobby Zambito <contact@robbyzambito.me>2025-04-26 09:47:07 -0400
commita1b3c07f0e59f3f56ae76fe4a43df3170ac78606 (patch)
treeca907c59a7c1ed05575b0d69b9be3ebd7186ebf6
parentb619d86665f351f143f10dfca16eeb357bb78be0 (diff)
Convert from Zig struct to C struct
-rw-r--r--include/zaprus.h2
-rw-r--r--src/c_api.zig35
2 files changed, 33 insertions, 4 deletions
diff --git a/include/zaprus.h b/include/zaprus.h
index b442753..6856a5e 100644
--- a/include/zaprus.h
+++ b/include/zaprus.h
@@ -25,6 +25,7 @@ struct SaprusMessage {
struct {
char dest[4];
};
+ size_t payload_len;
char *payload;
} relay;
struct {
@@ -36,6 +37,7 @@ struct SaprusMessage {
char _reserved;
char options;
};
+ size_t payload_len;
char *payload;
} connection;
};
diff --git a/src/c_api.zig b/src/c_api.zig
index 481dc78..a0343ae 100644
--- a/src/c_api.zig
+++ b/src/c_api.zig
@@ -4,11 +4,38 @@ const c = @cImport({
fn zigToCMessage(msg: ?*zaprus.Message) ?*c.SaprusMessage {
if (msg) |m| {
- return switch (m.*) {
- .relay => |_| @constCast(&c.SaprusMessage{}),
- .connection => |_| @constCast(&c.SaprusMessage{}),
- else => |_| null,
+ var res = c.SaprusMessage{
+ .packet_type = @intFromEnum(m.*),
};
+ switch (m.*) {
+ .relay => |r| {
+ res.unnamed_0 = .{ .relay = .{
+ .unnamed_0 = .{
+ .dest = r.header.dest,
+ },
+ .payload_len = r.payload.len,
+ .payload = (allocator.alloc(u8, r.payload.len) catch return null).ptr,
+ } };
+ },
+ .connection => |con| {
+ res.unnamed_0 = .{
+ .connection = .{
+ .unnamed_0 = .{
+ .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_len = con.payload.len,
+ .payload = (allocator.alloc(u8, con.payload.len) catch return null).ptr,
+ },
+ };
+ },
+ else => return null,
+ }
+ return &res;
} else return null;
}