diff options
author | Volker Lendecke <vl@samba.org> | 2014-07-27 12:29:26 +0200 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2014-08-11 23:57:13 +0200 |
commit | 121d3ddce66053c8e00983d95f2689a64baf06c8 (patch) | |
tree | 99f61e3624bfb68a4bbd9dc7f140e26e7ef5f8c4 /source3/lib/messages.c | |
parent | bff27ee7837861d8c3fd8fef7ed7411944be575b (diff) | |
download | samba-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.c | 49 |
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) { |