From 371e99959cf8c02b3a4e7b6352ed83f1d8b9200d Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 17 Jul 2014 09:44:41 +0000 Subject: [PATCH] messaging_dgm: Receive through a cb function This avoids calling messaging_dispatch_rec directly from messaging_dgm.c Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- source3/include/messages.h | 9 ++++++++- source3/lib/messages.c | 27 +++++++++++++++++++++++++-- source3/lib/messages_dgm.c | 34 ++++++++++++++++++++++------------ 3 files changed, 55 insertions(+), 15 deletions(-) diff --git a/source3/include/messages.h b/source3/include/messages.h index b718dd77b20..32c4097a6bf 100644 --- a/source3/include/messages.h +++ b/source3/include/messages.h @@ -75,7 +75,14 @@ struct messaging_backend { int messaging_dgm_init(struct messaging_context *msg_ctx, TALLOC_CTX *mem_ctx, - struct messaging_backend **presult); + struct messaging_backend **presult, + void (*recv_cb)(int msg_type, + struct server_id src, + struct server_id dst, + const uint8_t *msg, + size_t msg_len, + void *private_data), + void *recv_cb_private_data); int messaging_dgm_cleanup(struct messaging_context *msg_ctx, pid_t pid); int messaging_dgm_wipe(struct messaging_context *msg_ctx); void *messaging_dgm_register_tevent_context(TALLOC_CTX *mem_ctx, diff --git a/source3/lib/messages.c b/source3/lib/messages.c index bbc5183343f..2e80bab4c7d 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -201,6 +201,27 @@ bool message_send_all(struct messaging_context *msg_ctx, return true; } +static void messaging_recv_cb(int msg_type, + struct server_id src, struct server_id dst, + const uint8_t *msg, size_t msg_len, + void *private_data) +{ + struct messaging_context *msg_ctx = talloc_get_type_abort( + private_data, struct messaging_context); + struct messaging_rec rec; + + rec = (struct messaging_rec) { + .msg_version = MESSAGE_VERSION, + .msg_type = msg_type, + .src = src, + .dest = dst, + .buf.data = discard_const_p(uint8, msg), + .buf.length = msg_len + }; + + messaging_dispatch_rec(msg_ctx, &rec); +} + struct messaging_context *messaging_init(TALLOC_CTX *mem_ctx, struct tevent_context *ev) { @@ -223,7 +244,8 @@ struct messaging_context *messaging_init(TALLOC_CTX *mem_ctx, ctx->event_ctx = ev; ctx->have_context = &have_context; - ret = messaging_dgm_init(ctx, ctx, &ctx->local); + ret = messaging_dgm_init(ctx, ctx, &ctx->local, + messaging_recv_cb, ctx); if (ret != 0) { DEBUG(2, ("messaging_dgm_init failed: %s\n", strerror(ret))); @@ -281,7 +303,8 @@ NTSTATUS messaging_reinit(struct messaging_context *msg_ctx) msg_ctx->id = procid_self(); - ret = messaging_dgm_init(msg_ctx, msg_ctx, &msg_ctx->local); + ret = messaging_dgm_init(msg_ctx, msg_ctx, &msg_ctx->local, + messaging_recv_cb, msg_ctx); if (ret != 0) { DEBUG(0, ("messaging_dgm_init failed: %s\n", strerror(errno))); return map_nt_error_from_unix(ret); diff --git a/source3/lib/messages_dgm.c b/source3/lib/messages_dgm.c index df34d536015..0025ad5fab2 100644 --- a/source3/lib/messages_dgm.c +++ b/source3/lib/messages_dgm.c @@ -35,6 +35,12 @@ struct messaging_dgm_context { struct unix_msg_ctx *dgm_ctx; char *cache_dir; int lockfile_fd; + + void (*recv_cb)(int msg_type, + struct server_id src, struct server_id dst, + const uint8_t *msg, size_t msg_len, + void *private_data); + void *recv_cb_private_data; }; struct messaging_dgm_hdr { @@ -167,7 +173,14 @@ static int messaging_dgm_lockfile_remove(TALLOC_CTX *tmp_ctx, int messaging_dgm_init(struct messaging_context *msg_ctx, TALLOC_CTX *mem_ctx, - struct messaging_backend **presult) + struct messaging_backend **presult, + void (*recv_cb)(int msg_type, + struct server_id src, + struct server_id dst, + const uint8_t *msg, + size_t msg_len, + void *private_data), + void *recv_cb_private_data) { struct messaging_backend *result; struct messaging_dgm_context *ctx; @@ -198,6 +211,9 @@ int messaging_dgm_init(struct messaging_context *msg_ctx, result->send_fn = messaging_dgm_send; ctx->msg_ctx = msg_ctx; + ctx->recv_cb = recv_cb; + ctx->recv_cb_private_data = recv_cb_private_data; + ctx->cache_dir = talloc_strdup(ctx, cache_dir); if (ctx->cache_dir == NULL) { goto fail_nomem; @@ -335,7 +351,6 @@ static void messaging_dgm_recv(struct unix_msg_ctx *ctx, struct messaging_dgm_context *dgm_ctx = talloc_get_type_abort( private_data, struct messaging_dgm_context); struct messaging_dgm_hdr *hdr; - struct messaging_rec rec; struct server_id_buf idbuf; if (msg_len < sizeof(*hdr)) { @@ -348,18 +363,13 @@ static void messaging_dgm_recv(struct unix_msg_ctx *ctx, */ hdr = (struct messaging_dgm_hdr *)msg; - rec.msg_version = hdr->msg_version; - rec.msg_type = hdr->msg_type; - rec.dest = hdr->dst; - rec.src = hdr->src; - rec.buf.data = msg + sizeof(*hdr); - rec.buf.length = msg_len - sizeof(*hdr); - DEBUG(10, ("%s: Received message 0x%x len %u from %s\n", __func__, - (unsigned)hdr->msg_type, (unsigned)rec.buf.length, - server_id_str_buf(rec.src, &idbuf))); + (unsigned)hdr->msg_type, (unsigned)(msg_len - sizeof(*hdr)), + server_id_str_buf(hdr->src, &idbuf))); - messaging_dispatch_rec(dgm_ctx->msg_ctx, &rec); + dgm_ctx->recv_cb(hdr->msg_type, hdr->src, hdr->dst, + msg + sizeof(*hdr), msg_len - sizeof(*hdr), + dgm_ctx->recv_cb_private_data); } int messaging_dgm_cleanup(struct messaging_context *msg_ctx, pid_t pid) -- 2.11.4.GIT