Bindings: read from fd.
parent
125a960816
commit
71aa496501
|
@ -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 {
|
export fn ipc_write (ctx: *Context, servicefd: i32, mcontent: [*]const u8, mlen: u32) i32 {
|
||||||
|
|
||||||
|
// TODO: better default length.
|
||||||
var buffer: [100000]u8 = undefined;
|
var buffer: [100000]u8 = undefined;
|
||||||
var fba = std.heap.FixedBufferAllocator.init(&buffer);
|
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;
|
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 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 read (ctx: *Context, index: usize) !?Message
|
||||||
//
|
//
|
||||||
// pub fn wait_event(ctx: *Context) !Event
|
// pub fn wait_event(ctx: *Context) !Event
|
||||||
|
|
|
@ -35,11 +35,18 @@ int main(void) {
|
||||||
return 1;
|
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
|
// TODO: loop over ipc_wait
|
||||||
int event_type, index, originfd = 0;
|
int event_type, index, originfd = 0;
|
||||||
unsigned int size = 0;
|
|
||||||
char message[10000];
|
|
||||||
printf ("Wait for a response.\n", ret);
|
printf ("Wait for a response.\n", ret);
|
||||||
ret = ipc_wait (&event_type, &index, &originfd, &size, message);
|
ret = ipc_wait (&event_type, &index, &originfd, &size, message);
|
||||||
|
|
||||||
|
@ -47,6 +54,7 @@ int main(void) {
|
||||||
printf ("Error while waiting for an event.\n");
|
printf ("Error while waiting for an event.\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (size == 0) {
|
if (size == 0) {
|
||||||
printf ("No message returned.\n");
|
printf ("No message returned.\n");
|
||||||
|
@ -55,7 +63,6 @@ int main(void) {
|
||||||
|
|
||||||
message[size] = '\0';
|
message[size] = '\0';
|
||||||
printf ("Response: %s.\n", message);
|
printf ("Response: %s.\n", message);
|
||||||
#endif
|
|
||||||
|
|
||||||
printf ("Deinit context\n");
|
printf ("Deinit context\n");
|
||||||
ipc_context_deinit (ctx);
|
ipc_context_deinit (ctx);
|
||||||
|
|
Reference in New Issue