summaryrefslogtreecommitdiffstats
path: root/source3/lib/unix_msg
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2014-05-05 08:45:52 +0200
committerVolker Lendecke <vl@samba.org>2014-05-08 09:10:12 +0200
commitdca572ff1ce1559a2254d9ba46d4f86d48c38c21 (patch)
treea64405496fff30d898ab000e924262b6af4275d0 /source3/lib/unix_msg
parent5601576d9d182ca1741da6db5eb7cae405333329 (diff)
downloadsamba-dca572ff1ce1559a2254d9ba46d4f86d48c38c21.tar.gz
samba-dca572ff1ce1559a2254d9ba46d4f86d48c38c21.tar.xz
samba-dca572ff1ce1559a2254d9ba46d4f86d48c38c21.zip
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 <vl@samba.org> Reviewed-by: Stefan Metzmacher <metze@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org>
Diffstat (limited to 'source3/lib/unix_msg')
-rw-r--r--source3/lib/unix_msg/test_drain.c11
-rw-r--r--source3/lib/unix_msg/test_source.c16
-rw-r--r--source3/lib/unix_msg/tests.c23
3 files changed, 38 insertions, 12 deletions
diff --git a/source3/lib/unix_msg/test_drain.c b/source3/lib/unix_msg/test_drain.c
index 6fe8c188367..c2568b6646b 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 bfafee1fd33..94984d88523 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<num_ctxs; i++) {
- ret = unix_msg_init(NULL, &funcs, 256, 1, NULL, NULL,
+ ret = unix_msg_init(NULL, funcs, 256, 1, NULL, NULL,
&ctxs[i]);
if (ret != 0) {
fprintf(stderr, "unix_msg_init failed: %s\n",
diff --git a/source3/lib/unix_msg/tests.c b/source3/lib/unix_msg/tests.c
index 2a4cf862347..29d5dcb3745 100644
--- a/source3/lib/unix_msg/tests.c
+++ b/source3/lib/unix_msg/tests.c
@@ -32,7 +32,8 @@ static void expect_messages(struct tevent_context *ev, struct cb_state *state,
int main(void)
{
- struct poll_funcs funcs;
+ struct poll_funcs *funcs;
+ void *tevent_handle;
const char *sock1 = "sock1";
const char *sock2 = "sock2";
struct unix_msg_ctx *ctx1, *ctx2;
@@ -52,9 +53,19 @@ int main(void)
perror("tevent_context_init failed");
return 1;
}
- poll_funcs_init_tevent(&funcs, ev);
- ret = unix_msg_init(sock1, &funcs, 256, 1,
+ funcs = poll_funcs_init_tevent(ev);
+ if (funcs == NULL) {
+ fprintf(stderr, "poll_funcs_init_tevent failed\n");
+ return 1;
+ }
+ tevent_handle = poll_funcs_tevent_register(ev, funcs, ev);
+ if (tevent_handle == NULL) {
+ fprintf(stderr, "poll_funcs_register_tevent failed\n");
+ return 1;
+ }
+
+ ret = unix_msg_init(sock1, funcs, 256, 1,
recv_cb, &state, &ctx1);
if (ret != 0) {
fprintf(stderr, "unix_msg_init failed: %s\n",
@@ -62,7 +73,7 @@ int main(void)
return 1;
}
- ret = unix_msg_init(sock1, &funcs, 256, 1,
+ ret = unix_msg_init(sock1, funcs, 256, 1,
recv_cb, &state, &ctx1);
if (ret == 0) {
fprintf(stderr, "unix_msg_init succeeded unexpectedly\n");
@@ -74,7 +85,7 @@ int main(void)
return 1;
}
- ret = unix_msg_init(sock2, &funcs, 256, 1,
+ ret = unix_msg_init(sock2, funcs, 256, 1,
recv_cb, &state, &ctx2);
if (ret != 0) {
fprintf(stderr, "unix_msg_init failed: %s\n",
@@ -201,6 +212,8 @@ int main(void)
unix_msg_free(ctx1);
unix_msg_free(ctx2);
+ talloc_free(tevent_handle);
+ talloc_free(funcs);
talloc_free(ev);
return 0;