From 121d3ddce66053c8e00983d95f2689a64baf06c8 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sun, 27 Jul 2014 12:29:26 +0200 Subject: [PATCH] messaging3: Move messaging_hdr handling to messages.c. This makes messages_dgm a simple byte-transport across processes that knows almost nothing about server_id etc. Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- source3/lib/messages.c | 49 +++++++++++++++++++++++++++++-------- source3/lib/messages_dgm.c | 60 +++++++--------------------------------------- source3/lib/messages_dgm.h | 10 +++----- 3 files changed, 51 insertions(+), 68 deletions(-) diff --git a/source3/lib/messages.c b/source3/lib/messages.c index 12419f89e21..7aa660aa36a 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -77,6 +77,12 @@ struct messaging_context { struct messaging_backend *remote; }; +struct messaging_hdr { + int msg_type; + struct server_id dst; + struct server_id src; +}; + /**************************************************************************** A useful function for testing the message system. ****************************************************************************/ @@ -198,22 +204,36 @@ 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, +static void messaging_recv_cb(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); + const struct messaging_hdr *hdr; + struct server_id_buf idbuf; struct messaging_rec rec; + if (msg_len < sizeof(*hdr)) { + DEBUG(1, ("message too short: %u\n", (unsigned)msg_len)); + return; + } + + /* + * messages_dgm guarantees alignment, so we can cast here + */ + hdr = (const struct messaging_hdr *)msg; + + DEBUG(10, ("%s: Received message 0x%x len %u from %s\n", __func__, + (unsigned)hdr->msg_type, (unsigned)(msg_len - sizeof(*hdr)), + server_id_str_buf(hdr->src, &idbuf))); + 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 + .msg_type = hdr->msg_type, + .src = hdr->src, + .dest = hdr->dst, + .buf.data = discard_const_p(uint8, msg) + sizeof(*hdr), + .buf.length = msg_len - sizeof(*hdr) }; messaging_dispatch_rec(msg_ctx, &rec); @@ -417,6 +437,8 @@ NTSTATUS messaging_send_iov(struct messaging_context *msg_ctx, const struct iovec *iov, int iovlen) { int ret; + struct messaging_hdr hdr; + struct iovec iov2[iovlen+1]; if (server_id_is_disconnected(&server)) { return NT_STATUS_INVALID_PARAMETER_MIX; @@ -451,9 +473,16 @@ NTSTATUS messaging_send_iov(struct messaging_context *msg_ctx, return NT_STATUS_OK; } + hdr = (struct messaging_hdr) { + .msg_type = msg_type, + .dst = server, + .src = msg_ctx->id + }; + iov2[0] = (struct iovec){ .iov_base = &hdr, .iov_len = sizeof(hdr) }; + memcpy(&iov2[1], iov, iovlen * sizeof(*iov)); + become_root(); - ret = messaging_dgm_send(msg_ctx->local, msg_ctx->id, server, msg_type, - iov, iovlen); + ret = messaging_dgm_send(msg_ctx->local, server.pid, iov2, iovlen+1); unbecome_root(); if (ret != 0) { diff --git a/source3/lib/messages_dgm.c b/source3/lib/messages_dgm.c index 49073fbc035..2c43ec3d8a3 100644 --- a/source3/lib/messages_dgm.c +++ b/source3/lib/messages_dgm.c @@ -35,21 +35,14 @@ struct messaging_dgm_context { 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 (*recv_cb)(const uint8_t *msg, + size_t msg_len, void *private_data); void *recv_cb_private_data; bool *have_dgm_context; }; -struct messaging_dgm_hdr { - int msg_type; - struct server_id dst; - struct server_id src; -}; - static void messaging_dgm_recv(struct unix_msg_ctx *ctx, uint8_t *msg, size_t msg_len, void *private_data); @@ -173,10 +166,7 @@ int messaging_dgm_init(TALLOC_CTX *mem_ctx, struct server_id pid, const char *cache_dir, uid_t dir_owner, - void (*recv_cb)(int msg_type, - struct server_id src, - struct server_id dst, - const uint8_t *msg, + void (*recv_cb)(const uint8_t *msg, size_t msg_len, void *private_data), void *recv_cb_private_data, @@ -292,13 +282,9 @@ static int messaging_dgm_context_destructor(struct messaging_dgm_context *c) return 0; } -int messaging_dgm_send(struct messaging_dgm_context *ctx, - struct server_id src, struct server_id pid, - int msg_type, const struct iovec *iov, int iovlen) +int messaging_dgm_send(struct messaging_dgm_context *ctx, pid_t pid, + const struct iovec *iov, int iovlen) { - struct messaging_dgm_hdr hdr; - struct iovec iov2[iovlen + 1]; - struct server_id_buf idbuf; struct sockaddr_un dst; ssize_t dst_pathlen; int ret; @@ -306,24 +292,14 @@ int messaging_dgm_send(struct messaging_dgm_context *ctx, dst = (struct sockaddr_un) { .sun_family = AF_UNIX }; dst_pathlen = snprintf(dst.sun_path, sizeof(dst.sun_path), - "%s/msg/%u", ctx->cache_dir, (unsigned)pid.pid); + "%s/msg/%u", ctx->cache_dir, (unsigned)pid); if (dst_pathlen >= sizeof(dst.sun_path)) { return ENAMETOOLONG; } - hdr.msg_type = msg_type; - hdr.dst = pid; - hdr.src = src; - - DEBUG(10, ("%s: Sending message 0x%x to %s\n", __func__, - (unsigned)hdr.msg_type, - server_id_str_buf(pid, &idbuf))); + DEBUG(10, ("%s: Sending message to %u\n", __func__, (unsigned)pid)); - iov2[0].iov_base = &hdr; - iov2[0].iov_len = sizeof(hdr); - memcpy(iov2+1, iov, iovlen*sizeof(struct iovec)); - - ret = unix_msg_send(ctx->dgm_ctx, &dst, iov2, iovlen + 1); + ret = unix_msg_send(ctx->dgm_ctx, &dst, iov, iovlen); return ret; } @@ -334,26 +310,8 @@ 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 server_id_buf idbuf; - - if (msg_len < sizeof(*hdr)) { - DEBUG(1, ("message too short: %u\n", (unsigned)msg_len)); - return; - } - - /* - * unix_msg guarantees alignment, so we can cast here - */ - hdr = (struct messaging_dgm_hdr *)msg; - - DEBUG(10, ("%s: Received message 0x%x len %u from %s\n", __func__, - (unsigned)hdr->msg_type, (unsigned)(msg_len - sizeof(*hdr)), - server_id_str_buf(hdr->src, &idbuf))); - dgm_ctx->recv_cb(hdr->msg_type, hdr->src, hdr->dst, - msg + sizeof(*hdr), msg_len - sizeof(*hdr), - dgm_ctx->recv_cb_private_data); + dgm_ctx->recv_cb(msg, msg_len, dgm_ctx->recv_cb_private_data); } int messaging_dgm_cleanup(struct messaging_dgm_context *ctx, pid_t pid) diff --git a/source3/lib/messages_dgm.h b/source3/lib/messages_dgm.h index 0172d7bad61..b4031178485 100644 --- a/source3/lib/messages_dgm.h +++ b/source3/lib/messages_dgm.h @@ -26,17 +26,13 @@ int messaging_dgm_init(TALLOC_CTX *mem_ctx, struct server_id pid, const char *cache_dir, uid_t dir_owner, - void (*recv_cb)(int msg_type, - struct server_id src, - struct server_id dst, - const uint8_t *msg, + void (*recv_cb)(const uint8_t *msg, size_t msg_len, void *private_data), void *recv_cb_private_data, struct messaging_dgm_context **pctx); -int messaging_dgm_send(struct messaging_dgm_context *ctx, - struct server_id src, struct server_id pid, - int msg_type, const struct iovec *iov, int iovlen); +int messaging_dgm_send(struct messaging_dgm_context *ctx, pid_t pid, + const struct iovec *iov, int iovlen); int messaging_dgm_cleanup(struct messaging_dgm_context *ctx, pid_t pid); int messaging_dgm_wipe(struct messaging_dgm_context *ctx); void *messaging_dgm_register_tevent_context(TALLOC_CTX *mem_ctx, -- 2.11.4.GIT