#include "ust-ctl.h"
#include "session.h"
#include "traceable-app.h"
+#include "lttng-kconsumerd.h"
/*
* TODO:
goto error;
}
+ /* Getting status code from kconsumerd */
ret = lttcomm_recv_unix_sock(sock, &code, sizeof(enum lttcomm_return_code));
if (ret <= 0) {
goto error;
if (code == KCONSUMERD_COMMAND_SOCK_READY) {
kconsumerd_cmd_sock = lttcomm_connect_unix_sock(kconsumerd_cmd_unix_sock_path);
if (kconsumerd_cmd_sock < 0) {
+ sem_post(&kconsumerd_sem);
perror("kconsumerd connect");
goto error;
}
goto error;
}
- while (1) {
- /* Wait for any kconsumerd error */
- ret = lttcomm_recv_unix_sock(sock, &code, sizeof(enum lttcomm_return_code));
- if (ret <= 0) {
- ERR("Kconsumerd closed the command socket");
- goto error;
- }
-
- ERR("Kconsumerd return code : %s", lttcomm_get_readable_code(-code));
- if (code != KCONSUMERD_POLL_HUP) {
- goto error;
- }
+ /* Wait for any kconsumerd error */
+ ret = lttcomm_recv_unix_sock(sock, &code, sizeof(enum lttcomm_return_code));
+ if (ret <= 0) {
+ ERR("Kconsumerd closed the command socket");
+ goto error;
}
+ ERR("Kconsumerd return code : %s", lttcomm_get_readable_code(-code));
+
error:
kconsumerd_pid = 0;
DBG("Kconsumerd thread dying");
/* Wait for the kconsumerd thread to be ready */
sem_wait(&kconsumerd_sem);
+ if (kconsumerd_pid == 0) {
+ ERR("Kconsumerd did not start");
+ goto error;
+ }
+
return 0;
error:
+ ret = LTTCOMM_KERN_CONSUMER_FAIL;
return ret;
}
DBG("Kconsumerd pid %d", ret);
DBG("Spawning kconsumerd thread");
-
ret = spawn_kconsumerd_thread();
if (ret < 0) {
ERR("Fatal error spawning kconsumerd thread");
- ret = LTTCOMM_FATAL;
goto error;
}
/* Setup header */
lkh.payload_size = nb_fd * sizeof(struct lttcomm_kconsumerd_msg);
- lkh.cmd_type = LTTCOMM_ADD_STREAM;
+ lkh.cmd_type = ADD_STREAM;
DBG("Sending kconsumerd header");
switch (cmd_ctx->lsm->cmd_type) {
case LTTNG_CREATE_SESSION:
case LTTNG_LIST_SESSIONS:
+ case KERNEL_LIST_EVENTS:
case UST_LIST_APPS:
break;
default:
case KERNEL_CREATE_STREAM:
case KERNEL_DISABLE_EVENT:
case KERNEL_ENABLE_EVENT:
+ case KERNEL_LIST_EVENTS:
case KERNEL_OPEN_METADATA:
case KERNEL_START_TRACE:
case KERNEL_STOP_TRACE:
ret = LTTCOMM_OK;
break;
}
+ case KERNEL_LIST_EVENTS:
+ {
+ char *event_list;
+ ssize_t size;
+
+ size = kernel_list_events(kernel_tracer_fd, &event_list);
+ if (size < 0) {
+ ret = LTTCOMM_KERN_LIST_FAIL;
+ goto error;
+ }
+
+ /*
+ * Setup lttng message with payload size set to the event list size in
+ * bytes and then copy list into the llm payload.
+ */
+ ret = setup_lttng_msg(cmd_ctx, size);
+ if (ret < 0) {
+ goto setup_error;
+ }
+
+ /* Copy event list into message payload */
+ memcpy(cmd_ctx->llm->payload, event_list, size);
+
+ free(event_list);
+
+ ret = LTTCOMM_OK;
+ break;
+ }
case KERNEL_OPEN_METADATA:
{
/* Setup lttng message with no payload */