diff options
author | Ian Campbell <ian.campbell@citrix.com> | 2010-08-24 18:30:07 +0100 |
---|---|---|
committer | Ian Campbell <ian.campbell@citrix.com> | 2010-08-24 18:30:07 +0100 |
commit | e7ebcafdbf8cf285f00ea9e83e827fb1370c3497 (patch) | |
tree | 6d5f64ba34691940fceab9b98ec8a351ddb44853 /tools | |
parent | 763cad85585b22925912f38f94ed89e18e115920 (diff) | |
download | xen-e7ebcafdbf8cf285f00ea9e83e827fb1370c3497.tar.gz xen-e7ebcafdbf8cf285f00ea9e83e827fb1370c3497.tar.bz2 xen-e7ebcafdbf8cf285f00ea9e83e827fb1370c3497.zip |
xl: treat sub-command main function like a regular C main() function
Currently xl passes the entire argc+argv to each subcommand and relies
on the preservation of the global optind variable to ensure that the
subcommand correctly handles argument parsing (e.g. accounting for "xl
[command]" vs "xl -v [command]").
This requirement for individual sub-commands to parse arguments
relative to optind is subtle and prone to being forgotten (or simply
not expected). Several sub-commands have recently been broken in this
way (now fixed).
Therefore arrange that the argv+argc passed to the sub-commands looks
like you would expect for a regular C main function and includes
argv[0] equal to the command name with command specific arguments in
argv[1] onwards.
Since all sub-commands (currently) correctly obey the optind it is
sufficient to reset it to 1 (as described in getopt(3)) in order to
not break the sub-commands' own argument parsing.
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/libxl/xl.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/tools/libxl/xl.c b/tools/libxl/xl.c index a7f0d2d748..29694e133c 100644 --- a/tools/libxl/xl.c +++ b/tools/libxl/xl.c @@ -53,7 +53,7 @@ int main(int argc, char **argv) } } - cmd = argv[optind++]; + cmd = argv[optind]; if (!cmd) { help(NULL); @@ -69,13 +69,18 @@ int main(int argc, char **argv) exit(1); } + /* Reset options for per-command use of getopt. */ + argv += optind; + argc -= optind; + optind = 1; + srand(time(0)); cspec = cmdtable_lookup(cmd); if (cspec) ret = cspec->cmd_impl(argc, argv); else if (!strcmp(cmd, "help")) { - help(argv[optind]); + help(argv[1]); ret = 0; } else { fprintf(stderr, "command not implemented\n"); |