From e4453bdc3719c57be575101c0519debae6b0c259 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Tue, 13 May 2014 11:55:37 +0200 Subject: [PATCH] s3:messaging: change messaging_backend to use iovec instead of data blob in send_fn This also changes the layering messaging_send_iov -> messaging_send_buf -> messaging_send to messaging_send_buf -> messaging_send -> messaging_send_iov Signed-off-by: Michael Adam Reviewed-by: Jeremy Allison --- source3/include/messages.h | 2 +- source3/lib/messages.c | 64 +++++++++++++++++++++++--------------------- source3/lib/messages_ctdbd.c | 18 ++++++++++--- source3/lib/messages_dgm.c | 19 +++++++------ 4 files changed, 59 insertions(+), 44 deletions(-) diff --git a/source3/include/messages.h b/source3/include/messages.h index 852e8a10b24..18362f9d88c 100644 --- a/source3/include/messages.h +++ b/source3/include/messages.h @@ -89,7 +89,7 @@ struct messaging_context { struct messaging_backend { NTSTATUS (*send_fn)(struct messaging_context *msg_ctx, struct server_id pid, int msg_type, - const DATA_BLOB *data, + const struct iovec *iov, int iovlen, struct messaging_backend *backend); void *private_data; }; diff --git a/source3/lib/messages.c b/source3/lib/messages.c index b045639d0bf..6e2e7ca9e2c 100644 --- a/source3/lib/messages.c +++ b/source3/lib/messages.c @@ -355,29 +355,12 @@ NTSTATUS messaging_send(struct messaging_context *msg_ctx, struct server_id server, uint32_t msg_type, const DATA_BLOB *data) { - if (server_id_is_disconnected(&server)) { - return NT_STATUS_INVALID_PARAMETER_MIX; - } - - if (!procid_is_local(&server)) { - return msg_ctx->remote->send_fn(msg_ctx, server, - msg_type, data, - msg_ctx->remote); - } + struct iovec iov; - if (messaging_is_self_send(msg_ctx, &server)) { - struct messaging_rec rec; - rec.msg_version = MESSAGE_VERSION; - rec.msg_type = msg_type & MSG_TYPE_MASK; - rec.dest = server; - rec.src = msg_ctx->id; - rec.buf = *data; - messaging_dispatch_rec(msg_ctx, &rec); - return NT_STATUS_OK; - } + iov.iov_base = data->data; + iov.iov_len = data->length; - return msg_ctx->local->send_fn(msg_ctx, server, msg_type, data, - msg_ctx->local); + return messaging_send_iov(msg_ctx, server, msg_type, &iov, 1); } NTSTATUS messaging_send_buf(struct messaging_context *msg_ctx, @@ -392,19 +375,40 @@ NTSTATUS messaging_send_iov(struct messaging_context *msg_ctx, struct server_id server, uint32_t msg_type, const struct iovec *iov, int iovlen) { - uint8_t *buf; - NTSTATUS status; + if (server_id_is_disconnected(&server)) { + return NT_STATUS_INVALID_PARAMETER_MIX; + } - buf = iov_buf(talloc_tos(), iov, iovlen); - if (buf == NULL) { - return NT_STATUS_NO_MEMORY; + if (!procid_is_local(&server)) { + return msg_ctx->remote->send_fn(msg_ctx, server, + msg_type, iov, iovlen, + msg_ctx->remote); } - status = messaging_send_buf(msg_ctx, server, msg_type, - buf, talloc_get_size(buf)); + if (messaging_is_self_send(msg_ctx, &server)) { + struct messaging_rec rec; + uint8_t *buf; + DATA_BLOB data; + + buf = iov_buf(talloc_tos(), iov, iovlen); + if (buf == NULL) { + return NT_STATUS_NO_MEMORY; + } + + data = data_blob_const(buf, talloc_get_size(buf)); + + rec.msg_version = MESSAGE_VERSION; + rec.msg_type = msg_type & MSG_TYPE_MASK; + rec.dest = server; + rec.src = msg_ctx->id; + rec.buf = data; + messaging_dispatch_rec(msg_ctx, &rec); + TALLOC_FREE(buf); + return NT_STATUS_OK; + } - TALLOC_FREE(buf); - return status; + return msg_ctx->local->send_fn(msg_ctx, server, msg_type, iov, iovlen, + msg_ctx->local); } static struct messaging_rec *messaging_rec_dup(TALLOC_CTX *mem_ctx, diff --git a/source3/lib/messages_ctdbd.c b/source3/lib/messages_ctdbd.c index 230560f8cfe..34b3e2a0ff8 100644 --- a/source3/lib/messages_ctdbd.c +++ b/source3/lib/messages_ctdbd.c @@ -90,21 +90,33 @@ struct ctdbd_connection *messaging_ctdbd_connection(void) static NTSTATUS messaging_ctdb_send(struct messaging_context *msg_ctx, struct server_id pid, int msg_type, - const DATA_BLOB *data, + const struct iovec *iov, int iovlen, struct messaging_backend *backend) { struct messaging_ctdbd_context *ctx = talloc_get_type_abort( backend->private_data, struct messaging_ctdbd_context); struct messaging_rec msg; + uint8_t *buf; + NTSTATUS status; + + buf = iov_buf(talloc_tos(), iov, iovlen); + if (buf == NULL) { + return NT_STATUS_NO_MEMORY; + } + msg.msg_version = MESSAGE_VERSION; msg.msg_type = msg_type; msg.dest = pid; msg.src = msg_ctx->id; - msg.buf = *data; + msg.buf = data_blob_const(buf, talloc_get_size(buf)); + + status = ctdbd_messaging_send(ctx->conn, pid.vnn, pid.pid, &msg); + + TALLOC_FREE(buf); - return ctdbd_messaging_send(ctx->conn, pid.vnn, pid.pid, &msg); + return status; } static int messaging_ctdbd_destructor(struct messaging_ctdbd_context *ctx) diff --git a/source3/lib/messages_dgm.c b/source3/lib/messages_dgm.c index 55a6fcfac21..6912035b945 100644 --- a/source3/lib/messages_dgm.c +++ b/source3/lib/messages_dgm.c @@ -46,7 +46,7 @@ struct messaging_dgm_hdr { static NTSTATUS messaging_dgm_send(struct messaging_context *msg_ctx, struct server_id pid, int msg_type, - const DATA_BLOB *data, + const struct iovec *iov, int iovlen, struct messaging_backend *backend); static void messaging_dgm_recv(struct unix_msg_ctx *ctx, uint8_t *msg, size_t msg_len, @@ -288,7 +288,7 @@ static int messaging_dgm_context_destructor(struct messaging_dgm_context *c) static NTSTATUS messaging_dgm_send(struct messaging_context *msg_ctx, struct server_id pid, int msg_type, - const DATA_BLOB *data, + const struct iovec *iov, int iovlen, struct messaging_backend *backend) { struct messaging_dgm_context *ctx = talloc_get_type_abort( @@ -297,7 +297,7 @@ static NTSTATUS messaging_dgm_send(struct messaging_context *msg_ctx, char buf[PATH_MAX]; char *dst_sock, *to_free; struct messaging_dgm_hdr hdr; - struct iovec iov[2]; + struct iovec iov2[iovlen + 1]; ssize_t pathlen; int ret; @@ -314,17 +314,16 @@ static NTSTATUS messaging_dgm_send(struct messaging_context *msg_ctx, hdr.dst = pid; hdr.src = msg_ctx->id; - DEBUG(10, ("%s: Sending message 0x%x len %u to %s\n", __func__, - (unsigned)hdr.msg_type, (unsigned)data->length, + DEBUG(10, ("%s: Sending message 0x%x to %s\n", __func__, + (unsigned)hdr.msg_type, server_id_str(talloc_tos(), &pid))); - iov[0].iov_base = &hdr; - iov[0].iov_len = sizeof(hdr); - iov[1].iov_base = data->data; - iov[1].iov_len = data->length; + iov2[0].iov_base = &hdr; + iov2[0].iov_len = sizeof(hdr); + memcpy(iov2+1, iov, iovlen*sizeof(struct iovec)); become_root(); - ret = unix_msg_send(ctx->dgm_ctx, dst_sock, iov, ARRAY_SIZE(iov)); + ret = unix_msg_send(ctx->dgm_ctx, dst_sock, iov2, iovlen + 1); unbecome_root(); TALLOC_FREE(to_free); -- 2.11.4.GIT