messaging3: Move messaging_hdr handling to messages.c.
authorVolker Lendecke <vl@samba.org>
Sun, 27 Jul 2014 10:29:26 +0000 (12:29 +0200)
committerJeremy Allison <jra@samba.org>
Mon, 11 Aug 2014 21:57:13 +0000 (23:57 +0200)
This makes messages_dgm a simple byte-transport across processes that
knows almost nothing about server_id etc.

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/lib/messages.c
source3/lib/messages_dgm.c
source3/lib/messages_dgm.h

index 12419f89e21b30d88ecd1ff7ffec3050dc353285..7aa660aa36aaf24be7a3583c014f2c3d7b75bacd 100644 (file)
@@ -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) {
index 49073fbc035da47acf4b26fdb948a2bed43bb93e..2c43ec3d8a37a2fbffda61c545ecdecf064be89d 100644 (file)
@@ -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)
index 0172d7bad61c6ea2737d9caa3680132edf4dbf73..b403117848562429de8b5e6a83de9adfad2661d1 100644 (file)
@@ -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,