X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng%2Flttng.c;h=e760bdbe1311b996ee3eb698adbf79c5e8754e80;hp=b498539c76ea7847baafb177f23ee792f50fa901;hb=4624dad0d79b63be45c5c6d7eb2920ba09746f06;hpb=3ee1477aed1f58ff8cabdc4758dc2551590b4aff diff --git a/src/bin/lttng/lttng.c b/src/bin/lttng/lttng.c index b498539c7..e760bdbe1 100644 --- a/src/bin/lttng/lttng.c +++ b/src/bin/lttng/lttng.c @@ -1,18 +1,8 @@ /* - * Copyright (c) 2011 David Goulet + * 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, version 2 only, - * as published by the Free Software Foundation. + * SPDX-License-Identifier: GPL-2.0-only * - * 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 _LGPL_SOURCE @@ -32,9 +22,18 @@ #include #include "command.h" +#include "version.h" + +static const char *help_msg = +#ifdef LTTNG_EMBED_HELP +#include +#else +NULL +#endif +; /* Variables */ -static char *progname; +static const char *progname; int opt_no_sessiond; char *opt_sessiond_path; @@ -66,8 +65,9 @@ static struct option long_options[] = { /* First level command */ static struct cmd_struct commands[] = { { "add-context", cmd_add_context}, - { "calibrate", cmd_calibrate}, + { "add-trigger", cmd_add_trigger}, { "create", cmd_create}, + { "clear", cmd_clear}, { "destroy", cmd_destroy}, { "disable-channel", cmd_disable_channels}, { "disable-event", cmd_disable_events}, @@ -77,6 +77,10 @@ static struct cmd_struct commands[] = { { "list", cmd_list}, { "load", cmd_load}, { "metadata", cmd_metadata}, + { "regenerate", cmd_regenerate}, + { "rotate", cmd_rotate}, + { "enable-rotation", cmd_enable_rotation}, + { "disable-rotation", cmd_disable_rotation}, { "save", cmd_save}, { "set-session", cmd_set_session}, { "snapshot", cmd_snapshot}, @@ -85,7 +89,6 @@ static struct cmd_struct commands[] = { { "stop", cmd_stop}, { "track", cmd_track}, { "untrack", cmd_untrack}, - { "help", NULL}, { "version", cmd_version}, { "view", cmd_view}, { NULL, NULL} /* Array closure */ @@ -93,9 +96,10 @@ static struct cmd_struct commands[] = { static void version(FILE *ofp) { - fprintf(ofp, "%s (LTTng Trace Control) " VERSION" - " VERSION_NAME "%s\n", + fprintf(ofp, "%s (LTTng Trace Control) " VERSION" - " VERSION_NAME "%s%s\n", progname, - GIT_VERSION[0] == '\0' ? "" : " - " GIT_VERSION); + GIT_VERSION[0] == '\0' ? "" : " - " GIT_VERSION, + EXTRA_VERSION_NAME[0] == '\0' ? "" : " - " EXTRA_VERSION_NAME); } /* @@ -242,6 +246,77 @@ end: return ret; } +static bool command_exists(const char *command) +{ + const struct cmd_struct *cmd = commands; + bool exists = false; + + while (cmd->name != NULL) { + if (!strcmp(command, cmd->name)) { + exists = true; + goto end; + } + cmd++; + } + +end: + return exists; +} + +static void show_basic_help(void) +{ + puts("Usage: lttng [--group=GROUP] [--mi=TYPE] [--no-sessiond | --sessiond-path=PATH]"); + puts(" [--quiet | -v | -vv | -vvv] COMMAND [COMMAND OPTIONS]"); + puts(""); + puts("Available commands:"); + puts(""); + puts("Tracing sessions:"); + puts(" create " CONFIG_CMD_DESCR_CREATE); + puts(" clear " CONFIG_CMD_DESCR_CLEAR); + puts(" destroy " CONFIG_CMD_DESCR_DESTROY); + puts(" load " CONFIG_CMD_DESCR_LOAD); + puts(" regenerate " CONFIG_CMD_DESCR_REGENERATE); + puts(" save " CONFIG_CMD_DESCR_SAVE); + puts(" set-session " CONFIG_CMD_DESCR_SET_SESSION); + puts(""); + puts("Channels:"); + puts(" add-context " CONFIG_CMD_DESCR_ADD_CONTEXT); + puts(" disable-channel " CONFIG_CMD_DESCR_DISABLE_CHANNEL); + puts(" enable-channel " CONFIG_CMD_DESCR_ENABLE_CHANNEL); + puts(""); + puts("Event rules:"); + puts(" disable-event " CONFIG_CMD_DESCR_DISABLE_EVENT); + puts(" enable-event " CONFIG_CMD_DESCR_ENABLE_EVENT); + puts(""); + puts("Status:"); + puts(" list " CONFIG_CMD_DESCR_LIST); + puts(" status " CONFIG_CMD_DESCR_STATUS); + puts(""); + puts("Control:"); + puts(" snapshot " CONFIG_CMD_DESCR_SNAPSHOT); + puts(" start " CONFIG_CMD_DESCR_START); + puts(" stop " CONFIG_CMD_DESCR_STOP); + puts(""); + puts("Tracing session rotation:"); + puts(" disable-rotation " CONFIG_CMD_DESCR_DISABLE_ROTATION); + puts(" enable-rotation " CONFIG_CMD_DESCR_ENABLE_ROTATION); + puts(" rotate " CONFIG_CMD_DESCR_ROTATE); + puts(""); + puts("Resource tracking:"); + puts(" track " CONFIG_CMD_DESCR_TRACK); + puts(" untrack " CONFIG_CMD_DESCR_UNTRACK); + puts(""); + puts("Miscellaneous:"); + puts(" help " CONFIG_CMD_DESCR_HELP); + puts(" version " CONFIG_CMD_DESCR_VERSION); + puts(" view " CONFIG_CMD_DESCR_VIEW); + puts(""); + puts("Run `lttng help COMMAND` or `lttng COMMAND --help` to get help with"); + puts("command COMMAND."); + puts(""); + puts("See `man lttng` for more help with the lttng command."); +} + /* * Parse command line arguments. * @@ -250,7 +325,6 @@ end: 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]); @@ -258,6 +332,7 @@ static int parse_args(int argc, char **argv) } if (argc < 2) { + show_basic_help(); clean_exit(EXIT_FAILURE); } @@ -268,10 +343,9 @@ static int parse_args(int argc, char **argv) ret = 0; goto end; case 'h': - ret = utils_show_man_page(1, "lttng"); - + ret = utils_show_help(1, "lttng", help_msg); if (ret) { - ERR("Cannot view man page lttng(1)"); + ERR("Cannot show --help for `lttng`"); perror("exec"); } goto end; @@ -298,6 +372,7 @@ static int parse_args(int argc, char **argv) opt_no_sessiond = 1; break; case OPT_SESSION_PATH: + free(opt_sessiond_path); opt_sessiond_path = strdup(optarg); if (!opt_sessiond_path) { ret = -1; @@ -305,6 +380,7 @@ static int parse_args(int argc, char **argv) } break; case OPT_RELAYD_PATH: + free(opt_relayd_path); opt_relayd_path = strdup(optarg); if (!opt_relayd_path) { ret = -1; @@ -336,14 +412,6 @@ 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. @@ -351,19 +419,19 @@ static int parse_args(int argc, char **argv) ret = handle_command(argc - optind, argv + optind); switch (ret) { case CMD_WARNING: - WARN("Some command(s) went wrong"); - break; case CMD_ERROR: - ERR("Command error"); break; case CMD_UNDEFINED: - ERR("Undefined command or invalid arguments"); + if (!command_exists(*(argv + optind))) { + MSG("lttng: %s is not an lttng command. See 'lttng --help'.", + *(argv + optind)); + } else { + ERR("Unrecognized argument used with \'%s\' command", + *(argv + optind)); + } break; case CMD_FATAL: - ERR("Fatal error"); - break; case CMD_UNSUPPORTED: - ERR("Unsupported command"); break; case -1: ret = 1;