summaryrefslogtreecommitdiffstats
path: root/source3/lib/messages.c
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2014-07-27 12:29:26 +0200
committerJeremy Allison <jra@samba.org>2014-08-11 23:57:13 +0200
commit121d3ddce66053c8e00983d95f2689a64baf06c8 (patch)
tree99f61e3624bfb68a4bbd9dc7f140e26e7ef5f8c4 /source3/lib/messages.c
parentbff27ee7837861d8c3fd8fef7ed7411944be575b (diff)
downloadsamba-121d3ddce66053c8e00983d95f2689a64baf06c8.tar.gz
samba-121d3ddce66053c8e00983d95f2689a64baf06c8.tar.xz
samba-121d3ddce66053c8e00983d95f2689a64baf06c8.zip
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 <vl@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org>
Diffstat (limited to 'source3/lib/messages.c')
-rw-r--r--source3/lib/messages.c49
1 files changed, 39 insertions, 10 deletions
diff --git a/source3/lib/messages.c b/source3/lib/messages.c
index 12419f89e2..7aa660aa36 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) {