SoW-2019-0002: Dynamic Snapshot
[deliverable/lttng-ust.git] / liblttng-ust-comm / lttng-ust-comm.c
index 543465edf2fe2e2ee703a0d62e1b4c800d5d2f0d..836bb4dc327b161f4af4cf2e4a088cecc4cb25e1 100644 (file)
@@ -439,8 +439,6 @@ ssize_t ustcomm_send_fds_unix_sock(int sock, int *fds, size_t nb_fd)
 /*
  * Recv a message accompanied by fd(s) from a unix socket.
  *
- * Returns the size of received data, or negative error value.
- *
  * Expect at most "nb_fd" file descriptors. Returns the number of fd
  * actually received in nb_fd.
  * Returns -EPIPE on orderly shutdown.
@@ -510,7 +508,7 @@ ssize_t ustcomm_recv_fds_unix_sock(int sock, int *fds, size_t nb_fd)
                goto end;
        }
        memcpy(fds, CMSG_DATA(cmsg), sizeof_fds);
-       ret = sizeof_fds;
+       ret = nb_fd;
 end:
        return ret;
 }
@@ -631,12 +629,12 @@ ssize_t ustcomm_recv_channel_from_sessiond(int sock,
 
        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;
+               lttng_ust_unlock_fd_tracker();
                goto error_recv;
        }
 
@@ -653,6 +651,46 @@ error_check:
        return len;
 }
 
+ssize_t ustcomm_recv_trigger_notif_fd_from_sessiond(int sock,
+               int *_trigger_notif_fd)
+{
+       ssize_t nr_fd;
+       int trigger_notif_fd, ret;
+
+       /* Receive trigger notification fd */
+       lttng_ust_lock_fd_tracker();
+       nr_fd = ustcomm_recv_fds_unix_sock(sock, &trigger_notif_fd, 1);
+       if (nr_fd <= 0) {
+               lttng_ust_unlock_fd_tracker();
+               if (nr_fd < 0) {
+                       ret = nr_fd;
+                       goto error;
+               } else {
+                       ret = -EIO;
+                       goto error;
+               }
+       }
+
+       ret = lttng_ust_add_fd_to_tracker(trigger_notif_fd);
+       if (ret < 0) {
+               ret = close(trigger_notif_fd);
+               if (ret) {
+                       PERROR("close on trigger notif fd");
+               }
+               ret = -EIO;
+               lttng_ust_unlock_fd_tracker();
+               goto error;
+       }
+
+       *_trigger_notif_fd = ret;
+       lttng_ust_unlock_fd_tracker();
+
+       ret = nr_fd;
+
+error:
+       return ret;
+}
+
 int ustcomm_recv_stream_from_sessiond(int sock,
                uint64_t *memory_map_size,
                int *shm_fd, int *wakeup_fd)
@@ -677,19 +715,18 @@ int ustcomm_recv_stream_from_sessiond(int sock,
 
        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;
+               lttng_ust_unlock_fd_tracker();
                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");
@@ -700,6 +737,7 @@ int ustcomm_recv_stream_from_sessiond(int sock,
                        PERROR("close on received wakeup_fd");
                }
                ret = -EIO;
+               lttng_ust_unlock_fd_tracker();
                goto error;
        }
        *wakeup_fd = ret;
This page took 0.026732 seconds and 5 git commands to generate.