iov[1].iov_len = data->length;
become_root();
- ret = unix_msg_send(ctx->dgm_ctx, dst_sock, iov, ARRAY_SIZE(iov));
+ ret = unix_msg_send(ctx->dgm_ctx, dst_sock, iov, ARRAY_SIZE(iov),
+ NULL, 0);
unbecome_root();
TALLOC_FREE(to_free);
unsigned j;
for (j=0; j<100000; j++) {
- ret = unix_msg_send(ctxs[i], argv[1], &iov, 1);
+ ret = unix_msg_send(ctxs[i], argv[1], &iov, 1, NULL, 0);
if (ret != 0) {
fprintf(stderr, "unix_msg_send failed: %s\n",
strerror(ret));
state.buf = NULL;
state.buflen = 0;
- ret = unix_msg_send(ctx1, sock2, NULL, 0);
+ ret = unix_msg_send(ctx1, sock2, NULL, 0, NULL, 0);
if (ret != 0) {
fprintf(stderr, "unix_msg_send failed: %s\n",
strerror(ret));
state.buf = &msg;
state.buflen = sizeof(msg);
- ret = unix_msg_send(ctx1, sock2, &iov, 1);
+ ret = unix_msg_send(ctx1, sock2, &iov, 1, NULL, 0);
if (ret != 0) {
fprintf(stderr, "unix_msg_send failed: %s\n",
strerror(ret));
state.buflen = sizeof(buf);
for (i=0; i<3; i++) {
- ret = unix_msg_send(ctx1, sock2, &iov, 1);
+ ret = unix_msg_send(ctx1, sock2, &iov, 1, NULL, 0);
if (ret != 0) {
fprintf(stderr, "unix_msg_send failed: %s\n",
strerror(ret));
return 1;
}
- ret = unix_msg_send(ctx2, sock2, &iov, 1);
+ ret = unix_msg_send(ctx2, sock2, &iov, 1, NULL, 0);
if (ret != 0) {
fprintf(stderr, "unix_msg_send failed: %s\n",
strerror(ret));
j++;
}
- ret = unix_msg_send(ctx1, sock1, iovs, j);
+ ret = unix_msg_send(ctx1, sock1, iovs, j, NULL, 0);
if (ret != 0) {
fprintf(stderr, "unix_msg_send failed: %s\n",
strerror(ret));
printf("Filling send queues before freeing\n");
for (i=0; i<5; i++) {
- ret = unix_msg_send(ctx1, sock2, &iov, 1);
+ ret = unix_msg_send(ctx1, sock2, &iov, 1, NULL, 0);
if (ret != 0) {
fprintf(stderr, "unix_msg_send failed: %s\n",
strerror(ret));
return 1;
}
- ret = unix_msg_send(ctx1, sock1, &iov, 1);
+ ret = unix_msg_send(ctx1, sock1, &iov, 1, NULL, 0);
if (ret != 0) {
fprintf(stderr, "unix_msg_send failed: %s\n",
strerror(ret));
unix_dgram_send_queue_free(q);
}
+#define MAX_FDS 256
+
static int unix_dgram_send(struct unix_dgram_ctx *ctx, const char *dst_sock,
- const struct iovec *iov, int iovlen)
+ const struct iovec *iov, int iovlen,
+ int *fds, size_t num_fds)
{
struct unix_dgram_send_queue *q;
struct sockaddr_un addr = { 0, };
struct msghdr msg;
+ struct cmsghdr *cmsg;
+ char buf[CMSG_SPACE(sizeof(int)*MAX_FDS)]; // TODO: talloc?
size_t dst_len;
int ret;
+ if (num_fds > MAX_FDS) {
+ return EINVAL;
+ }
+
dst_len = strlen(dst_sock);
if (dst_len >= sizeof(addr.sun_path)) {
return ENAMETOOLONG;
msg.msg_control = NULL;
msg.msg_controllen = 0;
msg.msg_flags = 0;
+ if (num_fds > 0) {
+ int *fdptr;
+ msg.msg_control = buf;
+ msg.msg_controllen = sizeof(int) * num_fds;
+ cmsg = CMSG_FIRSTHDR(&msg);
+ cmsg->cmsg_level = SOL_SOCKET;
+ cmsg->cmsg_type = SCM_RIGHTS;
+ cmsg->cmsg_len = CMSG_LEN(sizeof(int) * num_fds);
+ fdptr = (int *)CMSG_DATA(cmsg);
+ memcpy(fdptr, *fds, sizeof(int) * num_fds);
+ msg.msg_controllen = cmsg->cmsg_len;
+ }
ret = sendmsg(ctx->sock, &msg, 0);
if (ret >= 0) {
}
int unix_msg_send(struct unix_msg_ctx *ctx, const char *dst_sock,
- const struct iovec *iov, int iovlen)
+ const struct iovec *iov, int iovlen,
+ int *fds, size_t num_fds)
{
ssize_t msglen;
size_t sent;
}
return unix_dgram_send(ctx->dgram, dst_sock, tmp_iov,
- iovlen+1);
+ iovlen+1, fds, num_fds);
}
hdr.msglen = msglen;
sent += (fragment_len - sizeof(ctx->cookie) - sizeof(hdr));
ret = unix_dgram_send(ctx->dgram, dst_sock,
- iov_copy, iov_index);
+ iov_copy, iov_index,
+ fds, num_fds);
if (ret != 0) {
break;
}
*/
int unix_msg_send(struct unix_msg_ctx *ctx, const char *dst_sock,
- const struct iovec *iov, int iovlen);
+ const struct iovec *iov, int iovlen,
+ int *fds, size_t num_fds);
/**
* @brief Free a unix_msg_ctx