From: Simon Marchi <[email protected]> This allows to list the command-specific options in order to make more accurate bash completion.
Signed-off-by: Simon Marchi <[email protected]> --- lttng/commands/add_context.c | 9 +++++++++ lttng/commands/create.c | 11 +++++++++-- lttng/commands/destroy.c | 9 ++++++++- lttng/commands/disable_channels.c | 8 ++++++++ lttng/commands/disable_events.c | 8 ++++++++ lttng/commands/enable_channels.c | 8 ++++++++ lttng/commands/enable_events.c | 10 +++++++++- lttng/commands/list.c | 20 ++++++++++++++------ lttng/commands/set_session.c | 8 ++++++++ lttng/commands/start.c | 9 ++++++++- lttng/commands/stop.c | 9 ++++++++- lttng/commands/version.c | 10 +++++++++- lttng/utils.c | 27 +++++++++++++++++++++++++++ lttng/utils.h | 3 +++ 14 files changed, 136 insertions(+), 13 deletions(-) diff --git a/lttng/commands/add_context.c b/lttng/commands/add_context.c index 5756684..b1f007f 100644 --- a/lttng/commands/add_context.c +++ b/lttng/commands/add_context.c @@ -45,6 +45,7 @@ static pid_t opt_pid; enum { OPT_HELP = 1, OPT_TYPE, + OPT_LISTOPTS, }; /* @@ -140,6 +141,7 @@ static struct poptOption long_options[] = { {"all", 0, POPT_ARG_VAL, &opt_pid_all, 1, 0, 0}, {"pid", 'p', POPT_ARG_INT, &opt_pid, 0, 0, 0}, {"type", 't', POPT_ARG_STRING, 0, OPT_TYPE, 0, 0}, + {"list-options", 0, POPT_ARG_NONE, 0, OPT_LISTOPTS, 0, 0}, {0, 0, 0, 0, 0, 0, 0} }; @@ -311,6 +313,9 @@ static void usage(FILE *ofp) fprintf(ofp, " TYPE can be one of the strings below:\n"); print_ctx_type(ofp); fprintf(ofp, "\n"); + fprintf(ofp, " --list-options Prints a simple list of options specific to\n"); + fprintf(ofp, " add-context\n"); + fprintf(ofp, "\n"); fprintf(ofp, "Example:\n"); fprintf(ofp, "This command will add the context information 'prio' and two perf\n" "counters: hardware branch misses and cache misses, to all events\n" @@ -454,6 +459,10 @@ int cmd_add_context(int argc, const char **argv) } free(tmp); break; + case OPT_LISTOPTS: + list_cmd_options(stdout, long_options); + ret = CMD_SUCCESS; + goto end; default: usage(stderr); ret = CMD_UNDEFINED; diff --git a/lttng/commands/create.c b/lttng/commands/create.c index 4083e41..911d166 100644 --- a/lttng/commands/create.c +++ b/lttng/commands/create.c @@ -35,12 +35,14 @@ static char *opt_session_name; enum { OPT_HELP = 1, + OPT_LISTOPTS, }; static struct poptOption long_options[] = { /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */ - {"help", 'h', POPT_ARG_NONE, 0, OPT_HELP, 0, 0}, - {"output", 'o', POPT_ARG_STRING, &opt_output_path, 0, 0, 0}, + {"help", 'h', POPT_ARG_NONE, 0, OPT_HELP, 0, 0}, + {"output", 'o', POPT_ARG_STRING, &opt_output_path, 0, 0, 0}, + {"list-options", 0, POPT_ARG_NONE, 0, OPT_LISTOPTS, 0, 0}, {0, 0, 0, 0, 0, 0, 0} }; @@ -53,6 +55,7 @@ static void usage(FILE *ofp) fprintf(ofp, "\n"); fprintf(ofp, " -h, --help Show this help\n"); fprintf(ofp, " -o, --output PATH Specify output path for traces\n"); + fprintf(ofp, " --list-options Prints a simple list of options specific to create\n"); fprintf(ofp, "\n"); } @@ -162,6 +165,10 @@ int cmd_create(int argc, const char **argv) case OPT_HELP: usage(stderr); goto end; + case OPT_LISTOPTS: + list_cmd_options(stdout, long_options); + ret = CMD_SUCCESS; + goto end; default: usage(stderr); ret = CMD_UNDEFINED; diff --git a/lttng/commands/destroy.c b/lttng/commands/destroy.c index 516f8ab..8563bea 100644 --- a/lttng/commands/destroy.c +++ b/lttng/commands/destroy.c @@ -33,11 +33,13 @@ static char *opt_session_name; enum { OPT_HELP = 1, + OPT_LISTOPTS, }; static struct poptOption long_options[] = { /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */ - {"help", 'h', POPT_ARG_NONE, 0, OPT_HELP, 0, 0}, + {"help", 'h', POPT_ARG_NONE, 0, OPT_HELP, 0, 0}, + {"list-options", 0, POPT_ARG_NONE, 0, OPT_LISTOPTS, 0, 0}, {0, 0, 0, 0, 0, 0, 0} }; @@ -52,6 +54,7 @@ static void usage(FILE *ofp) fprintf(ofp, "get it from the configuration directory (.lttng).\n"); fprintf(ofp, "\n"); fprintf(ofp, " -h, --help Show this help\n"); + fprintf(ofp, " --list-options Prints a simple list of options specific to destroy\n"); fprintf(ofp, "\n"); } @@ -122,6 +125,10 @@ int cmd_destroy(int argc, const char **argv) case OPT_HELP: usage(stderr); goto end; + case OPT_LISTOPTS: + list_cmd_options(stdout, long_options); + ret = CMD_SUCCESS; + goto end; default: usage(stderr); ret = CMD_UNDEFINED; diff --git a/lttng/commands/disable_channels.c b/lttng/commands/disable_channels.c index c23019b..2bf7d7d 100644 --- a/lttng/commands/disable_channels.c +++ b/lttng/commands/disable_channels.c @@ -39,6 +39,7 @@ static pid_t opt_pid; enum { OPT_HELP = 1, OPT_USERSPACE, + OPT_LISTOPTS, }; static struct poptOption long_options[] = { @@ -49,6 +50,7 @@ static struct poptOption long_options[] = { {"userspace", 'u', POPT_ARG_NONE, 0, OPT_USERSPACE, 0, 0}, {"all", 0, POPT_ARG_VAL, &opt_pid_all, 1, 0, 0}, {"pid", 'p', POPT_ARG_INT, &opt_pid, 0, 0, 0}, + {"list-options", 0, POPT_ARG_NONE, 0, OPT_LISTOPTS, 0, 0}, {0, 0, 0, 0, 0, 0, 0} }; @@ -65,6 +67,8 @@ static void usage(FILE *ofp) fprintf(ofp, " -u, --userspace Apply for the user-space tracer\n"); fprintf(ofp, " --all If -u, apply on all traceable apps\n"); fprintf(ofp, " -p, --pid PID If -u, apply on a specific PID\n"); + fprintf(ofp, " --list-options Prints a simple list of options specific to\n"); + fprintf(ofp, " disable-channel\n"); fprintf(ofp, "\n"); } @@ -144,6 +148,10 @@ int cmd_disable_channels(int argc, const char **argv) case OPT_USERSPACE: opt_userspace = 1; break; + case OPT_LISTOPTS: + list_cmd_options(stdout, long_options); + ret = CMD_SUCCESS; + goto end; default: usage(stderr); ret = CMD_UNDEFINED; diff --git a/lttng/commands/disable_events.c b/lttng/commands/disable_events.c index 952b2b6..f817f38 100644 --- a/lttng/commands/disable_events.c +++ b/lttng/commands/disable_events.c @@ -42,6 +42,7 @@ static pid_t opt_pid; enum { OPT_HELP = 1, OPT_USERSPACE, + OPT_LISTOPTS, }; static struct poptOption long_options[] = { @@ -54,6 +55,7 @@ static struct poptOption long_options[] = { {"userspace", 'u', POPT_ARG_STRING | POPT_ARGFLAG_OPTIONAL, 0, OPT_USERSPACE, 0, 0}, {"all", 0, POPT_ARG_VAL, &opt_pid_all, 1, 0, 0}, {"pid", 'p', POPT_ARG_INT, &opt_pid, 0, 0, 0}, + {"list-options", 0, POPT_ARG_NONE, 0, OPT_LISTOPTS, 0, 0}, {0, 0, 0, 0, 0, 0, 0} }; @@ -72,6 +74,8 @@ static void usage(FILE *ofp) fprintf(ofp, " -u, --userspace [CMD] Apply for the user-space tracer\n"); fprintf(ofp, " --all If -u, apply on all traceable apps\n"); fprintf(ofp, " -p, --pid PID If -u, apply on a specific PID\n"); + fprintf(ofp, " --list-options Prints a simple list of options specific to\n"); + fprintf(ofp, " disable-event\n"); fprintf(ofp, "\n"); } @@ -181,6 +185,10 @@ int cmd_disable_events(int argc, const char **argv) opt_userspace = 1; opt_cmd_name = poptGetOptArg(pc); break; + case OPT_LISTOPTS: + list_cmd_options(stdout, long_options); + ret = CMD_SUCCESS; + goto end; default: usage(stderr); ret = CMD_UNDEFINED; diff --git a/lttng/commands/enable_channels.c b/lttng/commands/enable_channels.c index efd075b..1abf71c 100644 --- a/lttng/commands/enable_channels.c +++ b/lttng/commands/enable_channels.c @@ -48,6 +48,7 @@ enum { OPT_SWITCH_TIMER, OPT_READ_TIMER, OPT_USERSPACE, + OPT_LISTOPTS, }; static struct poptOption long_options[] = { @@ -64,6 +65,7 @@ static struct poptOption long_options[] = { {"num_subbuf", 0, POPT_ARG_INT, 0, OPT_NUM_SUBBUF, 0, 0}, {"switch_timer", 0, POPT_ARG_INT, 0, OPT_SWITCH_TIMER, 0, 0}, {"read_timer", 0, POPT_ARG_INT, 0, OPT_READ_TIMER, 0, 0}, + {"list-options", 0, POPT_ARG_NONE, 0, OPT_LISTOPTS, 0, 0}, {0, 0, 0, 0, 0, 0, 0} }; @@ -80,6 +82,8 @@ static void usage(FILE *ofp) fprintf(ofp, " -u, --userspace [CMD] Apply on the user-space tracer\n"); fprintf(ofp, " --all If -u, apply on all traceable apps\n"); fprintf(ofp, " -p, --pid PID If -u, apply on a specific PID\n"); + fprintf(ofp, " --list-options Prints a simple list of options specific to\n"); + fprintf(ofp, " enable-channel\n"); fprintf(ofp, "\n"); fprintf(ofp, "Channel options:\n"); fprintf(ofp, " --discard Discard event when buffers are full (default)\n"); @@ -212,6 +216,10 @@ int cmd_enable_channels(int argc, const char **argv) chan.attr.read_timer_interval = atoi(poptGetOptArg(pc)); DBG("Channel read timer interval set to %d", chan.attr.read_timer_interval); break; + case OPT_LISTOPTS: + list_cmd_options(stdout, long_options); + ret = CMD_SUCCESS; + goto end; default: usage(stderr); ret = CMD_UNDEFINED; diff --git a/lttng/commands/enable_events.c b/lttng/commands/enable_events.c index b99b7f4..8ef57b0 100644 --- a/lttng/commands/enable_events.c +++ b/lttng/commands/enable_events.c @@ -53,6 +53,7 @@ enum { OPT_PROBE, OPT_FUNCTION, OPT_FUNCTION_ENTRY, + OPT_LISTOPTS, }; static struct poptOption long_options[] = { @@ -67,9 +68,10 @@ static struct poptOption long_options[] = { {"pid", 'p', POPT_ARG_INT, &opt_pid, 0, 0, 0}, {"tracepoint", 0, POPT_ARG_NONE, 0, OPT_TRACEPOINT, 0, 0}, {"marker", 0, POPT_ARG_NONE, 0, OPT_MARKER, 0, 0}, - {"probe", 0, POPT_ARG_STRING, 0, OPT_PROBE, 0, 0}, + {"probe", 0, POPT_ARG_STRING, 0, OPT_PROBE, 0, 0}, {"function", 0, POPT_ARG_STRING, 0, OPT_FUNCTION, 0, 0}, {"function:entry", 0, POPT_ARG_STRING, 0, OPT_FUNCTION_ENTRY, 0, 0}, + {"list-options", 0, POPT_ARG_NONE, 0, OPT_LISTOPTS, 0, 0}, {0, 0, 0, 0, 0, 0, 0} }; @@ -88,6 +90,8 @@ static void usage(FILE *ofp) fprintf(ofp, " -u, --userspace [CMD] Apply for the user-space tracer\n"); fprintf(ofp, " --all If -u, apply on all traceable apps\n"); fprintf(ofp, " -p, --pid PID If -u, apply on a specific PID\n"); + fprintf(ofp, " --list-options Prints a simple list of options specific to\n"); + fprintf(ofp, " enable-event\n"); fprintf(ofp, "\n"); fprintf(ofp, "Event options:\n"); fprintf(ofp, " --tracepoint Tracepoint event (default)\n"); @@ -334,6 +338,10 @@ int cmd_enable_events(int argc, const char **argv) opt_event_type = LTTNG_EVENT_FUNCTION_ENTRY; opt_function_entry_symbol = poptGetOptArg(pc); break; + case OPT_LISTOPTS: + list_cmd_options(stdout, long_options); + ret = CMD_SUCCESS; + goto end; default: usage(stderr); ret = CMD_UNDEFINED; diff --git a/lttng/commands/list.c b/lttng/commands/list.c index 3c779c3..ff8599b 100644 --- a/lttng/commands/list.c +++ b/lttng/commands/list.c @@ -24,6 +24,7 @@ #include <string.h> #include "../cmd.h" +#include "../utils.h" static int opt_pid; static int opt_userspace; @@ -37,16 +38,18 @@ const char *indent8 = " "; enum { OPT_HELP = 1, + OPT_LISTOPTS, }; static struct poptOption long_options[] = { /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */ - {"help", 'h', POPT_ARG_NONE, 0, OPT_HELP, 0, 0}, - {"kernel", 'k', POPT_ARG_VAL, &opt_kernel, 1, 0, 0}, - {"userspace", 'u', POPT_ARG_VAL, &opt_userspace, 1, 0, 0}, - {"pid", 'p', POPT_ARG_INT, &opt_pid, 0, 0, 0}, - {"channel", 'c', POPT_ARG_STRING, &opt_channel, 0, 0, 0}, - {"domain", 'd', POPT_ARG_VAL, &opt_domain, 1, 0, 0}, + {"help", 'h', POPT_ARG_NONE, 0, OPT_HELP, 0, 0}, + {"kernel", 'k', POPT_ARG_VAL, &opt_kernel, 1, 0, 0}, + {"userspace", 'u', POPT_ARG_VAL, &opt_userspace, 1, 0, 0}, + {"pid", 'p', POPT_ARG_INT, &opt_pid, 0, 0, 0}, + {"channel", 'c', POPT_ARG_STRING, &opt_channel, 0, 0, 0}, + {"domain", 'd', POPT_ARG_VAL, &opt_domain, 1, 0, 0}, + {"list-options", 0, POPT_ARG_NONE, 0, OPT_LISTOPTS, 0, 0}, {0, 0, 0, 0, 0, 0, 0} }; @@ -66,6 +69,7 @@ static void usage(FILE *ofp) fprintf(ofp, " -k, --kernel Select kernel domain\n"); fprintf(ofp, " -u, --userspace Select user-space domain.\n"); fprintf(ofp, " -p, --pid PID List user-space events by PID\n"); + fprintf(ofp, " --list-options Prints a simple list of options specific to list\n"); fprintf(ofp, "\n"); fprintf(ofp, "Options:\n"); fprintf(ofp, " -c, --channel NAME List details of a channel\n"); @@ -391,6 +395,10 @@ int cmd_list(int argc, const char **argv) case OPT_HELP: usage(stderr); goto end; + case OPT_LISTOPTS: + list_cmd_options(stdout, long_options); + ret = CMD_SUCCESS; + goto end; default: usage(stderr); ret = CMD_UNDEFINED; diff --git a/lttng/commands/set_session.c b/lttng/commands/set_session.c index 8a76403..e53d14d 100644 --- a/lttng/commands/set_session.c +++ b/lttng/commands/set_session.c @@ -33,11 +33,13 @@ static char *opt_session_name; enum { OPT_HELP = 1, + OPT_LISTOPTS, }; static struct poptOption long_options[] = { /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */ {"help", 'h', POPT_ARG_NONE, 0, OPT_HELP, 0, 0}, + {"list-options", 0, POPT_ARG_NONE, 0, OPT_LISTOPTS, 0, 0}, {0, 0, 0, 0, 0, 0, 0} }; @@ -50,6 +52,8 @@ static void usage(FILE *ofp) fprintf(ofp, "\n"); fprintf(ofp, "Options:\n"); fprintf(ofp, " -h, --help Show this help\n"); + fprintf(ofp, " --list-options Prints a simple list of options specific to\n"); + fprintf(ofp, " set-session\n"); fprintf(ofp, "\n"); } @@ -91,6 +95,10 @@ int cmd_set_session(int argc, const char **argv) usage(stderr); ret = CMD_SUCCESS; goto end; + case OPT_LISTOPTS: + list_cmd_options(stdout, long_options); + ret = CMD_SUCCESS; + goto end; default: usage(stderr); ret = CMD_UNDEFINED; diff --git a/lttng/commands/start.c b/lttng/commands/start.c index 2eacc46..7719f0b 100644 --- a/lttng/commands/start.c +++ b/lttng/commands/start.c @@ -33,11 +33,13 @@ static char *opt_session_name; enum { OPT_HELP = 1, + OPT_LISTOPTS, }; static struct poptOption long_options[] = { /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */ - {"help", 'h', POPT_ARG_NONE, 0, OPT_HELP, 0, 0}, + {"help", 'h', POPT_ARG_NONE, 0, OPT_HELP, 0, 0}, + {"list-options", 0, POPT_ARG_NONE, 0, OPT_LISTOPTS, 0, 0}, {0, 0, 0, 0, 0, 0, 0} }; @@ -52,6 +54,7 @@ static void usage(FILE *ofp) fprintf(ofp, "get it from the configuration directory (.lttng).\n"); fprintf(ofp, "\n"); fprintf(ofp, " -h, --help Show this help\n"); + fprintf(ofp, " --list-options Prints a simple list of options specific to start\n"); fprintf(ofp, "\n"); } @@ -111,6 +114,10 @@ int cmd_start(int argc, const char **argv) usage(stderr); ret = CMD_SUCCESS; goto end; + case OPT_LISTOPTS: + list_cmd_options(stdout, long_options); + ret = CMD_SUCCESS; + goto end; default: usage(stderr); ret = CMD_UNDEFINED; diff --git a/lttng/commands/stop.c b/lttng/commands/stop.c index 87862b4..6f8c782 100644 --- a/lttng/commands/stop.c +++ b/lttng/commands/stop.c @@ -33,11 +33,13 @@ static char *opt_session_name; enum { OPT_HELP = 1, + OPT_LISTOPTS, }; static struct poptOption long_options[] = { /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */ - {"help", 'h', POPT_ARG_NONE, 0, OPT_HELP, 0, 0}, + {"help", 'h', POPT_ARG_NONE, 0, OPT_HELP, 0, 0}, + {"list-options", 0, POPT_ARG_NONE, 0, OPT_LISTOPTS, 0, 0}, {0, 0, 0, 0, 0, 0, 0} }; @@ -52,6 +54,7 @@ static void usage(FILE *ofp) fprintf(ofp, "get it from the configuration directory (.lttng).\n"); fprintf(ofp, "\n"); fprintf(ofp, " -h, --help Show this help\n"); + fprintf(ofp, " --list-options Prints a simple list of options specific to stop\n"); fprintf(ofp, "\n"); } @@ -109,6 +112,10 @@ int cmd_stop(int argc, const char **argv) usage(stderr); ret = CMD_SUCCESS; goto end; + case OPT_LISTOPTS: + list_cmd_options(stdout, long_options); + ret = CMD_SUCCESS; + goto end; default: usage(stderr); ret = CMD_UNDEFINED; diff --git a/lttng/commands/version.c b/lttng/commands/version.c index 7b88523..2c68181 100644 --- a/lttng/commands/version.c +++ b/lttng/commands/version.c @@ -26,14 +26,17 @@ #include <unistd.h> #include "../cmd.h" +#include "../utils.h" enum { OPT_HELP = 1, + OPT_LISTOPTS, }; static struct poptOption long_options[] = { /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */ - {"help", 'h', POPT_ARG_NONE, 0, OPT_HELP, 0, 0}, + {"help", 'h', POPT_ARG_NONE, 0, OPT_HELP, 0, 0}, + {"list-options", 0, POPT_ARG_NONE, 0, OPT_LISTOPTS, 0, 0}, {0, 0, 0, 0, 0, 0, 0} }; @@ -45,6 +48,7 @@ static void usage(FILE *ofp) fprintf(ofp, "usage: lttng version\n"); fprintf(ofp, "\n"); fprintf(ofp, " -h, --help Show this help\n"); + fprintf(ofp, " --list-options Prints a simple list of options specific to version\n"); fprintf(ofp, "\n"); } @@ -65,6 +69,10 @@ int cmd_version(int argc, const char **argv) usage(stderr); ret = CMD_SUCCESS; goto end; + case OPT_LISTOPTS: + list_cmd_options(stdout, long_options); + ret = CMD_SUCCESS; + goto end; default: usage(stderr); ret = CMD_UNDEFINED; diff --git a/lttng/utils.c b/lttng/utils.c index ee0e297..4c4f72c 100644 --- a/lttng/utils.c +++ b/lttng/utils.c @@ -17,9 +17,11 @@ */ #include <stdlib.h> +#include <ctype.h> #include <lttng/lttng.h> +#include "utils.h" #include "conf.h" /* @@ -77,3 +79,28 @@ int set_session_name(char *name) error: return ret; } + +/* + * list_cmd_options + * + * Prints a simple list of the options available to a command. This is intended + * to be easily parsed for bash completion. + */ +void list_cmd_options(FILE *ofp, struct poptOption *options) +{ + int i = 0; + struct poptOption *option = NULL; + + option = &options[i]; + while (option->longName != NULL) { + fprintf(ofp, "--%s\n", option->longName); + + if (isprint(option->shortName)) { + fprintf(ofp, "-%c\n", option->shortName); + } + + i++; + option = &options[i]; + } +} + diff --git a/lttng/utils.h b/lttng/utils.h index 5492d5e..e609b70 100644 --- a/lttng/utils.h +++ b/lttng/utils.h @@ -19,8 +19,11 @@ #ifndef _LTTNG_UTILS_H #define _LTTNG_UTILS_H +#include <popt.h> + char *get_config_file_path(void); char *get_session_name(void); int set_session_name(char *name); +void list_cmd_options(FILE *ofp, struct poptOption *options); #endif /* _LTTNG_UTILS_H */ -- 1.7.4.1 _______________________________________________ ltt-dev mailing list [email protected] http://lists.casi.polymtl.ca/cgi-bin/mailman/listinfo/ltt-dev
