summaryrefslogtreecommitdiffstats
path: root/source3
diff options
context:
space:
mode:
authorMichael Adam <obnox@samba.org>2014-05-13 11:55:37 +0200
committerJeremy Allison <jra@samba.org>2014-05-30 00:03:20 +0200
commite4453bdc3719c57be575101c0519debae6b0c259 (patch)
treea5386536c5480508c4ab96e999aae577065fb4c7 /source3
parent4dd382296d3e78000713ab0ac1f8e531e25857cc (diff)
downloadsamba-e4453bdc3719c57be575101c0519debae6b0c259.tar.gz
samba-e4453bdc3719c57be575101c0519debae6b0c259.tar.xz
samba-e4453bdc3719c57be575101c0519debae6b0c259.zip
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 <obnox@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org>
Diffstat (limited to 'source3')
-rw-r--r--source3/include/messages.h2
-rw-r--r--source3/lib/messages.c64
-rw-r--r--source3/lib/messages_ctdbd.c18
-rw-r--r--source3/lib/messages_dgm.c19
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);