aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libxl/xl.c
diff options
context:
space:
mode:
authorIan Campbell <ian.campbell@citrix.com>2010-08-24 18:30:07 +0100
committerIan Campbell <ian.campbell@citrix.com>2010-08-24 18:30:07 +0100
commite7ebcafdbf8cf285f00ea9e83e827fb1370c3497 (patch)
tree6d5f64ba34691940fceab9b98ec8a351ddb44853 /tools/libxl/xl.c
parent763cad85585b22925912f38f94ed89e18e115920 (diff)
downloadxen-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/libxl/xl.c')
-rw-r--r--tools/libxl/xl.c9
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");