+ goto error;
+ }
+
+ if (opt_list_session) {
+ ret = process_opt_list_sessions();
+ if (ret < 0) {
+ goto end;
+ }
+ goto error;
+ }
+
+ if (opt_list_events) {
+ if (opt_trace_kernel) {
+ ret = process_opt_kernel_list_events();
+ if (ret < 0) {
+ goto end;
+ }
+ } else if (opt_trace_pid != 0) {
+ // TODO
+ }
+ goto error;
+ }
+
+ /* Session creation or auto session set on */
+ if (auto_session || opt_create_session) {
+ DBG("Creating a new session");
+ ret = process_opt_create_session();
+ if (ret < 0) {
+ goto end;
+ }
+ }
+
+ ret = set_session_uuid();
+ if (ret < 0) {
+ ERR("Session %s not found", opt_session_name);
+ goto error;
+ }
+
+ if (opt_destroy_session) {
+ ret = lttng_destroy_session(¤t_uuid);
+ if (ret < 0) {
+ goto end;
+ }
+ MSG("Session %s destroyed.", opt_session_name);
+ }
+
+ if (opt_list_traces) {
+ ret = process_opt_list_traces();
+ if (ret < 0) {
+ goto end;
+ }
+ }
+
+ /*
+ * Action on traces (kernel or/and userspace).
+ */
+
+ if (opt_trace_kernel) {
+ if (auto_trace || opt_create_trace) {
+ DBG("Creating a kernel trace");
+ ret = process_kernel_create_trace();
+ if (ret < 0) {
+ goto end;
+ }
+ }
+
+ if (opt_event_list != NULL || opt_enable_all_event) {
+ ret = process_opt_kernel_event();
+ if (ret < 0) {
+ goto end;
+ }
+ }
+
+ if (auto_trace || opt_start_trace) {
+ DBG("Starting kernel tracing");
+ ret = process_kernel_start_trace();
+ if (ret < 0) {
+ goto end;
+ }
+ }
+
+ if (opt_stop_trace) {
+ DBG("Stopping kernel tracing");
+ ret = lttng_kernel_stop_tracing();
+ if (ret < 0) {
+ goto end;
+ }
+ }
+ }
+
+ if (opt_trace_pid != 0) {
+ if (auto_trace || opt_create_trace) {
+ DBG("Create a userspace trace for pid %d", opt_trace_pid);
+ ret = lttng_ust_create_trace(opt_trace_pid);
+ if (ret < 0) {
+ goto end;
+ }
+ MSG("Trace created successfully!");
+ }
+
+ if (auto_trace || opt_start_trace) {
+ DBG("Start trace for pid %d", opt_trace_pid);
+ ret = lttng_ust_start_trace(opt_trace_pid);
+ if (ret < 0) {
+ goto end;
+ }
+ MSG("Trace started successfully!");
+ } else if (opt_stop_trace) {
+ DBG("Stop trace for pid %d", opt_trace_pid);
+ ret = lttng_ust_stop_trace(opt_trace_pid);
+ if (ret < 0) {
+ goto end;
+ }
+ MSG("Trace stopped successfully!");
+ }
+
+ }
+
+ return 0;
+
+end:
+ ERR("%s", lttng_get_readable_code(ret));
+error: /* fall through */
+ return ret;
+}
+
+/*
+ * process_kernel_start_trace
+ *
+ * Start a kernel trace.
+ */
+static int process_kernel_start_trace(void)
+{
+ int ret;
+
+ ret = lttng_kernel_create_stream();
+ if (ret < 0) {
+ goto error;
+ }
+
+ ret = lttng_kernel_start_tracing();
+ if (ret < 0) {
+ goto error;
+ }
+
+ MSG("Kernel tracing started");
+
+ return 0;
+
+error:
+ return ret;
+}
+
+/*
+ * process_kernel_create_trace
+ *
+ * Create a kernel trace.
+ */
+static int process_kernel_create_trace(void)
+{
+ int ret;
+
+ /* Setup kernel session */
+ ret = lttng_kernel_create_session();
+ if (ret < 0) {
+ goto error;
+ }
+
+ /* Create an empty channel (with no event) */
+ ret = lttng_kernel_create_channel();
+ if (ret < 0) {
+ goto error;
+ }
+
+ /* Opening metadata for session */
+ ret = lttng_kernel_open_metadata();
+ if (ret < 0) {
+ goto error;
+ }
+
+ return 0;
+
+error:
+ return ret;
+}
+
+/*
+ * process_opt_kernel_list_events
+ *
+ * Ask for all trace events in the kernel and pretty print them.
+ */
+static int process_opt_kernel_list_events(void)
+{
+ int ret, pos, size;
+ char *event_list, *event, *ptr;
+
+ DBG("Getting all tracing events");
+
+ ret = lttng_kernel_list_events(&event_list);
+ if (ret < 0) {
+ ERR("Unable to list events.");
+ return ret;
+ }
+
+ MSG("Kernel tracepoints:\n-------------");
+
+ ptr = event_list;
+ while ((size = sscanf(ptr, "event { name = %m[^;]; };%n\n", &event, &pos)) == 1) {
+ MSG(" - %s", event);
+ /* Move pointer to the next line */
+ ptr += pos + 1;
+ free(event);
+ }
+
+ free(event_list);
+
+ return 0;
+}
+
+/*
+ * process_opt_kernel_event
+ *
+ * Enable kernel event from the command line list given.
+ */
+static int process_opt_kernel_event(void)
+{
+ int ret;
+ char *event_name;
+
+ if (opt_enable_all_event) {
+ ret = lttng_kernel_enable_event(NULL);
+ if (ret < 0) {
+ ERR("%s", lttng_get_readable_code(ret));
+ } else {
+ MSG("All kernel event enabled");
+ }
+
+ goto end;