/*
* 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.
goto end;
}
memcpy(fds, CMSG_DATA(cmsg), sizeof_fds);
- ret = sizeof_fds;
+ ret = nb_fd;
end:
return ret;
}
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;
}
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)
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");
PERROR("close on received wakeup_fd");
}
ret = -EIO;
+ lttng_ust_unlock_fd_tracker();
goto error;
}
*wakeup_fd = ret;