static int process_client_opt(void);
static int process_opt_list_apps(void);
static int process_opt_list_sessions(void);
+static int process_opt_list_traces(void);
static int process_opt_create_session(void);
static void sighandler(int sig);
static int set_signal_handler(void);
+static int validate_options(void);
+static char *get_cmdline_by_pid(pid_t pid);
/*
* start_client
}
}
+ if (opt_list_traces) {
+ ret = process_opt_list_traces();
+ if (ret < 0) {
+ goto end;
+ }
+ }
+
if (opt_create_session != NULL) {
ret = process_opt_create_session();
if (ret < 0) {
}
if (opt_session_uuid != NULL) {
+ DBG("Set session uuid to %s", opt_session_uuid);
lttng_set_current_session_uuid(opt_session_uuid);
}
+ if (opt_trace_kernel) {
+ ERR("Not implemented yet");
+ goto end;
+ }
+
+ if (opt_trace_pid != 0) {
+ if (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!\nUse --start to start tracing.");
+ }
+
+ if (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:
return ret;
}
+/*
+ * process_opt_list_traces
+ *
+ * Get list of all traces for a specific session uuid.
+ */
+static int process_opt_list_traces(void)
+{
+ int ret, i;
+ uuid_t uuid;
+ struct lttng_trace *traces;
+
+ uuid_parse(opt_session_uuid, uuid);
+ ret = lttng_list_traces(&uuid, &traces);
+ if (ret < 0) {
+ goto error;
+ }
+
+ MSG("Userspace traces:");
+ for (i = 0; i < ret; i++) {
+ if (traces[i].type == USERSPACE) {
+ MSG("\t%d) %s (pid: %d): %s",
+ i, traces[i].name, traces[i].pid,
+ get_cmdline_by_pid(traces[i].pid));
+ } else {
+ break;
+ }
+ }
+
+ MSG("Kernel traces:");
+ for (;i < ret; i++) {
+ if (traces[i].type == KERNEL) {
+ MSG("\t%d) %s", i, traces[i].name);
+ }
+ }
+
+ free(traces);
+
+error:
+ return ret;
+}
+
/*
* process_opt_create_session
*
{
int i, ret, count;
pid_t *pids;
- FILE *fp;
- char path[24]; /* Can't go bigger than /proc/65535/cmdline */
- char cmdline[PATH_MAX];
+ char *cmdline;
count = lttng_ust_list_apps(&pids);
if (count < 0) {
MSG("LTTng UST traceable application [name (pid)]:");
for (i=0; i < count; i++) {
- snprintf(path, sizeof(path), "/proc/%d/cmdline", pids[i]);
- fp = fopen(path, "r");
- if (fp == NULL) {
+ cmdline = get_cmdline_by_pid(pids[i]);
+ if (cmdline == NULL) {
MSG("\t(not running) (%d)", pids[i]);
continue;
}
- ret = fread(cmdline, 1, sizeof(cmdline), fp);
MSG("\t%s (%d)", cmdline, pids[i]);
- fclose(fp);
+ free(cmdline);
}
/* Allocated by lttng_ust_list_apps() */
return ret;
}
+/*
+ * get_cmdline_by_pid
+ *
+ * Get command line from /proc for a specific pid.
+ *
+ * On success, return an allocated string pointer pointing to
+ * the proc cmdline.
+ * On error, return NULL.
+ */
+static char *get_cmdline_by_pid(pid_t pid)
+{
+ int ret;
+ FILE *fp;
+ char *cmdline = NULL;
+ char path[24]; /* Can't go bigger than /proc/65535/cmdline */
+
+ snprintf(path, sizeof(path), "/proc/%d/cmdline", pid);
+ fp = fopen(path, "r");
+ if (fp == NULL) {
+ goto end;
+ }
+
+ /* Caller must free() *cmdline */
+ cmdline = malloc(PATH_MAX);
+ ret = fread(cmdline, 1, PATH_MAX, fp);
+ fclose(fp);
+
+end:
+ return cmdline;
+}
+
+/*
+ * validate_options
+ *
+ * Make sure that all options passed to the command line
+ * are compatible with each others.
+ *
+ * On error, return -1
+ * On success, return 0
+ */
+static int validate_options(void)
+{
+ /* Conflicting command */
+ if (opt_start_trace && opt_stop_trace) {
+ ERR("Can't use --start and --stop together.");
+ goto error;
+ /* Must have a session UUID for trace action. */
+ } else if ((opt_session_uuid == NULL) &&
+ (opt_create_trace || opt_start_trace || opt_stop_trace || opt_list_traces)) {
+ ERR("You need to specify a session UUID.\nPlease use --session UUID to do so.");
+ goto error;
+ /* If no PID specified and trace_kernel is off */
+ } else if ((opt_trace_pid == 0 && opt_trace_kernel == 0) &&
+ (opt_create_trace || opt_start_trace || opt_stop_trace)) {
+ ERR("Please specify a PID using -p, --pid PID.");
+ goto error;
+ }
+
+ return 0;
+
+error:
+ return -1;
+}
+
/*
* spawn_sessiond
*
*/
static void sighandler(int sig)
{
- DBG("%d received", sig);
switch (sig) {
case SIGTERM:
+ DBG("SIGTERM catched");
clean_exit(EXIT_FAILURE);
break;
case SIGCHLD:
/* Notify is done */
+ DBG("SIGCHLD catched");
break;
default:
+ DBG("Unknown signal %d catched", sig);
break;
}
clean_exit(EXIT_FAILURE);
}
+ ret = validate_options();
+ if (ret < 0) {
+ return EXIT_FAILURE;
+ }
+
ret = set_signal_handler();
if (ret < 0) {
clean_exit(ret);