X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=lttng%2Flttng.c;h=52c3e3873d27ce967f6cb3294126b64d269144b8;hp=095ebe5e1c898343b86d177bfd39a926115b3090;hb=1c9f794140bd5bf0854e4790cc7ec4a5d3bb1134;hpb=5716705821202372fd16168f66f347ba293ef6b4 diff --git a/lttng/lttng.c b/lttng/lttng.c index 095ebe5e1..52c3e3873 100644 --- a/lttng/lttng.c +++ b/lttng/lttng.c @@ -42,8 +42,10 @@ 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_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); /* * start_client @@ -55,6 +57,7 @@ static int set_signal_handler(void); static int process_client_opt(void) { int ret; + uuid_t uuid; /* Connect to the session daemon */ ret = lttng_connect_sessiond(); @@ -76,6 +79,34 @@ static int process_client_opt(void) } } + if (opt_create_session != NULL) { + ret = process_opt_create_session(); + if (ret < 0) { + goto end; + } + } + + if (opt_destroy_session != NULL) { + uuid_parse(opt_destroy_session, uuid); + ret = lttng_destroy_session(&uuid); + if (ret < 0) { + goto end; + } + } + + if (opt_session_uuid != NULL) { + lttng_set_current_session_uuid(opt_session_uuid); + } + + if (opt_create_trace) { + DBG("Create trace for pid %d", opt_create_trace); + ret = lttng_ust_create_trace(opt_create_trace); + if (ret < 0) { + goto end; + } + MSG("Trace created successfully!\nUse --start PID to start tracing"); + } + return 0; end: @@ -83,6 +114,32 @@ end: return ret; } +/* + * process_opt_create_session + * + * Create a new session using the name pass + * to the command line. + */ +static int process_opt_create_session(void) +{ + int ret; + uuid_t session_id; + char str_uuid[37]; + + ret = lttng_create_session(opt_create_session, &session_id); + if (ret < 0) { + goto error; + } + + uuid_unparse(session_id, str_uuid); + + MSG("Session created:"); + MSG(" %s (%s)", opt_create_session, str_uuid); + +error: + return ret; +} + /* * process_opt_list_sessions * @@ -122,27 +179,25 @@ error: */ static int process_opt_list_apps(void) { - int i, ret; + 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; - ret = lttng_ust_list_apps(&pids); - if (ret < 0) { + count = lttng_ust_list_apps(&pids); + if (count < 0) { + ret = count; goto error; } MSG("LTTng UST traceable application [name (pid)]:"); - for (i=0; i < ret; i++) { - snprintf(path, sizeof(path), "/proc/%d/cmdline", pids[i]); - fp = fopen(path, "r"); - if (fp == NULL) { + for (i=0; i < count; i++) { + 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() */ @@ -154,6 +209,39 @@ 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; +} + /* * spawn_sessiond * @@ -170,7 +258,7 @@ static int spawn_sessiond(char *pathname) /* Spawn session daemon and tell * it to signal us when ready. */ - ret = execlp(pathname, "ltt-sessiond", "--sig-parent", NULL); + ret = execlp(pathname, "ltt-sessiond", "--sig-parent", "--quiet", NULL); if (ret < 0) { if (errno == ENOENT) { ERR("No session daemon found. Use --sessiond-path."); @@ -219,7 +307,13 @@ static int check_ltt_sessiond(void) pathname = opt_sessiond_path; } else { /* Try LTTNG_SESSIOND_PATH env variable */ - pathname = strdup(getenv(LTTNG_SESSIOND_PATH_ENV)); + pathname = getenv(LTTNG_SESSIOND_PATH_ENV); + if (pathname != NULL) { + /* strdup here in order to make the free() + * not fail later on. + */ + pathname = strdup(pathname); + } } /* Let's rock and roll */ @@ -302,6 +396,9 @@ static void sighandler(int sig) void clean_exit(int code) { DBG("Clean exit"); + if (lttng_disconnect_sessiond() < 0) { + ERR("Session daemon disconnect failed."); + } exit(code); } @@ -321,12 +418,12 @@ int main(int argc, char *argv[]) ret = parse_args(argc, (const char **) argv); if (ret < 0) { - return EXIT_FAILURE; + clean_exit(EXIT_FAILURE); } ret = set_signal_handler(); if (ret < 0) { - return ret; + clean_exit(ret); } if (opt_tracing_group != NULL) { @@ -339,7 +436,7 @@ int main(int argc, char *argv[]) DBG("Kernel tracing activated"); if (getuid() != 0) { ERR("%s must be setuid root", progname); - return -EPERM; + clean_exit(-EPERM); } } @@ -347,13 +444,15 @@ int main(int argc, char *argv[]) * If no, a daemon will be spawned. */ if (opt_no_sessiond == 0 && (check_ltt_sessiond() < 0)) { - return EXIT_FAILURE; + clean_exit(EXIT_FAILURE); } ret = process_client_opt(); if (ret < 0) { - return ret; + clean_exit(ret); } + clean_exit(0); + return 0; }