X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng%2Flttng.c;h=13c77321eb1a208544161e7317f9ad8e0379344a;hb=469b972be129ee907bb7ef4ee987cf040555c066;hp=d4d40f07722ef8aad0097164af92456454418f90;hpb=849e5b7b78004e931773838ab3fe1a19c843c01c;p=lttng-tools.git diff --git a/src/bin/lttng/lttng.c b/src/bin/lttng/lttng.c index d4d40f077..13c77321e 100644 --- a/src/bin/lttng/lttng.c +++ b/src/bin/lttng/lttng.c @@ -16,6 +16,7 @@ */ #define _GNU_SOURCE +#define _LGPL_SOURCE #include #include #include @@ -29,6 +30,7 @@ #include #include +#include #include "command.h" @@ -55,6 +57,7 @@ static struct option long_options[] = { {"group", 1, NULL, 'g'}, {"verbose", 0, NULL, 'v'}, {"quiet", 0, NULL, 'q'}, + {"mi", 1, NULL, 'm'}, {"no-sessiond", 0, NULL, 'n'}, {"sessiond-path", 1, NULL, OPT_SESSION_PATH}, {"relayd-path", 1, NULL, OPT_RELAYD_PATH}, @@ -82,14 +85,15 @@ static struct cmd_struct commands[] = { { "snapshot", cmd_snapshot}, { "save", cmd_save}, { "load", cmd_load}, - { "enable-consumer", cmd_enable_consumer}, /* OBSOLETE */ - { "disable-consumer", cmd_disable_consumer}, /* OBSOLETE */ + { "track", cmd_track}, + { "untrack", cmd_untrack}, { NULL, NULL} /* Array closure */ }; static void usage(FILE *ofp) { - fprintf(ofp, "LTTng Trace Control " FULL_VERSION" - " VERSION_NAME"\n\n"); + fprintf(ofp, "LTTng Trace Control " VERSION " - " VERSION_NAME "%s\n\n", + GIT_VERSION[0] == '\0' ? "" : " - " GIT_VERSION); fprintf(ofp, "usage: lttng [OPTIONS] []\n"); fprintf(ofp, "\n"); fprintf(ofp, "Options:\n"); @@ -99,6 +103,8 @@ static void usage(FILE *ofp) fprintf(ofp, " --list-commands Simple listing of lttng commands\n"); fprintf(ofp, " -v, --verbose Increase verbosity\n"); fprintf(ofp, " -q, --quiet Quiet mode\n"); + fprintf(ofp, " -m, --mi TYPE Machine Interface mode.\n"); + fprintf(ofp, " Type: xml\n"); fprintf(ofp, " -g, --group NAME Unix tracing group name. (default: tracing)\n"); fprintf(ofp, " -n, --no-sessiond Don't spawn a session daemon\n"); fprintf(ofp, " --sessiond-path PATH Session daemon full path\n"); @@ -122,6 +128,8 @@ static void usage(FILE *ofp) fprintf(ofp, " view Start trace viewer\n"); fprintf(ofp, " save Save session configuration\n"); fprintf(ofp, " load Load session configuration\n"); + fprintf(ofp, " track Track specific system resources\n"); + fprintf(ofp, " untrack Untrack specific system resources\n"); fprintf(ofp, "\n"); fprintf(ofp, "Each command also has its own -h, --help option.\n"); fprintf(ofp, "\n"); @@ -131,8 +139,28 @@ static void usage(FILE *ofp) static void version(FILE *ofp) { - fprintf(ofp, "%s (LTTng Trace Control) " FULL_VERSION" - " VERSION_NAME"\n", - progname); + fprintf(ofp, "%s (LTTng Trace Control) " VERSION" - " VERSION_NAME "%s\n", + progname, + GIT_VERSION[0] == '\0' ? "" : " - " GIT_VERSION); +} + +/* + * Find the MI output type enum from a string. This function is for the support + * of machine interface output. + */ +static int mi_output_type(const char *output_type) +{ + int ret = 0; + + if (!strncasecmp("xml", output_type, 3)) { + ret = LTTNG_MI_XML; + } else { + /* Invalid output format */ + ERR("MI output format not supported"); + ret = -LTTNG_ERR_MI_OUTPUT_TYPE; + } + + return ret; } /* @@ -215,7 +243,7 @@ static int set_signal_handler(void) sigset_t sigset; if ((ret = sigemptyset(&sigset)) < 0) { - perror("sigemptyset"); + PERROR("sigemptyset"); goto end; } @@ -223,17 +251,17 @@ static int set_signal_handler(void) sa.sa_mask = sigset; sa.sa_flags = 0; if ((ret = sigaction(SIGUSR1, &sa, NULL)) < 0) { - perror("sigaction"); + PERROR("sigaction"); goto end; } if ((ret = sigaction(SIGTERM, &sa, NULL)) < 0) { - perror("sigaction"); + PERROR("sigaction"); goto end; } if ((ret = sigaction(SIGCHLD, &sa, NULL)) < 0) { - perror("sigaction"); + PERROR("sigaction"); goto end; } @@ -301,7 +329,7 @@ static int spawn_sessiond(char *pathname) if (errno == ENOENT) { ERR("No session daemon found. Use --sessiond-path."); } else { - perror("execlp"); + PERROR("execlp"); } kill(getppid(), SIGTERM); /* wake parent */ exit(EXIT_FAILURE); @@ -327,7 +355,7 @@ static int spawn_sessiond(char *pathname) } goto end; } else { - perror("fork"); + PERROR("fork"); ret = -1; goto end; } @@ -420,13 +448,19 @@ static int check_args_no_sessiond(int argc, char **argv) static int parse_args(int argc, char **argv) { int opt, ret; + char *user; + + if (lttng_is_setuid_setgid()) { + ERR("'%s' is not allowed to be executed as a setuid/setgid binary for security reasons. Aborting.", argv[0]); + clean_exit(EXIT_FAILURE); + } if (argc < 2) { usage(stderr); clean_exit(EXIT_FAILURE); } - while ((opt = getopt_long(argc, argv, "+Vhnvqg:", long_options, NULL)) != -1) { + while ((opt = getopt_long(argc, argv, "+Vhnvqg:m:", long_options, NULL)) != -1) { switch (opt) { case 'V': version(stdout); @@ -445,6 +479,13 @@ static int parse_args(int argc, char **argv) case 'q': lttng_opt_quiet = 1; break; + case 'm': + lttng_opt_mi = mi_output_type(optarg); + if (lttng_opt_mi < 0) { + ret = lttng_opt_mi; + goto error; + } + break; case 'g': lttng_set_tracing_group(optarg); break; @@ -453,9 +494,17 @@ static int parse_args(int argc, char **argv) break; case OPT_SESSION_PATH: opt_sessiond_path = strdup(optarg); + if (!opt_sessiond_path) { + ret = -1; + goto error; + } break; case OPT_RELAYD_PATH: opt_relayd_path = strdup(optarg); + if (!opt_relayd_path) { + ret = -1; + goto error; + } break; case OPT_DUMP_OPTIONS: list_options(stdout); @@ -491,6 +540,14 @@ static int parse_args(int argc, char **argv) goto error; } + /* For Mathieu Desnoyers a.k.a. Dr. Tracing */ + user = getenv("USER"); + if (user != NULL && ((strncmp(progname, "drtrace", 7) == 0 || + strncmp("compudj", user, 7) == 0))) { + MSG("%c[%d;%dmWelcome back Dr Tracing!%c[%dm\n", 27,1,33,27,0); + } + /* Thanks Mathieu */ + /* * Handle leftovers which is a first level command with the trailing * options. @@ -537,18 +594,9 @@ error: int main(int argc, char *argv[]) { int ret; - char *user; progname = argv[0] ? argv[0] : "lttng"; - /* For Mathieu Desnoyers a.k.a. Dr. Tracing */ - user = getenv("USER"); - if (user != NULL && ((strncmp(progname, "drtrace", 7) == 0 || - strncmp("compudj", user, 7) == 0))) { - MSG("%c[%d;%dmWelcome back Dr Tracing!%c[%dm\n", 27,1,33,27,0); - } - /* Thanks Mathieu */ - ret = set_signal_handler(); if (ret < 0) { clean_exit(ret);