Log path used in connection attempts
[lttng-ust.git] / src / common / ustcomm.c
index ada896f68f60ad1b0d077a4786c63b44f45c123d..47f228b1de907e7b6ac8e829e4074205fdddc086 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * SPDX-License-Identifier: LGPL-2.1-only
  *
- * Copyright (C) 2011 David Goulet <david.goulet@polymtl.ca>
+ * Copyright (C) 2011 EfficiOS Inc.
  * Copyright (C) 2011-2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
  */
 
@@ -60,9 +60,8 @@ int ustcomm_connect_unix_sock(const char *pathname, long timeout)
        /*
         * libust threads require the close-on-exec flag for all
         * resources so it does not leak file descriptors upon exec.
-        * SOCK_CLOEXEC is not used since it is linux specific.
         */
-       fd = socket(PF_UNIX, SOCK_STREAM, 0);
+       fd = socket(PF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
        if (fd < 0) {
                PERROR("socket");
                ret = -errno;
@@ -77,18 +76,13 @@ int ustcomm_connect_unix_sock(const char *pathname, long timeout)
                        WARN("Error setting connect socket send timeout");
                }
        }
-       ret = fcntl(fd, F_SETFD, FD_CLOEXEC);
-       if (ret < 0) {
-               PERROR("fcntl");
-               ret = -errno;
-               goto error_fcntl;
-       }
 
        memset(&sun, 0, sizeof(sun));
        sun.sun_family = AF_UNIX;
        strncpy(sun.sun_path, pathname, sizeof(sun.sun_path));
        sun.sun_path[sizeof(sun.sun_path) - 1] = '\0';
 
+       DBG("Connecting to '%s'", sun.sun_path);
        ret = connect(fd, (struct sockaddr *) &sun, sizeof(sun));
        if (ret < 0) {
                /*
@@ -110,7 +104,6 @@ int ustcomm_connect_unix_sock(const char *pathname, long timeout)
        return fd;
 
 error_connect:
-error_fcntl:
        {
                int closeret;
 
@@ -214,7 +207,7 @@ int ustcomm_listen_unix_sock(int sock)
 /*
  * ustcomm_close_unix_sock
  *
- * Shutdown cleanly a unix socket.
+ * Close unix socket.
  *
  * Handles fd tracker internally.
  */
@@ -235,6 +228,24 @@ int ustcomm_close_unix_sock(int sock)
        return ret;
 }
 
