Use bsd-compatible fcntl for close-on-exec on socket
[lttng-ust.git] / liblttng-ust-comm / lttng-ust-comm.c
index e7d43e98dc57df9bc048caa19b972a2592d57a91..7e55cff556c6ced0314329401fdbe866480cf160 100644 (file)
@@ -29,8 +29,9 @@
 #include <unistd.h>
 #include <assert.h>
 #include <errno.h>
+#include <fcntl.h>
 
-#include <lttng/ust-comm.h>
+#include <ust-comm.h>
 
 /*
  * 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.
@@ -439,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);
@@ -459,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);
This page took 0.024412 seconds and 4 git commands to generate.