From 71aa496501542b9a5b3e902ccc00e2d95c2b79d5 Mon Sep 17 00:00:00 2001 From: Philippe Pittoli Date: Tue, 17 Jan 2023 00:16:58 +0100 Subject: [PATCH] Bindings: read from fd. --- zig-impl/src/bindings.zig | 14 +++++++++++++- zig-impl/test-bindings/pong.c | 15 +++++++++++---- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/zig-impl/src/bindings.zig b/zig-impl/src/bindings.zig index d677140..730223d 100644 --- a/zig-impl/src/bindings.zig +++ b/zig-impl/src/bindings.zig @@ -32,6 +32,7 @@ export fn ipc_context_deinit (ctx: *Context) callconv(.C) void { export fn ipc_write (ctx: *Context, servicefd: i32, mcontent: [*]const u8, mlen: u32) i32 { + // TODO: better default length. var buffer: [100000]u8 = undefined; var fba = std.heap.FixedBufferAllocator.init(&buffer); @@ -40,8 +41,19 @@ export fn ipc_write (ctx: *Context, servicefd: i32, mcontent: [*]const u8, mlen: return 0; } +export fn ipc_read_fd (ctx: *Context, fd: i32, buffer: [*]u8, buflen: *usize) i32 { + var m = ctx.read_fd (fd) catch {return -1;} orelse return -2; + if (m.payload.len > buflen.*) return -3; + buflen.* = m.payload.len; + + var fbs = std.io.fixedBufferStream(buffer[0..buflen.*]); + var writer = fbs.writer(); + _ = writer.write(m.payload) catch return -4; + + return 0; +} + // pub fn schedule (ctx: *Context, m: Message) !void -// pub fn read_fd (ctx: *Context, fd: i32) !?Message // pub fn read (ctx: *Context, index: usize) !?Message // // pub fn wait_event(ctx: *Context) !Event diff --git a/zig-impl/test-bindings/pong.c b/zig-impl/test-bindings/pong.c index 05a2788..0cb56b6 100644 --- a/zig-impl/test-bindings/pong.c +++ b/zig-impl/test-bindings/pong.c @@ -35,11 +35,18 @@ int main(void) { return 1; } -#if 0 + char message[10000]; + unsigned int size = 10000; +#if 1 + ret = ipc_read_fd (ctx, servicefd, message, &size); + + if (ret != 0) { + printf ("Cannot read from the service fd: %d.\n", ret); + return 1; + } +#else // TODO: loop over ipc_wait int event_type, index, originfd = 0; - unsigned int size = 0; - char message[10000]; printf ("Wait for a response.\n", ret); ret = ipc_wait (&event_type, &index, &originfd, &size, message); @@ -47,6 +54,7 @@ int main(void) { printf ("Error while waiting for an event.\n"); return 1; } +#endif if (size == 0) { printf ("No message returned.\n"); @@ -55,7 +63,6 @@ int main(void) { message[size] = '\0'; printf ("Response: %s.\n", message); -#endif printf ("Deinit context\n"); ipc_context_deinit (ctx);