summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/zaprus.h19
-rw-r--r--src/c_api.zig67
2 files changed, 54 insertions, 32 deletions
diff --git a/include/zaprus.h b/include/zaprus.h
index 51ac70c..f170c38 100644
--- a/include/zaprus.h
+++ b/include/zaprus.h
@@ -23,20 +23,15 @@ struct SaprusMessage {
uint16_t payload_len;
union {
struct {
- struct {
- char dest[4];
- };
+ char dest[4];
} relay;
struct {
- struct {
- uint16_t src_port;
- uint16_t dest_port;
- uint32_t seq_num;
- uint32_t msg_id;
- char _reserved;
- char options;
- };
-
+ uint16_t src_port;
+ uint16_t dest_port;
+ uint32_t seq_num;
+ uint32_t msg_id;
+ char _reserved;
+ char options;
} connection;
} headers;
char *payload;
diff --git a/src/c_api.zig b/src/c_api.zig
index 7be260e..d3ad168 100644
--- a/src/c_api.zig
+++ b/src/c_api.zig
@@ -10,23 +10,19 @@ fn zigToCMessage(msg: ?*zaprus.Message) !?*c.SaprusMessage {
switch (m.*) {
.relay => |r| {
res.headers.relay = .{
- .unnamed_0 = .{
- .dest = r.header.dest,
- },
+ .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 = .{
- .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),
- },
+ .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);
@@ -39,14 +35,45 @@ fn zigToCMessage(msg: ?*zaprus.Message) !?*c.SaprusMessage {
} else return null;
}
-fn cToZigMessage(msg: ?*c.SaprusMessage) ?*zaprus.Message {
- _ = msg;
- return @constCast(&zaprus.Message{
- .relay = .{
- .header = .{ .dest = @splat(0) },
- .payload = &.{0},
- },
- });
+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;
+ },
+ },
+ },
+ .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;
+ },
+ },
+ },
+ .file_transfer => return zaprus.Error.NotImplementedSaprusType,
+ else => return zaprus.Error.UnknownSaprusType,
+ };
+
+ return &res;
+ } else return null;
}
// client
@@ -82,7 +109,7 @@ 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))) |m| {
+ if (cToZigMessage(@constCast(&msg)) catch return 1) |m| {
const bytes = m.toBytes(allocator) catch return 1;
ptr.* = bytes.ptr;
len.* = bytes.len;