#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
+#include <sys/un.h>
#include <unistd.h>
#include <errno.h>
#include <common/defaults.h>
+#include <common/error.h>
#include "sessiond-comm.h"
int lttcomm_connect_unix_sock(const char *pathname)
{
struct sockaddr_un sun;
- int fd;
- int ret;
+ int fd, ret, closeret;
fd = socket(PF_UNIX, SOCK_STREAM, 0);
if (fd < 0) {
- perror("socket");
+ PERROR("socket");
ret = fd;
goto error;
}
return fd;
error_connect:
- close(fd);
+ closeret = close(fd);
+ if (closeret) {
+ PERROR("close");
+ }
error:
return ret;
}
/* Blocking call */
new_fd = accept(sock, (struct sockaddr *) &sun, &len);
if (new_fd < 0) {
- perror("accept");
+ PERROR("accept");
}
return new_fd;
/* Create server socket */
if ((fd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
- perror("socket");
+ PERROR("socket");
goto error;
}
(void) unlink(pathname);
ret = bind(fd, (struct sockaddr *) &sun, sizeof(sun));
if (ret < 0) {
- perror("bind");
+ PERROR("bind");
goto error;
}
ret = listen(sock, LTTNG_SESSIOND_COMM_MAX_LISTEN);
if (ret < 0) {
- perror("listen");
+ PERROR("listen");
}
return ret;
ret = recvmsg(sock, &msg, MSG_WAITALL);
if (ret < 0) {
- perror("recvmsg");
+ PERROR("recvmsg");
}
return ret;
ret = sendmsg(sock, &msg, 0);
if (ret < 0) {
- perror("sendmsg");
+ PERROR("sendmsg");
}
return ret;
*/
int lttcomm_close_unix_sock(int sock)
{
- int ret;
+ int ret, closeret;
/* Shutdown receptions and transmissions */
ret = shutdown(sock, SHUT_RDWR);
if (ret < 0) {
- perror("shutdown");
+ PERROR("shutdown");
}
- close(sock);
+ closeret = close(sock);
+ if (closeret) {
+ PERROR("close");
+ }
return ret;
}
ret = sendmsg(sock, &msg, 0);
if (ret < 0) {
- perror("sendmsg");
+ PERROR("sendmsg");
}
return ret;
}
ret = recvmsg(sock, &msg, 0);
if (ret < 0) {
- perror("recvmsg fds");
+ PERROR("recvmsg fds");
goto end;
}
if (ret != 1) {
}
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));
+ cmsg->cmsg_len, CMSG_LEN(sizeof_fds));
ret = -1;
goto end;
}
struct cmsghdr *cmptr;
struct iovec iov[1];
ssize_t ret = -1;
- size_t sizeof_cred = sizeof(lttng_sock_cred);
+ struct ucred *creds;
+ size_t sizeof_cred = sizeof(struct ucred);
char anc_buf[CMSG_SPACE(sizeof_cred)];
- lttng_sock_cred *creds;
memset(&msg, 0, sizeof(msg));
cmptr = CMSG_FIRSTHDR(&msg);
cmptr->cmsg_level = SOL_SOCKET;
- cmptr->cmsg_type = LTTNG_SOCK_CREDS;
+ cmptr->cmsg_type = SCM_CREDENTIALS;
cmptr->cmsg_len = CMSG_LEN(sizeof_cred);
- creds = (lttng_sock_cred*) CMSG_DATA(cmptr);
+ creds = (struct ucred *) CMSG_DATA(cmptr);
- LTTNG_SOCK_SET_UID_CRED(creds, geteuid());
- LTTNG_SOCK_SET_GID_CRED(creds, getegid());
- LTTNG_SOCK_SET_PID_CRED(creds, getpid());
+ creds->uid = geteuid();
+ creds->gid = getegid();
+ creds->pid = getpid();
ret = sendmsg(sock, &msg, 0);
if (ret < 0) {
- perror("sendmsg");
+ PERROR("sendmsg");
}
return ret;
* Returns the size of received data, or negative error value.
*/
ssize_t lttcomm_recv_creds_unix_sock(int sock, void *buf, size_t len,
- lttng_sock_cred *creds)
+ struct ucred *creds)
{
struct msghdr msg;
struct cmsghdr *cmptr;
struct iovec iov[1];
ssize_t ret;
- size_t sizeof_cred = sizeof(lttng_sock_cred);
+ size_t sizeof_cred = sizeof(struct ucred);
char anc_buf[CMSG_SPACE(sizeof_cred)];
memset(&msg, 0, sizeof(msg));
ret = recvmsg(sock, &msg, 0);
if (ret < 0) {
- perror("recvmsg fds");
+ PERROR("recvmsg fds");
goto end;
}
}
if (cmptr->cmsg_level != SOL_SOCKET ||
- cmptr->cmsg_type != LTTNG_SOCK_CREDS) {
+ cmptr->cmsg_type != SCM_CREDENTIALS) {
fprintf(stderr, "Didn't received any credentials\n");
ret = -1;
goto end;
if (cmptr->cmsg_len != CMSG_LEN(sizeof_cred)) {
fprintf(stderr, "Error: Received %zu bytes of ancillary data, expected %zu\n",
- (size_t) cmptr->cmsg_len, (size_t) CMSG_LEN(sizeof_cred));
+ cmptr->cmsg_len, CMSG_LEN(sizeof_cred));
ret = -1;
goto end;
}
/* Set socket for credentials retrieval */
ret = setsockopt(sock, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on));
if (ret < 0) {
- perror("setsockopt creds unix sock");
+ PERROR("setsockopt creds unix sock");
}
return ret;