+/*
+ * ustcomm_shutdown_unix_sock
+ *
+ * Shutdown unix socket. Keeps the file descriptor open, but shutdown
+ * communication.
+ */
+int ustcomm_shutdown_unix_sock(int sock)
+{
+       int ret;
+
+       ret = shutdown(sock, SHUT_RDWR);
+       if (ret) {
+               PERROR("Socket shutdown error");
+               ret = -errno;
+       }
+       return ret;
+}
+
 /*
  * ustcomm_recv_unix_sock
  *
@@ -268,17 +279,13 @@ ssize_t ustcomm_recv_unix_sock(int sock, void *buf, size_t len)
        } while ((ret > 0 && ret < len_last) || (ret < 0 && errno == EINTR));
 
        if (ret < 0) {
-               int shutret;
-
                if (errno != EPIPE && errno != ECONNRESET && errno != ECONNREFUSED)
                        PERROR("recvmsg");
                ret = -errno;
                if (ret == -ECONNRESET || ret == -ECONNREFUSED)
                        ret = -EPIPE;
 
-               shutret = shutdown(sock, SHUT_RDWR);
-               if (shutret)
-                       ERR("Socket shutdown error");
+               (void) ustcomm_shutdown_unix_sock(sock);
        } else if (ret > 0) {
                ret = len;
        }
@@ -318,17 +325,13 @@ ssize_t ustcomm_send_unix_sock(int sock, const void *buf, size_t len)
        } while (ret < 0 && errno == EINTR);
 
        if (ret < 0) {
-               int shutret;
-
                if (errno != EPIPE && errno != ECONNRESET)
                        PERROR("sendmsg");
                ret = -errno;
                if (ret == -ECONNRESET)
                        ret = -EPIPE;
 
-               shutret = shutdown(sock, SHUT_RDWR);
-               if (shutret)
-                       ERR("Socket shutdown error");
+               (void) ustcomm_shutdown_unix_sock(sock);
        }
 
        return ret;
@@ -406,7 +409,6 @@ ssize_t ustcomm_recv_fds_unix_sock(int sock, int *fds, size_t nb_fd)
        char recv_fd[CMSG_SPACE(sizeof_fds)];
        struct msghdr msg;
        char dummy;
-       int i;
 
        memset(&msg, 0, sizeof(msg));
 
@@ -419,7 +421,7 @@ ssize_t ustcomm_recv_fds_unix_sock(int sock, int *fds, size_t nb_fd)
        msg.msg_controllen = sizeof(recv_fd);
 
        do {
-               ret = recvmsg(sock, &msg, 0);
+               ret = recvmsg(sock, &msg, MSG_CMSG_CLOEXEC);
        } while (ret < 0 && errno == EINTR);
        if (ret < 0) {
                if (errno != EPIPE && errno != ECONNRESET) {
@@ -465,15 +467,6 @@ ssize_t ustcomm_recv_fds_unix_sock(int sock, int *fds, size_t nb_fd)
 
        memcpy(fds, CMSG_DATA(cmsg), sizeof_fds);
 
-       /* Set FD_CLOEXEC */
-       for (i = 0; i < nb_fd; i++) {
-               ret = fcntl(fds[i], F_SETFD, FD_CLOEXEC);
-               if (ret < 0) {
-                       PERROR("fcntl failed to set FD_CLOEXEC on fd %d",
-                              fds[i]);
-               }
-       }
-
        ret = nb_fd;
 end:
        return ret;
@@ -793,7 +786,8 @@ int ustcomm_send_reg_msg(int sock,
                uint32_t uint16_t_alignment,
                uint32_t uint32_t_alignment,
                uint32_t uint64_t_alignment,
-               uint32_t long_alignment)
+               uint32_t long_alignment,
+               const char *procname)
 {
        ssize_t len;
        struct lttng_ust_ctl_reg_msg reg_msg;
@@ -812,7 +806,8 @@ int ustcomm_send_reg_msg(int sock,
        reg_msg.uint64_t_alignment = uint64_t_alignment;
        reg_msg.long_alignment = long_alignment;
        reg_msg.socket_type = type;
-       lttng_pthread_getname_np(reg_msg.name, LTTNG_UST_ABI_PROCNAME_LEN);
+       memset(reg_msg.name, 0, sizeof(reg_msg.name));
+       strncpy(reg_msg.name, procname, sizeof(reg_msg.name) - 1);
        memset(reg_msg.padding, 0, sizeof(reg_msg.padding));
 
        len = ustcomm_send_unix_sock(sock, &reg_msg, sizeof(reg_msg));
@@ -986,7 +981,7 @@ int serialize_dynamic_type(struct lttng_ust_session *session,
 
        strncpy(uf->name, field_name, LTTNG_UST_ABI_SYM_NAME_LEN);
        uf->name[LTTNG_UST_ABI_SYM_NAME_LEN - 1] = '\0';
-       uf->type.atype = lttng_ust_ctl_atype_variant;
+       uf->type.atype = lttng_ust_ctl_atype_variant_nestable;
        uf->type.u.variant_nestable.nr_choices = nr_choices;
        strncpy(uf->type.u.variant_nestable.tag_name,
                tag_field_name,
@@ -1715,7 +1710,7 @@ int ustcomm_register_channel(int sock,
 }
 
 /*
- * Set socket reciving timeout.
+ * Set socket receiving timeout.
  */
 int ustcomm_setsockopt_rcv_timeout(int sock, unsigned int msec)
 {
This page took 0.025629 seconds and 4 git commands to generate.