X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=lttng%2Flttng.c;h=52c3e3873d27ce967f6cb3294126b64d269144b8;hp=3878fb8367614654d1e837951c121024803e8366;hb=1c9f794140bd5bf0854e4790cc7ec4a5d3bb1134;hpb=fda89c9b0a068c6d528e1ef9095476118708c181 diff --git a/lttng/lttng.c b/lttng/lttng.c index 3878fb836..52c3e3873 100644 --- a/lttng/lttng.c +++ b/lttng/lttng.c @@ -45,6 +45,7 @@ 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 @@ -180,9 +181,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 +191,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 +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 *