]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
ctdbd_conn: Introduce ctdbd_messaging_send_iov()
authorVolker Lendecke <vl@samba.org>
Mon, 25 May 2015 06:50:35 +0000 (08:50 +0200)
committerVolker Lendecke <vl@samba.org>
Thu, 28 May 2015 09:13:09 +0000 (11:13 +0200)
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
source3/include/ctdbd_conn.h
source3/lib/ctdb_dummy.c
source3/lib/ctdbd_conn.c
source3/lib/messages_ctdbd.c
source3/smbd/notify_internal.c

index 6b3ebf1cd7ac5a13015a381d0ecc00ffec704c28..a404724f4e236e250904b0fc47e000fd64070eb3 100644 (file)
@@ -38,9 +38,9 @@ struct messaging_context *ctdb_conn_msg_ctx(struct ctdbd_connection *conn);
 
 int ctdbd_conn_get_fd(struct ctdbd_connection *conn);
 
-NTSTATUS ctdbd_messaging_send_blob(struct ctdbd_connection *conn,
-                                  uint32_t dst_vnn, uint64_t dst_srvid,
-                                  const uint8_t *buf, size_t buflen);
+NTSTATUS ctdbd_messaging_send_iov(struct ctdbd_connection *conn,
+                                 uint32_t dst_vnn, uint64_t dst_srvid,
+                                 const struct iovec *iov, int iovlen);
 
 bool ctdbd_process_exists(struct ctdbd_connection *conn, uint32_t vnn,
                          pid_t pid);
index a3af03089dbb38a4d6464265fd95b034a7fe3bbe..bea707dee3747c7c546290e5673e625044741f68 100644 (file)
@@ -30,9 +30,9 @@ NTSTATUS ctdbd_probe(void)
        return NT_STATUS_NOT_IMPLEMENTED;
 }
 
-NTSTATUS ctdbd_messaging_send_blob(struct ctdbd_connection *conn,
-                                  uint32_t dst_vnn, uint64_t dst_srvid,
-                                  const uint8_t *buf, size_t buflen)
+NTSTATUS ctdbd_messaging_send_iov(struct ctdbd_connection *conn,
+                                 uint32_t dst_vnn, uint64_t dst_srvid,
+                                 const struct iovec *iov, int iovlen)
 {
        return NT_STATUS_NOT_IMPLEMENTED;
 }
index d18aad86100b2bf1108dabd6ec0f20b3c1e26338..66c87c55c56bbb5fe3cd66f2f3addc32635fa80a 100644 (file)
@@ -24,6 +24,7 @@
 #include "ctdbd_conn.h"
 #include "system/select.h"
 #include "lib/sys_rw_data.h"
+#include "lib/util/iov_buf.h"
 
 #include "messages.h"
 
@@ -605,12 +606,13 @@ NTSTATUS ctdbd_register_msg_ctx(struct ctdbd_connection *conn,
        return NT_STATUS_OK;
 }
 
-NTSTATUS ctdbd_messaging_send_blob(struct ctdbd_connection *conn,
-                                  uint32_t dst_vnn, uint64_t dst_srvid,
-                                  const uint8_t *buf, size_t buflen)
+NTSTATUS ctdbd_messaging_send_iov(struct ctdbd_connection *conn,
+                                 uint32_t dst_vnn, uint64_t dst_srvid,
+                                 const struct iovec *iov, int iovlen)
 {
        struct ctdb_req_message r;
-       struct iovec iov[2];
+       struct iovec iov2[iovlen+1];
+       size_t buflen = iov_buflen(iov, iovlen);
        ssize_t nwritten;
 
        r.hdr.length = offsetof(struct ctdb_req_message, data) + buflen;
@@ -627,12 +629,11 @@ NTSTATUS ctdbd_messaging_send_blob(struct ctdbd_connection *conn,
        DEBUG(10, ("ctdbd_messaging_send: Sending ctdb packet\n"));
        ctdb_packet_dump(&r.hdr);
 
-       iov[0].iov_base = &r;
-       iov[0].iov_len = offsetof(struct ctdb_req_message, data);
-       iov[1].iov_base = discard_const_p(uint8_t, buf);
-       iov[1].iov_len = buflen;
+       iov2[0].iov_base = &r;
+       iov2[0].iov_len = offsetof(struct ctdb_req_message, data);
+       memcpy(&iov2[1], iov, iovlen * sizeof(struct iovec));
 
-       nwritten = write_data_iov(conn->fd, iov, ARRAY_SIZE(iov));
+       nwritten = write_data_iov(conn->fd, iov2, iovlen+1);
        if (nwritten == -1) {
                DEBUG(3, ("write_data_iov failed: %s\n", strerror(errno)));
                cluster_fatal("cluster dispatch daemon msg write error\n");
index 840b1ea93b0456586af2e51c5956066f0c04c910..bf9c89fa701c5c41d43842f4cdb675f75bd3e272 100644 (file)
@@ -84,6 +84,7 @@ static int messaging_ctdb_send(struct server_id src,
        uint8_t *buf;
        ssize_t buflen;
        DATA_BLOB blob;
+       struct iovec iov2;
        NTSTATUS status;
        enum ndr_err_code ndr_err;
 
@@ -121,8 +122,11 @@ static int messaging_ctdb_send(struct server_id src,
                return ndr_map_error2errno(ndr_err);
        }
 
-       status = ctdbd_messaging_send_blob(ctx->conn, pid.vnn, pid.pid,
-                                          blob.data, blob.length);
+       iov2 = (struct iovec) { .iov_base = blob.data,
+                               .iov_len = blob.length };
+
+       status = ctdbd_messaging_send_iov(ctx->conn, pid.vnn, pid.pid,
+                                         &iov2, 1);
        TALLOC_FREE(buf);
 
        if (NT_STATUS_IS_OK(status)) {
index 845a7cc8f7f69c835887272fb9571a6302589dda..dc50d4f2b2543550ad0eab003d0016c013128038 100644 (file)
@@ -627,6 +627,7 @@ void notify_trigger(struct notify_context *notify,
        uint32_t last_vnn;
        uint8_t *remote_blob = NULL;
        size_t remote_blob_len = 0;
+       struct iovec iov;
        char *path, *to_free;
        char tmpbuf[PATH_MAX];
        ssize_t len;
@@ -698,6 +699,9 @@ void notify_trigger(struct notify_context *notify,
                goto done;
        }
 
+       iov = (struct iovec) { .iov_base = remote_blob,
+                              .iov_len = remote_blob_len };
+
        for (i=0; i<num_vnns; i++) {
                uint32_t vnn = idx_state.vnns[i];
                NTSTATUS status;
@@ -706,11 +710,11 @@ void notify_trigger(struct notify_context *notify,
                        continue;
                }
 
-               status = ctdbd_messaging_send_blob(
+               status = ctdbd_messaging_send_iov(
                        ctdbd_conn, vnn, CTDB_SRVID_SAMBA_NOTIFY_PROXY,
-                       remote_blob, remote_blob_len);
+                       &iov, 1);
                if (!NT_STATUS_IS_OK(status)) {
-                       DEBUG(10, ("ctdbd_messaging_send_blob to vnn %d "
+                       DEBUG(10, ("ctdbd_messaging_send_iov to vnn %d "
                                   "returned %s, ignoring\n", (int)vnn,
                                   nt_errstr(status)));
                }