Rename lttng_ust_enum_get to lttng_ust_enum_get_from_desc
[lttng-ust.git] / liblttng-ust-comm / lttng-ust-comm.c
index ecc23821fb6fa29624dcbc25564c5011eed4aafb..679b40e6e40725a60bc166cfd2e4d2dc88f8d5d6 100644 (file)
@@ -33,6 +33,7 @@
 
 #include <lttng/ust-ctl.h>
 #include <ust-comm.h>
+#include <ust-fd.h>
 #include <helper.h>
 #include <lttng/ust-error.h>
 #include <lttng/ust-events.h>
@@ -94,8 +95,10 @@ const char *lttng_ust_strerror(int code)
  * ustcomm_connect_unix_sock
  *
  * Connect to unix socket using the path name.
+ *
+ * Caller handles FD tracker.
  */
-int ustcomm_connect_unix_sock(const char *pathname)
+int ustcomm_connect_unix_sock(const char *pathname, long timeout)
 {
        struct sockaddr_un sun;
        int fd, ret;
@@ -110,6 +113,15 @@ int ustcomm_connect_unix_sock(const char *pathname)
                ret = -errno;
                goto error;
        }
+       if (timeout >= 0) {
+               /* Give at least 10ms. */
+               if (timeout < 10)
+                       timeout = 10;
+               ret = ustcomm_setsockopt_snd_timeout(fd, timeout);
+               if (ret < 0) {
+                       WARN("Error setting connect socket send timeout");
+               }
+       }
        ret = fcntl(fd, F_SETFD, FD_CLOEXEC);
        if (ret < 0) {
                PERROR("fcntl");
@@ -248,16 +260,22 @@ int ustcomm_listen_unix_sock(int sock)
  * ustcomm_close_unix_sock
  *
  * Shutdown cleanly a unix socket.
+ *
+ * Handles fd tracker internally.
  */
 int ustcomm_close_unix_sock(int sock)
 {
        int ret;
 
+       lttng_ust_lock_fd_tracker();
        ret = close(sock);
-       if (ret < 0) {
+       if (!ret) {
+               lttng_ust_delete_fd_from_tracker(sock);
+       } else {
                PERROR("close");
                ret = -errno;
        }
+       lttng_ust_unlock_fd_tracker();
 
        return ret;
 }
@@ -580,7 +598,7 @@ ssize_t ustcomm_recv_channel_from_sessiond(int sock,
 {
        void *chan_data;
        ssize_t len, nr_fd;
-       int wakeup_fd;
+       int wakeup_fd, ret;
 
        if (var_len > LTTNG_UST_CHANNEL_DATA_MAX_LEN) {
                len = -EINVAL;
@@ -597,8 +615,10 @@ ssize_t ustcomm_recv_channel_from_sessiond(int sock,
                goto error_recv;
        }
        /* recv wakeup fd */
+       lttng_ust_lock_fd_tracker();
        nr_fd = ustcomm_recv_fds_unix_sock(sock, &wakeup_fd, 1);
        if (nr_fd <= 0) {
+               lttng_ust_unlock_fd_tracker();
                if (nr_fd < 0) {
                        len = nr_fd;
                        goto error_recv;
@@ -607,7 +627,21 @@ ssize_t ustcomm_recv_channel_from_sessiond(int sock,
                        goto error_recv;
                }
        }
-       *_wakeup_fd = wakeup_fd;
+
+       ret = lttng_ust_add_fd_to_tracker(wakeup_fd);
+       if (ret < 0) {
+               lttng_ust_unlock_fd_tracker();
+               ret = close(wakeup_fd);
+               if (ret) {
+                       PERROR("close on wakeup_fd");
+               }
+               len = -EIO;
+               goto error_recv;
+       }
+
+       *_wakeup_fd = ret;
+       lttng_ust_unlock_fd_tracker();
+
        *_chan_data = chan_data;
        return len;
 
@@ -627,8 +661,10 @@ int ustcomm_recv_stream_from_sessiond(int sock,
        int fds[2];
 
        /* recv shm fd and wakeup fd */
+       lttng_ust_lock_fd_tracker();
        len = ustcomm_recv_fds_unix_sock(sock, fds, 2);
        if (len <= 0) {
+               lttng_ust_unlock_fd_tracker();
                if (len < 0) {
                        ret = len;
                        goto error;
@@ -637,8 +673,36 @@ int ustcomm_recv_stream_from_sessiond(int sock,
                        goto error;
                }
        }
-       *shm_fd = fds[0];
-       *wakeup_fd = fds[1];
+
+       ret = lttng_ust_add_fd_to_tracker(fds[0]);
+       if (ret < 0) {
+               lttng_ust_unlock_fd_tracker();
+               ret = close(fds[0]);
+               if (ret) {
+                       PERROR("close on received shm_fd");
+               }
+               ret = -EIO;
+               goto error;
+       }
+       *shm_fd = ret;
+
+       ret = lttng_ust_add_fd_to_tracker(fds[1]);
+       if (ret < 0) {
+               lttng_ust_unlock_fd_tracker();
+               ret = close(*shm_fd);
+               if (ret) {
+                       PERROR("close on shm_fd");
+               }
+               *shm_fd = -1;
+               ret = close(fds[1]);
+               if (ret) {
+                       PERROR("close on received wakeup_fd");
+               }
+               ret = -EIO;
+               goto error;
+       }
+       *wakeup_fd = ret;
+       lttng_ust_unlock_fd_tracker();
        return 0;
 
 error:
@@ -766,7 +830,7 @@ ssize_t count_ctx_fields_recursive(size_t nr_fields,
 }
 
 static
-int serialize_string_encoding(enum ustctl_string_encodings *ue,
+int serialize_string_encoding(int32_t *ue,
                enum lttng_string_encodings le)
 {
        switch (le) {
@@ -847,8 +911,7 @@ int serialize_basic_type(struct lttng_session *session,
                if (session) {
                        const struct lttng_enum *_enum;
 
-                       _enum = lttng_ust_enum_get(session,
-                                       lbt->enumeration.desc->name);
+                       _enum = lttng_ust_enum_get_from_desc(session, lbt->enumeration.desc);
                        if (!_enum)
                                return -EINVAL;
                        ubt->enumeration.id = _enum->id;
@@ -1094,6 +1157,11 @@ int serialize_entries(struct ustctl_enum_entry **_entries,
                uentry->end.signedness = lentry->end.signedness;
                strncpy(uentry->string, lentry->string, LTTNG_UST_SYM_NAME_LEN);
                uentry->string[LTTNG_UST_SYM_NAME_LEN - 1] = '\0';
+
+               if (lentry->u.extra.options & LTTNG_ENUM_ENTRY_OPTION_IS_AUTO) {
+                       uentry->u.extra.options |=
+                               USTCTL_UST_ENUM_ENTRY_OPTION_IS_AUTO;
+               }
        }
        *_entries = entries;
        return 0;
This page took 0.024422 seconds and 4 git commands to generate.