From: Ian Campbell Date: Tue, 24 Aug 2010 17:30:07 +0000 (+0100) Subject: xl: treat sub-command main function like a regular C main() function X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~11574 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=e7ebcafdbf8cf285f00ea9e83e827fb1370c3497;p=xen.git 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 Signed-off-by: Ian Jackson --- 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");