- goto end;
- }
- cmsg = CMSG_FIRSTHDR(&msg);
- if (!cmsg) {
- fprintf(stderr, "Error: Invalid control message header\n");
- ret = -1;
- goto end;
- }
- if (cmsg->cmsg_level != SOL_SOCKET || cmsg->cmsg_type != SCM_RIGHTS) {
- fprintf(stderr, "Didn't received any fd\n");
- ret = -1;
- goto end;
- }
- if (cmsg->cmsg_len != CMSG_LEN(sizeof_fds)) {
- fprintf(stderr, "Error: Received %zu bytes of ancillary data, expected %zu\n",
- cmsg->cmsg_len, CMSG_LEN(sizeof_fds));
- ret = -1;
- goto end;
- }
- memcpy(fds, CMSG_DATA(cmsg), sizeof_fds);
- ret = sizeof_fds;
-end:
- return ret;
-}
-
-/*
- * Send a message with credentials over a unix socket.
- *
- * Returns the size of data sent, or negative error value.
- */
-ssize_t lttcomm_send_creds_unix_sock(int sock, void *buf, size_t len)
-{
- struct msghdr msg = { 0 };
- struct cmsghdr *cmptr;
- struct iovec iov[1];
- ssize_t ret = -1;
- struct ucred *creds;
- size_t sizeof_cred = sizeof(struct ucred);
- char anc_buf[CMSG_SPACE(sizeof_cred)];
-
- iov[0].iov_base = buf;
- iov[0].iov_len = len;
- msg.msg_iov = iov;
- msg.msg_iovlen = 1;
-
- msg.msg_control = (caddr_t) anc_buf;
- msg.msg_controllen = CMSG_LEN(sizeof_cred);
-
- cmptr = CMSG_FIRSTHDR(&msg);
- cmptr->cmsg_level = SOL_SOCKET;
- cmptr->cmsg_type = SCM_CREDENTIALS;
- cmptr->cmsg_len = CMSG_LEN(sizeof_cred);
-
- creds = (struct ucred *) CMSG_DATA(cmptr);
-
- creds->uid = geteuid();
- creds->gid = getegid();
- creds->pid = getpid();
-
- ret = sendmsg(sock, &msg, 0);
- if (ret < 0) {
- perror("sendmsg");