+ case LTTNG_CONSUMER_ADD_RELAYD_SOCKET:
+ {
+ int fd;
+ struct consumer_relayd_sock_pair *relayd;
+
+ DBG("Consumer adding relayd socket");
+
+ /* Get relayd reference if exists. */
+ relayd = consumer_find_relayd(msg.u.relayd_sock.net_index);
+ if (relayd == NULL) {
+ /* Not found. Allocate one. */
+ relayd = consumer_allocate_relayd_sock_pair(
+ msg.u.relayd_sock.net_index);
+ if (relayd == NULL) {
+ lttng_consumer_send_error(ctx, CONSUMERD_OUTFD_ERROR);
+ goto end_nosignal;
+ }
+ }
+
+ /* Poll on consumer socket. */
+ if (lttng_consumer_poll_socket(consumer_sockpoll) < 0) {
+ return -EINTR;
+ }
+
+ /* Get relayd socket from session daemon */
+ ret = lttcomm_recv_fds_unix_sock(sock, &fd, 1);
+ if (ret != sizeof(fd)) {
+ lttng_consumer_send_error(ctx, CONSUMERD_ERROR_RECV_FD);
+ goto end_nosignal;
+ }
+
+ /* Copy socket information and received FD */
+ switch (msg.u.relayd_sock.type) {
+ case LTTNG_STREAM_CONTROL:
+ /* Copy received lttcomm socket */
+ lttcomm_copy_sock(&relayd->control_sock, &msg.u.relayd_sock.sock);
+
+ ret = lttcomm_create_sock(&relayd->control_sock);
+ if (ret < 0) {
+ goto end_nosignal;
+ }
+
+ /* Close the created socket fd which is useless */
+ close(relayd->control_sock.fd);
+
+ /* Assign new file descriptor */
+ relayd->control_sock.fd = fd;
+ break;
+ case LTTNG_STREAM_DATA:
+ /* Copy received lttcomm socket */
+ lttcomm_copy_sock(&relayd->data_sock, &msg.u.relayd_sock.sock);
+ ret = lttcomm_create_sock(&relayd->data_sock);
+ if (ret < 0) {
+ goto end_nosignal;
+ }
+
+ /* Close the created socket fd which is useless */
+ close(relayd->data_sock.fd);
+
+ /* Assign new file descriptor */
+ relayd->data_sock.fd = fd;
+ break;
+ default:
+ ERR("Unknown relayd socket type");
+ goto end_nosignal;
+ }
+
+ DBG("Consumer %s socket created successfully with net idx %d (fd: %d)",
+ msg.u.relayd_sock.type == LTTNG_STREAM_CONTROL ? "control" : "data",
+ relayd->net_seq_idx, fd);
+
+ /*
+ * Add relayd socket pair to consumer data hashtable. If object already
+ * exists or on error, the function gracefully returns.
+ */
+ consumer_add_relayd(relayd);
+
+ goto end_nosignal;
+ }