X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=lttng%2Flttng.c;h=36a4fbed99e1b5234e986b3a7c10aa85ef00d54e;hb=HEAD;hp=52c3e3873d27ce967f6cb3294126b64d269144b8;hpb=1c9f794140bd5bf0854e4790cc7ec4a5d3bb1134;p=lttng-tools.git diff --git a/lttng/lttng.c b/lttng/lttng.c deleted file mode 100644 index 52c3e3873..000000000 --- a/lttng/lttng.c +++ /dev/null @@ -1,458 +0,0 @@ -/* - * Copyright (c) 2011 David Goulet - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#define _GNU_SOURCE -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "lttng.h" -#include "lttngerr.h" - -/* Variables */ -static char *progname; - -/* Prototypes */ -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 - * - * Process client request from the command line - * options. Every tracing action is done by the - * liblttngctl API. - */ -static int process_client_opt(void) -{ - int ret; - uuid_t uuid; - - /* Connect to the session daemon */ - ret = lttng_connect_sessiond(); - if (ret < 0) { - goto end; - } - - if (opt_list_apps) { - ret = process_opt_list_apps(); - if (ret < 0) { - goto end; - } - } - - if (opt_list_session) { - ret = process_opt_list_sessions(); - if (ret < 0) { - goto end; - } - } - - 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: - ERR("%s", lttng_get_readable_code(ret)); - 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 - * - * Get the list of available sessions from - * the session daemon and print it to user. - */ -static int process_opt_list_sessions(void) -{ - int ret, count, i; - struct lttng_session *sess; - - count = lttng_list_sessions(&sess); - if (count < 0) { - ret = count; - goto error; - } - - MSG("Available sessions [Name (uuid)]:"); - for (i = 0; i < count; i++) { - MSG("\tName: %s (uuid: %s)", sess[i].name, sess[i].uuid); - } - - free(sess); - MSG("\nTo select a session, use --session UUID."); - - return 0; - -error: - return ret; -} - -/* - * process_opt_list_apps - * - * Get the UST traceable pid list and print - * them to the user. - */ -static int process_opt_list_apps(void) -{ - int i, ret, count; - pid_t *pids; - char *cmdline; - - count = lttng_ust_list_apps(&pids); - if (count < 0) { - ret = count; - goto error; - } - - MSG("LTTng UST traceable application [name (pid)]:"); - for (i=0; i < count; i++) { - ret = get_cmdline_by_pid(pids[i], &cmdline); - if (!ret) { - MSG("\t(not running) (%d)", pids[i]); - continue; - } - MSG("\t%s (%d)", cmdline, pids[i]); - free(cmdline); - } - - /* Allocated by lttng_ust_list_apps() */ - free(pids); - - return 0; - -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 - * - * Spawn a session daemon by forking and execv. - */ -static int spawn_sessiond(char *pathname) -{ - int ret = 0; - pid_t pid; - - MSG("Spawning session daemon"); - pid = fork(); - if (pid == 0) { - /* Spawn session daemon and tell - * it to signal us when ready. - */ - ret = execlp(pathname, "ltt-sessiond", "--sig-parent", "--quiet", NULL); - if (ret < 0) { - if (errno == ENOENT) { - ERR("No session daemon found. Use --sessiond-path."); - } else { - perror("execlp"); - } - kill(getppid(), SIGTERM); - exit(EXIT_FAILURE); - } - exit(EXIT_SUCCESS); - } else if (pid > 0) { - /* Wait for ltt-sessiond to start */ - pause(); - goto end; - } else { - perror("fork"); - ret = -1; - goto end; - } - -end: - return ret; -} - -/* - * check_ltt_sessiond - * - * Check if the session daemon is available using - * the liblttngctl API for the check. If not, try to - * spawn a daemon. - */ -static int check_ltt_sessiond(void) -{ - int ret; - char *pathname = NULL; - - ret = lttng_check_session_daemon(); - if (ret < 0) { - /* Try command line option path */ - if (opt_sessiond_path != NULL) { - ret = access(opt_sessiond_path, F_OK | X_OK); - if (ret < 0) { - ERR("No such file: %s", opt_sessiond_path); - goto end; - } - pathname = opt_sessiond_path; - } else { - /* Try LTTNG_SESSIOND_PATH env variable */ - 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 */ - if (pathname == NULL) { - ret = asprintf(&pathname, "ltt-sessiond"); - if (ret < 0) { - goto end; - } - } - - ret = spawn_sessiond(pathname); - free(pathname); - if (ret < 0) { - ERR("Problem occurs when starting %s", pathname); - goto end; - } - } - -end: - return ret; -} - -/* - * set_signal_handler - * - * Setup signal handler for SIGCHLD and SIGTERM. - */ -static int set_signal_handler(void) -{ - int ret = 0; - struct sigaction sa; - sigset_t sigset; - - if ((ret = sigemptyset(&sigset)) < 0) { - perror("sigemptyset"); - goto end; - } - - sa.sa_handler = sighandler; - sa.sa_mask = sigset; - sa.sa_flags = 0; - if ((ret = sigaction(SIGCHLD, &sa, NULL)) < 0) { - perror("sigaction"); - goto end; - } - - if ((ret = sigaction(SIGTERM, &sa, NULL)) < 0) { - perror("sigaction"); - goto end; - } - -end: - return ret; -} - -/* - * sighandler - * - * Signal handler for the daemon - */ -static void sighandler(int sig) -{ - DBG("%d received", sig); - switch (sig) { - case SIGTERM: - clean_exit(EXIT_FAILURE); - break; - case SIGCHLD: - /* Notify is done */ - break; - default: - break; - } - - return; -} -/* - * clean_exit - */ -void clean_exit(int code) -{ - DBG("Clean exit"); - if (lttng_disconnect_sessiond() < 0) { - ERR("Session daemon disconnect failed."); - } - exit(code); -} - -/* - * main - */ -int main(int argc, char *argv[]) -{ - int ret; - - progname = argv[0] ? argv[0] : "lttng"; - - /* For Mathieu Desnoyers aka Dr Tracing */ - if (strncmp(progname, "drtrace", 7) == 0) { - MSG("%c[%d;%dmWelcome back Dr Tracing!%c[%dm\n\n", 27,1,33,27,0); - } - - ret = parse_args(argc, (const char **) argv); - if (ret < 0) { - clean_exit(EXIT_FAILURE); - } - - ret = set_signal_handler(); - if (ret < 0) { - clean_exit(ret); - } - - if (opt_tracing_group != NULL) { - DBG("Set tracing group to '%s'", opt_tracing_group); - lttng_set_tracing_group(opt_tracing_group); - } - - /* If ask for kernel tracing, need root perms */ - if (opt_trace_kernel) { - DBG("Kernel tracing activated"); - if (getuid() != 0) { - ERR("%s must be setuid root", progname); - clean_exit(-EPERM); - } - } - - /* Check if the lttng session daemon is running. - * If no, a daemon will be spawned. - */ - if (opt_no_sessiond == 0 && (check_ltt_sessiond() < 0)) { - clean_exit(EXIT_FAILURE); - } - - ret = process_client_opt(); - if (ret < 0) { - clean_exit(ret); - } - - clean_exit(0); - - return 0; -}