]> xenbits.xensource.com Git - xen.git/commitdiff
xl: treat sub-command main function like a regular C main() function
authorIan Campbell <ian.campbell@citrix.com>
Tue, 24 Aug 2010 17:30:07 +0000 (18:30 +0100)
committerIan Campbell <ian.campbell@citrix.com>
Tue, 24 Aug 2010 17:30:07 +0000 (18:30 +0100)
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>
tools/libxl/xl.c

index a7f0d2d7486535e321262de24cd24980d5c145ed..29694e133cda92fb9263809cfe4028355d2fba06 100644 (file)
@@ -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");