Skip to content

Commit

Permalink
command-line: Add function to print all options.
Browse files Browse the repository at this point in the history
This commit adds a function that prints (both long and short)
options of a ovs-* command.  To use this function, option
'--option' is added to ovs-appctl/dpctl/ofctl and ovsdb-tool
commands.  A future patch will use the option output to
conduct bash command-line completion.

Signed-off-by: Alex Wang <[email protected]>
Acked-by: Ben Pfaff <[email protected]>
  • Loading branch information
yew011 committed Oct 29, 2014
1 parent ee4dac3 commit 66fa2c8
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 1 deletion.
21 changes: 21 additions & 0 deletions lib/command-line.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include <getopt.h>
#include <limits.h>
#include <stdlib.h>
#include "dynamic-string.h"
#include "ovs-thread.h"
#include "util.h"
#include "vlog.h"
Expand Down Expand Up @@ -51,6 +52,26 @@ long_options_to_short_options(const struct option options[])
return xstrdup(short_options);
}

/* Given the GNU-style options in 'options', prints all options. */
void
print_options(const struct option options[])
{
struct ds ds = DS_EMPTY_INITIALIZER;

for (; options->name; options++) {
const struct option *o = options;
const char *arg = o->has_arg == required_argument ? "ARG" : "[ARG]";

ds_put_format(&ds, "--%s%s%s\n", o->name, o->has_arg ? "=" : "",
o->has_arg ? arg : "");
if (o->flag == NULL && o->val > 0 && o->val <= UCHAR_MAX) {
ds_put_format(&ds, "-%c %s\n", o->val, o->has_arg ? arg : "");
}
}
printf("%s", ds.string);
ds_destroy(&ds);
}

/* Runs the command designated by argv[0] within the command table specified by
* 'commands', which must be terminated by a command whose 'name' member is a
* null pointer.
Expand Down
1 change: 1 addition & 0 deletions lib/command-line.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ struct command {
};

char *long_options_to_short_options(const struct option *options);
void print_options(const struct option *options);
void run_command(int argc, char *argv[], const struct command[]);

void proctitle_init(int argc, char **argv);
Expand Down
5 changes: 5 additions & 0 deletions ovsdb/ovsdb-tool.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ parse_options(int argc, char *argv[])
{"more", no_argument, NULL, 'm'},
{"verbose", optional_argument, NULL, 'v'},
{"help", no_argument, NULL, 'h'},
{"option", no_argument, NULL, 'o'},
{"version", no_argument, NULL, 'V'},
{NULL, 0, NULL, 0},
};
Expand All @@ -90,6 +91,10 @@ parse_options(int argc, char *argv[])
case 'h':
usage();

case 'o':
print_options(long_options);
exit(EXIT_SUCCESS);

case 'V':
ovs_print_version(0, 0);
exit(EXIT_SUCCESS);
Expand Down
6 changes: 6 additions & 0 deletions utilities/ovs-appctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -110,12 +110,14 @@ static const char *
parse_command_line(int argc, char *argv[])
{
enum {
OPT_START = UCHAR_MAX + 1,
VLOG_OPTION_ENUMS
};
static const struct option long_options[] = {
{"target", required_argument, NULL, 't'},
{"execute", no_argument, NULL, 'e'},
{"help", no_argument, NULL, 'h'},
{"option", no_argument, NULL, 'o'},
{"version", no_argument, NULL, 'V'},
{"timeout", required_argument, NULL, 'T'},
VLOG_LONG_OPTIONS,
Expand Down Expand Up @@ -157,6 +159,10 @@ parse_command_line(int argc, char *argv[])
usage();
break;

case 'o':
print_options(long_options);
exit(EXIT_SUCCESS);

case 'T':
time_alarm(atoi(optarg));
break;
Expand Down
6 changes: 5 additions & 1 deletion utilities/ovs-dpctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ parse_options(int argc, char *argv[])
{"more", no_argument, NULL, 'm'},
{"timeout", required_argument, NULL, 't'},
{"help", no_argument, NULL, 'h'},
{"option", no_argument, NULL, 'o'},
{"version", no_argument, NULL, 'V'},
VLOG_LONG_OPTIONS,
{NULL, 0, NULL, 0},
Expand Down Expand Up @@ -130,6 +131,10 @@ parse_options(int argc, char *argv[])
case 'h':
usage(NULL);

case 'o':
print_options(long_options);
exit(EXIT_SUCCESS);

case 'V':
ovs_print_version(0, 0);
exit(EXIT_SUCCESS);
Expand Down Expand Up @@ -184,4 +189,3 @@ usage(void *userdata OVS_UNUSED)
" -V, --version display version information\n");
exit(EXIT_SUCCESS);
}

5 changes: 5 additions & 0 deletions utilities/ovs-ofctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ parse_options(int argc, char *argv[])
{"rsort", optional_argument, NULL, OPT_RSORT},
{"unixctl", required_argument, NULL, OPT_UNIXCTL},
{"help", no_argument, NULL, 'h'},
{"option", no_argument, NULL, 'o'},
DAEMON_LONG_OPTIONS,
OFP_VERSION_LONG_OPTIONS,
VLOG_LONG_OPTIONS,
Expand Down Expand Up @@ -240,6 +241,10 @@ parse_options(int argc, char *argv[])
case 'h':
usage();

case 'o':
print_options(long_options);
exit(EXIT_SUCCESS);

case OPT_STRICT:
strict = true;
break;
Expand Down

0 comments on commit 66fa2c8

Please sign in to comment.