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.
****************************************************************************/
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);
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;
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) {
char *cache_dir;
int lockfile_fd;
- void (*recv_cb)(int msg_type,
- struct server_id src, struct server_id dst,
- const uint8_t *msg, size_t msg_len,
+ void (*recv_cb)(const uint8_t *msg,
+ size_t msg_len,
void *private_data);
void *recv_cb_private_data;
bool *have_dgm_context;
};
-struct messaging_dgm_hdr {
- int msg_type;
- struct server_id dst;
- struct server_id src;
-};
-
static void messaging_dgm_recv(struct unix_msg_ctx *ctx,
uint8_t *msg, size_t msg_len,
void *private_data);
struct server_id pid,
const char *cache_dir,
uid_t dir_owner,
- void (*recv_cb)(int msg_type,
- struct server_id src,
- struct server_id dst,
- const uint8_t *msg,
+ void (*recv_cb)(const uint8_t *msg,
size_t msg_len,
void *private_data),
void *recv_cb_private_data,
return 0;
}
-int messaging_dgm_send(struct messaging_dgm_context *ctx,
- struct server_id src, struct server_id pid,
- int msg_type, const struct iovec *iov, int iovlen)
+int messaging_dgm_send(struct messaging_dgm_context *ctx, pid_t pid,
+ const struct iovec *iov, int iovlen)
{
- struct messaging_dgm_hdr hdr;
- struct iovec iov2[iovlen + 1];
- struct server_id_buf idbuf;
struct sockaddr_un dst;
ssize_t dst_pathlen;
int ret;
dst = (struct sockaddr_un) { .sun_family = AF_UNIX };
dst_pathlen = snprintf(dst.sun_path, sizeof(dst.sun_path),
- "%s/msg/%u", ctx->cache_dir, (unsigned)pid.pid);
+ "%s/msg/%u", ctx->cache_dir, (unsigned)pid);
if (dst_pathlen >= sizeof(dst.sun_path)) {
return ENAMETOOLONG;
}
- hdr.msg_type = msg_type;
- hdr.dst = pid;
- hdr.src = src;
-
- DEBUG(10, ("%s: Sending message 0x%x to %s\n", __func__,
- (unsigned)hdr.msg_type,
- server_id_str_buf(pid, &idbuf)));
+ DEBUG(10, ("%s: Sending message to %u\n", __func__, (unsigned)pid));
- iov2[0].iov_base = &hdr;
- iov2[0].iov_len = sizeof(hdr);
- memcpy(iov2+1, iov, iovlen*sizeof(struct iovec));
-
- ret = unix_msg_send(ctx->dgm_ctx, &dst, iov2, iovlen + 1);
+ ret = unix_msg_send(ctx->dgm_ctx, &dst, iov, iovlen);
return ret;
}
{
struct messaging_dgm_context *dgm_ctx = talloc_get_type_abort(
private_data, struct messaging_dgm_context);
- struct messaging_dgm_hdr *hdr;
- struct server_id_buf idbuf;
-
- if (msg_len < sizeof(*hdr)) {
- DEBUG(1, ("message too short: %u\n", (unsigned)msg_len));
- return;
- }
-
- /*
- * unix_msg guarantees alignment, so we can cast here
- */
- hdr = (struct messaging_dgm_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)));
- dgm_ctx->recv_cb(hdr->msg_type, hdr->src, hdr->dst,
- msg + sizeof(*hdr), msg_len - sizeof(*hdr),
- dgm_ctx->recv_cb_private_data);
+ dgm_ctx->recv_cb(msg, msg_len, dgm_ctx->recv_cb_private_data);
}
int messaging_dgm_cleanup(struct messaging_dgm_context *ctx, pid_t pid)
struct server_id pid,
const char *cache_dir,
uid_t dir_owner,
- void (*recv_cb)(int msg_type,
- struct server_id src,
- struct server_id dst,
- const uint8_t *msg,
+ void (*recv_cb)(const uint8_t *msg,
size_t msg_len,
void *private_data),
void *recv_cb_private_data,
struct messaging_dgm_context **pctx);
-int messaging_dgm_send(struct messaging_dgm_context *ctx,
- struct server_id src, struct server_id pid,
- int msg_type, const struct iovec *iov, int iovlen);
+int messaging_dgm_send(struct messaging_dgm_context *ctx, pid_t pid,
+ const struct iovec *iov, int iovlen);
int messaging_dgm_cleanup(struct messaging_dgm_context *ctx, pid_t pid);
int messaging_dgm_wipe(struct messaging_dgm_context *ctx);
void *messaging_dgm_register_tevent_context(TALLOC_CTX *mem_ctx,