X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=liblttng-ust-comm%2Flttng-ust-comm.c;h=7e55cff556c6ced0314329401fdbe866480cf160;hb=f194f3b00d042154c35f1f9ec262e25f2cd83b8a;hp=f013c2cd7316e459ec21fd100c4d12d7ff92a025;hpb=c1ee6c90eac9cb30f2f4acd608e8eb3b20a1790e;p=lttng-ust.git diff --git a/liblttng-ust-comm/lttng-ust-comm.c b/liblttng-ust-comm/lttng-ust-comm.c index f013c2cd..7e55cff5 100644 --- a/liblttng-ust-comm/lttng-ust-comm.c +++ b/liblttng-ust-comm/lttng-ust-comm.c @@ -29,8 +29,9 @@ #include #include #include +#include -#include +#include /* * Human readable error message. @@ -119,12 +120,17 @@ int ustcomm_connect_unix_sock(const char *pathname) * libust threads require the close-on-exec flag for all * resources so it does not leak file descriptors upon exec. */ - fd = socket(PF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0); + fd = socket(PF_UNIX, SOCK_STREAM, 0); if (fd < 0) { perror("socket"); ret = fd; goto error; } + ret = fcntl(fd, F_SETFD, FD_CLOEXEC); + if (ret < 0) { + perror("fcntl"); + goto error_fcntl; + } memset(&sun, 0, sizeof(sun)); sun.sun_family = AF_UNIX; @@ -144,6 +150,7 @@ int ustcomm_connect_unix_sock(const char *pathname) return fd; error_connect: +error_fcntl: close(fd); error: return ret; @@ -237,10 +244,12 @@ int ustcomm_listen_unix_sock(int sock) */ ssize_t ustcomm_recv_unix_sock(int sock, void *buf, size_t len) { - struct msghdr msg = { 0 }; + struct msghdr msg; struct iovec iov[1]; ssize_t ret = -1; + memset(&msg, 0, sizeof(msg)); + iov[0].iov_base = buf; iov[0].iov_len = len; msg.msg_iov = iov; @@ -262,10 +271,12 @@ ssize_t ustcomm_recv_unix_sock(int sock, void *buf, size_t len) */ ssize_t ustcomm_send_unix_sock(int sock, void *buf, size_t len) { - struct msghdr msg = { 0 }; + struct msghdr msg; struct iovec iov[1]; ssize_t ret = -1; + memset(&msg, 0, sizeof(msg)); + iov[0].iov_base = buf; iov[0].iov_len = len; msg.msg_iov = iov; @@ -311,13 +322,15 @@ int ustcomm_close_unix_sock(int sock) */ ssize_t ustcomm_send_fds_unix_sock(int sock, void *buf, int *fds, size_t nb_fd, size_t len) { - struct msghdr msg = { 0 }; + struct msghdr msg; struct cmsghdr *cmptr; struct iovec iov[1]; ssize_t ret = -1; unsigned int sizeof_fds = nb_fd * sizeof(int); char tmp[CMSG_SPACE(sizeof_fds)]; + memset(&msg, 0, sizeof(msg)); + /* * Note: the consumerd receiver only supports receiving one FD per * message. @@ -390,8 +403,12 @@ int ustcomm_recv_app_reply(int sock, struct ustcomm_ust_reply *lur, return -EINVAL; } if (lur->ret_code != USTCOMM_OK) { - fprintf(stderr, "remote operation failed with code %d.\n", - lur->ret_code); + /* + * Some errors are normal.. we should put this + * in a debug level message... + * fprintf(stderr, "remote operation failed with code %d.\n", + * lur->ret_code); + */ return lur->ret_code; } return 0; @@ -435,13 +452,15 @@ int ustcomm_recv_fd(int sock) int data_fd; struct cmsghdr *cmsg; char recv_fd[CMSG_SPACE(sizeof(int))]; - struct msghdr msg = { 0 }; + struct msghdr msg; union { unsigned char vc[4]; int vi; } tmp; int i; + memset(&msg, 0, sizeof(msg)); + /* Prepare to receive the structures */ iov[0].iov_base = &data_fd; iov[0].iov_len = sizeof(data_fd); @@ -455,7 +474,7 @@ int ustcomm_recv_fd(int sock) goto end; } if (ret != sizeof(data_fd)) { - fprintf(stderr, "Received %d bytes, expected %ld", ret, sizeof(data_fd)); + fprintf(stderr, "Received %d bytes, expected %zd", ret, sizeof(data_fd)); goto end; } cmsg = CMSG_FIRSTHDR(&msg); @@ -473,7 +492,10 @@ int ustcomm_recv_fd(int sock) for (i = 0; i < sizeof(int); i++) tmp.vc[i] = CMSG_DATA(cmsg)[i]; ret = tmp.vi; - fprintf(stderr, "received fd %d\n", ret); + /* + * Useful for fd leak debug. + * fprintf(stderr, "received fd %d\n", ret); + */ end: return ret; }