- 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",
- (size_t) cmsg->cmsg_len, (size_t) 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;
- struct iovec iov[1];
- ssize_t ret = -1;
-#ifdef __linux__
- struct cmsghdr *cmptr;
- size_t sizeof_cred = sizeof(lttng_sock_cred);
- char anc_buf[CMSG_SPACE(sizeof_cred)];
- lttng_sock_cred *creds;
-#endif /* __linux__ */
-
- memset(&msg, 0, sizeof(msg));
-
- iov[0].iov_base = buf;
- iov[0].iov_len = len;
- msg.msg_iov = iov;
- msg.msg_iovlen = 1;
-
-#ifdef __linux__
- 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 = LTTNG_SOCK_CREDS;
- cmptr->cmsg_len = CMSG_LEN(sizeof_cred);
-
- creds = (lttng_sock_cred*) CMSG_DATA(cmptr);
-
- LTTNG_SOCK_SET_UID_CRED(creds, geteuid());
- LTTNG_SOCK_SET_GID_CRED(creds, getegid());
- LTTNG_SOCK_SET_PID_CRED(creds, getpid());
-#endif /* __linux__ */
-
- ret = sendmsg(sock, &msg, 0);
- if (ret < 0) {
- perror("sendmsg");