X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=lttng%2Flttng.c;h=69b563d4a643eb80db6718673602ebe67efb9c4b;hp=e4578c70a3a60ad8eb8a2a2cdf510a5458e5e82b;hb=734f79bf717d87817623d382c59086dc9e8ef610;hpb=d36b858358a8ef4e00de843379d670925f9c23b6 diff --git a/lttng/lttng.c b/lttng/lttng.c index e4578c70a..69b563d4a 100644 --- a/lttng/lttng.c +++ b/lttng/lttng.c @@ -3,8 +3,8 @@ * * 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. + * as published by the Free Software Foundation; only version 2 + * of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -23,6 +23,7 @@ #include #include #include +#include #include @@ -39,8 +40,9 @@ static int opt_no_sessiond; static char *opt_sessiond_path; enum { - OPT_NO_SESSIOND, OPT_SESSION_PATH, + OPT_DUMP_OPTIONS, + OPT_DUMP_COMMANDS, }; /* Getopt options. No first level command. */ @@ -49,8 +51,10 @@ static struct option long_options[] = { {"group", 1, NULL, 'g'}, {"verbose", 0, NULL, 'v'}, {"quiet", 0, NULL, 'q'}, - {"no-sessiond", 0, NULL, OPT_NO_SESSIOND}, + {"no-sessiond", 0, NULL, 'n'}, {"sessiond-path", 1, NULL, OPT_SESSION_PATH}, + {"list-options", 0, NULL, OPT_DUMP_OPTIONS}, + {"list-commands", 0, NULL, OPT_DUMP_COMMANDS}, {NULL, 0, NULL, 0} }; @@ -59,12 +63,16 @@ static struct cmd_struct commands[] = { { "list", cmd_list}, { "create", cmd_create}, { "destroy", cmd_destroy}, - { "add-channel", cmd_add_channel}, { "start", cmd_start}, { "stop", cmd_stop}, { "enable-event", cmd_enable_events}, { "disable-event", cmd_disable_events}, { "enable-channel", cmd_enable_channels}, + { "disable-channel", cmd_disable_channels}, + { "add-context", cmd_add_context}, + { "set-session", cmd_set_session}, + { "version", cmd_version}, + { "calibrate", cmd_calibrate}, { NULL, NULL} /* Array closure */ }; @@ -78,17 +86,22 @@ static void usage(FILE *ofp) fprintf(ofp, " -g, --group NAME Unix tracing group name. (default: tracing)\n"); fprintf(ofp, " -v, --verbose Verbose mode\n"); fprintf(ofp, " -q, --quiet Quiet mode\n"); - fprintf(ofp, " --no-sessiond Don't spawn a session daemon\n"); + fprintf(ofp, " -n, --no-sessiond Don't spawn a session daemon\n"); fprintf(ofp, " --sessiond-path Session daemon full path\n"); + fprintf(ofp, " --list-options Simple listing of lttng options\n"); + fprintf(ofp, " --list-commands Simple listing of lttng commands\n"); fprintf(ofp, "\n"); fprintf(ofp, "Commands:\n"); - fprintf(ofp, " add-channel Add channel to tracer\n"); + fprintf(ofp, " add-context Add context to event or/and channel\n"); + fprintf(ofp, " calibrate Quantify LTTng overhead\n"); fprintf(ofp, " create Create tracing session\n"); fprintf(ofp, " destroy Teardown tracing session\n"); - fprintf(ofp, " enable-event Enable tracing event\n"); fprintf(ofp, " enable-channel Enable tracing channel\n"); + fprintf(ofp, " enable-event Enable tracing event\n"); + fprintf(ofp, " disable-channel Disable tracing channel\n"); fprintf(ofp, " disable-event Disable tracing event\n"); fprintf(ofp, " list List possible tracing options\n"); + fprintf(ofp, " set-session Set current session name\n"); fprintf(ofp, " start Start tracing\n"); fprintf(ofp, " stop Stop tracing\n"); fprintf(ofp, " version Show version information\n"); @@ -97,6 +110,49 @@ static void usage(FILE *ofp) fprintf(ofp, "See http://lttng.org for updates, bug reports and news.\n"); } +/* + * list_options + * + * List options line by line. This is mostly for bash auto completion and to + * avoid difficult parsing. + */ +static void list_options(FILE *ofp) +{ + int i = 0; + struct option *option = NULL; + + option = &long_options[i]; + while (option->name != NULL) { + fprintf(ofp, "--%s\n", option->name); + + if (isprint(option->val)) { + fprintf(ofp, "-%c\n", option->val); + } + + i++; + option = &long_options[i]; + } +} + +/* + * list_commands + * + * List commands line by line. This is mostly for bash auto completion and to + * avoid difficult parsing. + */ +static void list_commands(FILE *ofp) +{ + int i = 0; + struct cmd_struct *cmd = NULL; + + cmd = &commands[i]; + while (cmd->name != NULL) { + fprintf(ofp, "%s\n", cmd->name); + i++; + cmd = &commands[i]; + } +} + /* * clean_exit */ @@ -231,7 +287,7 @@ static int spawn_sessiond(char *pathname) * Spawn session daemon and tell * it to signal us when ready. */ - execlp(pathname, "ltt-sessiond", "--sig-parent", "--quiet", NULL); + execlp(pathname, "lttng-sessiond", "--sig-parent", "--quiet", NULL); /* execlp only returns if error happened */ if (errno == ENOENT) { ERR("No session daemon found. Use --sessiond-path."); @@ -241,7 +297,7 @@ static int spawn_sessiond(char *pathname) kill(getppid(), SIGTERM); /* unpause parent */ exit(EXIT_FAILURE); } else if (pid > 0) { - /* Wait for ltt-sessiond to start */ + /* Wait for lttng-sessiond to start */ pause(); goto end; } else { @@ -283,8 +339,9 @@ static int check_sessiond(void) /* Let's rock and roll */ if (pathname == NULL) { - ret = asprintf(&alloc_pathname, "ltt-sessiond"); + ret = asprintf(&alloc_pathname, INSTALL_BIN_PATH "/lttng-sessiond"); if (ret < 0) { + perror("asprintf spawn sessiond"); goto end; } pathname = alloc_pathname; @@ -302,6 +359,23 @@ end: return ret; } +/* + * Check for the "help" option in the argv. If found, return 1 else return 0. + */ +static int check_help_command(int argc, char **argv) +{ + int i; + + for (i = 0; i < argc; i++) { + if ((strncmp(argv[i], "-h", 2) == 0) || + strncmp(argv[i], "--h", 3) == 0) { + return 1; + } + } + + return 0; +} + /* * parse_args * @@ -317,13 +391,13 @@ static int parse_args(int argc, char **argv) clean_exit(EXIT_FAILURE); } - while ((opt = getopt_long(argc, argv, "+hvqg:", long_options, NULL)) != -1) { + while ((opt = getopt_long(argc, argv, "+hnvqg:", long_options, NULL)) != -1) { switch (opt) { case 'h': usage(stderr); goto error; case 'v': - opt_verbose = 1; + opt_verbose += 1; break; case 'q': opt_quiet = 1; @@ -331,12 +405,20 @@ static int parse_args(int argc, char **argv) case 'g': lttng_set_tracing_group(optarg); break; - case OPT_NO_SESSIOND: + case 'n': opt_no_sessiond = 1; break; case OPT_SESSION_PATH: opt_sessiond_path = strdup(optarg); break; + case OPT_DUMP_OPTIONS: + list_options(stdout); + ret = 0; + goto error; + case OPT_DUMP_COMMANDS: + list_commands(stdout); + ret = 0; + goto error; default: usage(stderr); goto error; @@ -349,7 +431,8 @@ static int parse_args(int argc, char **argv) } /* Spawn session daemon if needed */ - if (opt_no_sessiond == 0 && (check_sessiond() < 0)) { + if (opt_no_sessiond == 0 && check_help_command(argc, argv) == 0 && + (check_sessiond() < 0)) { goto error; } @@ -367,13 +450,13 @@ static int parse_args(int argc, char **argv) if (ret < 0) { if (ret == -1) { usage(stderr); - goto error; } else { - ERR("%s", lttng_get_readable_code(ret)); + ERR("%s", lttng_strerror(ret)); } + goto error; } - return ret; + return 0; error: return -1; @@ -400,7 +483,9 @@ int main(int argc, char *argv[]) } ret = parse_args(argc, argv); - clean_exit(ret); + if (ret < 0) { + clean_exit(EXIT_FAILURE); + } return 0; }