X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=lttng%2Flttng.c;h=16487ff74a99cb2149bda0964af415ee2721868d;hb=1657e9bb835a28e66396deac871270fe373d5ff4;hp=3878fb8367614654d1e837951c121024803e8366;hpb=df0da1392bb6c77fff7fc65be518dce7de457ed7;p=lttng-tools.git diff --git a/lttng/lttng.c b/lttng/lttng.c index 3878fb836..16487ff74 100644 --- a/lttng/lttng.c +++ b/lttng/lttng.c @@ -42,9 +42,12 @@ static char *progname; 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 get_cmdline_by_pid(pid_t pid, char **cmdline); +static int validate_options(void); /* * start_client @@ -78,6 +81,13 @@ static int process_client_opt(void) } } + 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) { @@ -94,6 +104,7 @@ static int process_client_opt(void) } if (opt_session_uuid != NULL) { + DBG("Set session uuid to %s", opt_session_uuid); lttng_set_current_session_uuid(opt_session_uuid); } @@ -103,7 +114,16 @@ static int process_client_opt(void) if (ret < 0) { goto end; } - MSG("Trace created successfully!\nUse --start PID to start tracing"); + MSG("Trace created successfully!\nUse --start PID to start tracing."); + } + + if (opt_start_trace) { + DBG("Start trace for pid %d", opt_start_trace); + ret = lttng_ust_start_trace(opt_start_trace); + if (ret < 0) { + goto end; + } + MSG("Trace started successfully!"); } return 0; @@ -113,6 +133,45 @@ 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)", i, traces[i].name, 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 * @@ -180,9 +239,7 @@ static int process_opt_list_apps(void) { 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) { @@ -192,15 +249,13 @@ static int process_opt_list_apps(void) 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) { + ret = get_cmdline_by_pid(pids[i], &cmdline); + if (!ret) { 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() */ @@ -212,6 +267,62 @@ error: return ret; } +/* + * get_cmdline_by_pid + * + * Get command line from /proc for a + * specific pid. Allocate cmdline so the + * user must free() that pointer. + * + * On success, return 1 + * On error (not found), return 0 + */ +static int get_cmdline_by_pid(pid_t pid, char **cmdline) +{ + int ret; + FILE *fp; + 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 not_running; + } + + /* Caller must free() *cmdline */ + *cmdline = malloc(PATH_MAX); + ret = fread(*cmdline, 1, PATH_MAX, fp); + fclose(fp); + + return 1; + +not_running: + return 0; +} + +/* + * 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) +{ + if ((opt_session_uuid == NULL) && + (opt_create_trace || opt_start_trace || opt_list_traces)) { + ERR("You need to specify a session UUID.\nPlease use --session UUID to do so."); + goto error; + } + + return 0; + +error: + return -1; +} + /* * spawn_sessiond * @@ -346,15 +457,17 @@ end: */ 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; } @@ -391,6 +504,11 @@ int main(int argc, char *argv[]) clean_exit(EXIT_FAILURE); } + ret = validate_options(); + if (ret < 0) { + return EXIT_FAILURE; + } + ret = set_signal_handler(); if (ret < 0) { clean_exit(ret);