From dca572ff1ce1559a2254d9ba46d4f86d48c38c21 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 5 May 2014 08:45:52 +0200 Subject: lib: Enhance poll_funcs_tevent for multiple tevent_contexts With this patch it will be possible to use nested event contexts with messaging_filtered_read_send/recv. Before this patchset only the one and only event context a messaging_context is initialized with is able to receive datagrams from the unix domain socket. So if you want to code a synchronous RPC-like operation using a nested event context, you will not see the reply, because the nested event context does not have the required tevent_fd's. Unfortunately, this patchset has to add some advanced array voodoo. The idea is that state->watches[] contains what we hand out with watch_new, and state->contexts contains references to the tevent_contexts. For every watch we need a tevent_fd in every event context, and the routines make sure that the arrays are properly maintained. Signed-off-by: Volker Lendecke Reviewed-by: Stefan Metzmacher Reviewed-by: Jeremy Allison --- source3/lib/unix_msg/test_drain.c | 11 +++++++---- source3/lib/unix_msg/test_source.c | 16 +++++++++++++--- source3/lib/unix_msg/tests.c | 23 ++++++++++++++++++----- 3 files changed, 38 insertions(+), 12 deletions(-) (limited to 'source3/lib/unix_msg') diff --git a/source3/lib/unix_msg/test_drain.c b/source3/lib/unix_msg/test_drain.c index 6fe8c18836..c2568b6646 100644 --- a/source3/lib/unix_msg/test_drain.c +++ b/source3/lib/unix_msg/test_drain.c @@ -16,7 +16,7 @@ static void recv_cb(struct unix_msg_ctx *ctx, int main(int argc, const char *argv[]) { - struct poll_funcs funcs; + struct poll_funcs *funcs; const char *sock; struct unix_msg_ctx *ctx; struct tevent_context *ev; @@ -37,10 +37,13 @@ int main(int argc, const char *argv[]) perror("tevent_context_init failed"); return 1; } - poll_funcs_init_tevent(&funcs, ev); + funcs = poll_funcs_init_tevent(ev); + if (funcs == NULL) { + fprintf(stderr, "poll_funcs_init_tevent failed\n"); + return 1; + } - ret = unix_msg_init(sock, &funcs, 256, 1, - recv_cb, &state, &ctx); + ret = unix_msg_init(sock, funcs, 256, 1, recv_cb, &state, &ctx); if (ret != 0) { fprintf(stderr, "unix_msg_init failed: %s\n", strerror(ret)); diff --git a/source3/lib/unix_msg/test_source.c b/source3/lib/unix_msg/test_source.c index bfafee1fd3..94984d8852 100644 --- a/source3/lib/unix_msg/test_source.c +++ b/source3/lib/unix_msg/test_source.c @@ -5,7 +5,8 @@ int main(int argc, const char *argv[]) { - struct poll_funcs funcs; + struct poll_funcs *funcs; + void *tevent_handle; struct unix_msg_ctx **ctxs; struct tevent_context *ev; struct iovec iov; @@ -26,7 +27,16 @@ int main(int argc, const char *argv[]) perror("tevent_context_init failed"); return 1; } - poll_funcs_init_tevent(&funcs, ev); + funcs = poll_funcs_init_tevent(NULL); + if (funcs == NULL) { + fprintf(stderr, "poll_funcs_init_tevent failed\n"); + return 1; + } + tevent_handle = poll_funcs_tevent_register(NULL, funcs, ev); + if (tevent_handle == NULL) { + fprintf(stderr, "poll_funcs_tevent_register failed\n"); + return 1; + } ctxs = talloc_array(ev, struct unix_msg_ctx *, num_ctxs); if (ctxs == NULL) { @@ -35,7 +45,7 @@ int main(int argc, const char *argv[]) } for (i=0; i