DBG("Channel found, updating kernel streams");
ret = kernel_open_channel_stream(channel);
if (ret < 0) {
- goto end;
+ goto error;
}
/*
ret = send_kconsumerd_channel_fds(session->kernel_session->consumer_fd,
channel);
if (ret < 0) {
- goto end;
+ goto error;
}
}
- goto end;
+ goto error;
}
}
unlock_session(session);
}
+ unlock_session_list();
+ return ret;
-end:
+error:
+ unlock_session(session);
unlock_session_list();
- if (session) {
- unlock_session(session);
- }
return ret;
}
/* Thread quit pipe has been closed. Killing thread. */
if (pollfd[0].revents == POLLNVAL) {
goto error;
- } else if (pollfd[1].revents == POLLERR) {
- ERR("Register apps socket poll error");
- goto error;
}
- sock = lttcomm_accept_unix_sock(apps_sock);
- if (sock < 0) {
+ switch (pollfd[1].revents) {
+ case POLLNVAL:
+ case POLLHUP:
+ case POLLRDHUP:
+ case POLLERR:
+ ERR("Register apps socket poll error");
goto error;
- }
+ case POLLIN:
+ sock = lttcomm_accept_unix_sock(apps_sock);
+ if (sock < 0) {
+ goto error;
+ }
- /* Create UST registration command for enqueuing */
- ust_cmd = malloc(sizeof(struct ust_command));
- if (ust_cmd == NULL) {
- perror("ust command malloc");
- goto error;
- }
+ /* Create UST registration command for enqueuing */
+ ust_cmd = malloc(sizeof(struct ust_command));
+ if (ust_cmd == NULL) {
+ perror("ust command malloc");
+ goto error;
+ }
- /*
- * Using message-based transmissions to ensure we don't have to deal
- * with partially received messages.
- */
- ret = lttcomm_recv_unix_sock(sock, &ust_cmd->reg_msg,
- sizeof(struct ust_register_msg));
- if (ret < 0 || ret < sizeof(struct ust_register_msg)) {
- if (ret < 0) {
- perror("lttcomm_recv_unix_sock register apps");
- } else {
- ERR("Wrong size received on apps register");
+ /*
+ * Using message-based transmissions to ensure we don't have to deal
+ * with partially received messages.
+ */
+ ret = lttcomm_recv_unix_sock(sock, &ust_cmd->reg_msg,
+ sizeof(struct ust_register_msg));
+ if (ret < 0 || ret < sizeof(struct ust_register_msg)) {
+ if (ret < 0) {
+ perror("lttcomm_recv_unix_sock register apps");
+ } else {
+ ERR("Wrong size received on apps register");
+ }
+ free(ust_cmd);
+ close(sock);
+ continue;
}
- free(ust_cmd);
- close(sock);
- continue;
- }
- ust_cmd->sock = sock;
+ ust_cmd->sock = sock;
- DBG("UST registration received with pid:%d ppid:%d uid:%d"
- " gid:%d sock:%d name:%s (version %d.%d)",
- ust_cmd->reg_msg.pid, ust_cmd->reg_msg.ppid,
- ust_cmd->reg_msg.uid, ust_cmd->reg_msg.gid,
- ust_cmd->sock, ust_cmd->reg_msg.name,
- ust_cmd->reg_msg.major, ust_cmd->reg_msg.minor);
- /*
- * Lock free enqueue the registration request.
- * The red pill has been taken! This apps will be part of the *system*
- */
- cds_wfq_enqueue(&ust_cmd_queue.queue, &ust_cmd->node);
+ DBG("UST registration received with pid:%d ppid:%d uid:%d"
+ " gid:%d sock:%d name:%s (version %d.%d)",
+ ust_cmd->reg_msg.pid, ust_cmd->reg_msg.ppid,
+ ust_cmd->reg_msg.uid, ust_cmd->reg_msg.gid,
+ ust_cmd->sock, ust_cmd->reg_msg.name,
+ ust_cmd->reg_msg.major, ust_cmd->reg_msg.minor);
+ /*
+ * Lock free enqueue the registration request.
+ * The red pill has been taken! This apps will be part of the *system*
+ */
+ cds_wfq_enqueue(&ust_cmd_queue.queue, &ust_cmd->node);
- /*
- * Wake the registration queue futex.
- * Implicit memory barrier with the exchange in cds_wfq_enqueue.
- */
- futex_nto1_wake(&ust_cmd_queue.futex);
+ /*
+ * Wake the registration queue futex.
+ * Implicit memory barrier with the exchange in cds_wfq_enqueue.
+ */
+ futex_nto1_wake(&ust_cmd_queue.futex);
+ break;
+ }
}
error:
pollfd[1].fd = client_sock;
pollfd[1].events = POLLIN;
- /* Notify parent pid that we are ready
- * to accept command for client side.
+ /*
+ * Notify parent pid that we are ready to accept command for client side.
*/
if (opt_sig_parent) {
kill(ppid, SIGCHLD);
/* Thread quit pipe has been closed. Killing thread. */
if (pollfd[0].revents == POLLNVAL) {
goto error;
- } else if (pollfd[1].revents == POLLERR) {
- ERR("Client socket poll error");
- goto error;
}
- sock = lttcomm_accept_unix_sock(client_sock);
- if (sock < 0) {
+ switch (pollfd[1].revents) {
+ case POLLNVAL:
+ case POLLHUP:
+ case POLLERR:
+ ERR("Client socket poll error");
goto error;
- }
+ case POLLIN:
+ sock = lttcomm_accept_unix_sock(client_sock);
+ if (sock < 0) {
+ goto error;
+ }
- /* Allocate context command to process the client request */
- cmd_ctx = malloc(sizeof(struct command_ctx));
+ /* Allocate context command to process the client request */
+ cmd_ctx = malloc(sizeof(struct command_ctx));
- /* Allocate data buffer for reception */
- cmd_ctx->lsm = malloc(sizeof(struct lttcomm_session_msg));
- cmd_ctx->llm = NULL;
- cmd_ctx->session = NULL;
+ /* Allocate data buffer for reception */
+ cmd_ctx->lsm = malloc(sizeof(struct lttcomm_session_msg));
+ cmd_ctx->llm = NULL;
+ cmd_ctx->session = NULL;
- /*
- * Data is received from the lttng client. The struct
- * lttcomm_session_msg (lsm) contains the command and data request of
- * the client.
- */
- DBG("Receiving data from client ...");
- ret = lttcomm_recv_unix_sock(sock, cmd_ctx->lsm, sizeof(struct lttcomm_session_msg));
- if (ret <= 0) {
- continue;
- }
+ /*
+ * Data is received from the lttng client. The struct
+ * lttcomm_session_msg (lsm) contains the command and data request of
+ * the client.
+ */
+ DBG("Receiving data from client ...");
+ ret = lttcomm_recv_unix_sock(sock, cmd_ctx->lsm, sizeof(struct lttcomm_session_msg));
+ if (ret <= 0) {
+ continue;
+ }
- // TODO: Validate cmd_ctx including sanity check for security purpose.
+ // TODO: Validate cmd_ctx including sanity check for security purpose.
- /*
- * This function dispatch the work to the kernel or userspace tracer
- * libs and fill the lttcomm_lttng_msg data structure of all the needed
- * informations for the client. The command context struct contains
- * everything this function may needs.
- */
- ret = process_client_msg(cmd_ctx);
- if (ret < 0) {
- /* TODO: Inform client somehow of the fatal error. At this point,
- * ret < 0 means that a malloc failed (ENOMEM). */
- /* Error detected but still accept command */
- clean_command_ctx(&cmd_ctx);
- continue;
- }
+ /*
+ * This function dispatch the work to the kernel or userspace tracer
+ * libs and fill the lttcomm_lttng_msg data structure of all the needed
+ * informations for the client. The command context struct contains
+ * everything this function may needs.
+ */
+ ret = process_client_msg(cmd_ctx);
+ if (ret < 0) {
+ /* TODO: Inform client somehow of the fatal error. At this point,
+ * ret < 0 means that a malloc failed (ENOMEM). */
+ /* Error detected but still accept command */
+ clean_command_ctx(&cmd_ctx);
+ continue;
+ }
- DBG("Sending response (size: %d, retcode: %d)",
- cmd_ctx->lttng_msg_size, cmd_ctx->llm->ret_code);
- ret = send_unix_sock(sock, cmd_ctx->llm, cmd_ctx->lttng_msg_size);
- if (ret < 0) {
- ERR("Failed to send data back to client");
- }
+ DBG("Sending response (size: %d, retcode: %d)",
+ cmd_ctx->lttng_msg_size, cmd_ctx->llm->ret_code);
+ ret = send_unix_sock(sock, cmd_ctx->llm, cmd_ctx->lttng_msg_size);
+ if (ret < 0) {
+ ERR("Failed to send data back to client");
+ }
- clean_command_ctx(&cmd_ctx);
+ clean_command_ctx(&cmd_ctx);
- /* End of transmission */
- close(sock);
+ /* End of transmission */
+ close(sock);
+ break;
+ }
}
error: