static void messaging_dgm_recv(struct unix_msg_ctx *ctx,
uint8_t *msg, size_t msg_len,
+ int *fds, size_t num_fds,
void *private_data);
static int messaging_dgm_lockfile_name(struct sun_path_buf *buf,
static void messaging_dgm_recv(struct unix_msg_ctx *ctx,
uint8_t *msg, size_t msg_len,
+ int *fds, size_t num_fds,
void *private_data)
{
struct messaging_dgm_context *dgm_ctx = talloc_get_type_abort(
private_data, struct messaging_dgm_context);
+ size_t i;
+
+ /* for now we ignore passed file descriptors */
+ for (i = 0; i < num_fds; i++) {
+ close(fds[i]);
+ fds[i] = -1;
+ }
dgm_ctx->recv_cb(msg, msg_len, dgm_ctx->recv_cb_private_data);
}
static void recv_cb(struct unix_msg_ctx *ctx,
uint8_t *msg, size_t msg_len,
+ int *fds, size_t num_fds,
void *private_data);
int main(int argc, const char *argv[])
static void recv_cb(struct unix_msg_ctx *ctx,
uint8_t *msg, size_t msg_len,
+ int *fds, size_t num_fds,
void *private_data)
{
unsigned num;
static void recv_cb(struct unix_msg_ctx *ctx,
uint8_t *msg, size_t msg_len,
+ int *fds, size_t num_fds,
void *private_data);
static void expect_messages(struct tevent_context *ev, struct cb_state *state,
static void recv_cb(struct unix_msg_ctx *ctx,
uint8_t *msg, size_t msg_len,
+ int *fds, size_t num_fds,
void *private_data)
{
struct cb_state *state = (struct cb_state *)private_data;
void (*recv_callback)(struct unix_msg_ctx *ctx,
uint8_t *msg, size_t msg_len,
+ int *fds, size_t num_fds,
void *private_data);
void *private_data;
size_t fragment_len, uint64_t cookie,
void (*recv_callback)(struct unix_msg_ctx *ctx,
uint8_t *msg, size_t msg_len,
+ int *fds, size_t num_fds,
void *private_data),
void *private_data,
struct unix_msg_ctx **result)
size_t space;
uint64_t cookie;
- /* for now we ignore passed file descriptors */
- close_fd_array(fds, num_fds);
-
if (buflen < sizeof(cookie)) {
+ close_fd_array(fds, num_fds);
return;
}
memcpy(&cookie, buf, sizeof(cookie));
buflen -= sizeof(cookie);
if (cookie == 0) {
- ctx->recv_callback(ctx, buf, buflen, ctx->private_data);
+ ctx->recv_callback(ctx, buf, buflen, fds, num_fds, ctx->private_data);
return;
}
if (buflen < sizeof(hdr)) {
+ close_fd_array(fds, num_fds);
return;
}
memcpy(&hdr, buf, sizeof(hdr));
if (msg == NULL) {
msg = malloc(offsetof(struct unix_msg, buf) + hdr.msglen);
if (msg == NULL) {
+ close_fd_array(fds, num_fds);
return;
}
*msg = (struct unix_msg) {
space = msg->msglen - msg->received;
if (buflen > space) {
+ close_fd_array(fds, num_fds);
return;
}
msg->received += buflen;
if (msg->received < msg->msglen) {
+ close_fd_array(fds, num_fds);
return;
}
DLIST_REMOVE(ctx->msgs, msg);
- ctx->recv_callback(ctx, msg->buf, msg->msglen, ctx->private_data);
+ ctx->recv_callback(ctx, msg->buf, msg->msglen, fds, num_fds, ctx->private_data);
free(msg);
}