This is a repost of the last two patches of "xl shutdown compatibility with xm" which were actually helpers for xl option parsing. I''ve addressed Ian J''s review comments on the second patch and rebased. I''ve added a third patch which makes the macro handle the 0 and 2 cases internally. In this new series this now exits directly instead of returning.
Ian Campbell
2013-Jan-03 11:39 UTC
[PATCH 1 of 3 V4] xl: allow def_getopt to handle long options
# HG changeset patch # User Ian Campbell <ijc@hellion.org.uk> # Date 1357211018 0 # Node ID a229cbca375a438829955b993bde259602371714 # Parent 37fa76723566bd0a180e436a9c6fee3451b6e5ab xl: allow def_getopt to handle long options Improves consistency of option parsing and error handling. Consistently support --help for all options. Many users of getopt_long were needlessly passing an option_index pointer which was not used. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Acked-by: Ian Jackson <ian.jackson@eu.citrix.com> diff -r 37fa76723566 -r a229cbca375a tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Thu Jan 03 11:03:37 2013 +0000 +++ b/tools/libxl/xl_cmdimpl.c Thu Jan 03 11:03:38 2013 +0000 @@ -2324,19 +2324,34 @@ static int64_t parse_mem_size_kb(const c return kbytes; } -static int def_getopt(int argc, char * const argv[], const char *optstring, +#define COMMON_LONG_OPTS {"help", 0, 0, ''h''} + +static int def_getopt(int argc, char * const argv[], + const char *optstring, + const struct option *longopts, const char* helpstr, int reqargs) { int opt; + const struct option def_options[] = { + COMMON_LONG_OPTS, + {0, 0, 0, 0} + }; + + if (!longopts) + longopts = def_options; opterr = 0; - while ((opt = getopt(argc, argv, optstring)) == ''?'') { + while ((opt = getopt_long(argc, argv, optstring, longopts, NULL)) == ''?'') { if (optopt == ''h'') { help(helpstr); return 0; } fprintf(stderr, "option `%c'' not supported.\n", optopt); } + if (opt == ''h'') { + help(helpstr); + return 0; + } if (opt != -1) return opt; @@ -2372,7 +2387,7 @@ int main_memmax(int argc, char **argv) char *mem; int rc; - if ((opt = def_getopt(argc, argv, "", "mem-max", 2)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "mem-max", 2)) != -1) return opt; domid = find_domain(argv[optind]); @@ -2406,7 +2421,7 @@ int main_memset(int argc, char **argv) int opt = 0; const char *mem; - if ((opt = def_getopt(argc, argv, "", "mem-set", 2)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "mem-set", 2)) != -1) return opt; domid = find_domain(argv[optind]); @@ -2445,7 +2460,7 @@ int main_cd_eject(int argc, char **argv) int opt = 0; const char *virtdev; - if ((opt = def_getopt(argc, argv, "", "cd-eject", 2)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "cd-eject", 2)) != -1) return opt; domid = find_domain(argv[optind]); @@ -2462,7 +2477,7 @@ int main_cd_insert(int argc, char **argv const char *virtdev; char *file = NULL; /* modified by cd_insert tokenising it */ - if ((opt = def_getopt(argc, argv, "", "cd-insert", 3)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "cd-insert", 3)) != -1) return opt; domid = find_domain(argv[optind]); @@ -2479,7 +2494,7 @@ int main_console(int argc, char **argv) int opt = 0, num = 0; libxl_console_type type = 0; - while ((opt = def_getopt(argc, argv, "n:t:", "console", 1)) != -1) { + while ((opt = def_getopt(argc, argv, "n:t:", NULL, "console", 1)) != -1) { switch (opt) { case 0: case 2: return opt; @@ -2510,36 +2525,23 @@ int main_console(int argc, char **argv) int main_vncviewer(int argc, char **argv) { - static const struct option long_options[] = { + static const struct option opts[] = { {"autopass", 0, 0, ''a''}, {"vncviewer-autopass", 0, 0, ''a''}, - {"help", 0, 0, ''h''}, + COMMON_LONG_OPTS, {0, 0, 0, 0} }; uint32_t domid; int opt, autopass = 0; - while (1) { - opt = getopt_long(argc, argv, "ah", long_options, NULL); - if (opt == -1) - break; - + while ((opt = def_getopt(argc, argv, "ah", opts, "vncviewer", 1)) != -1) { switch (opt) { + case 0: case 2: + return opt; case ''a'': autopass = 1; break; - case ''h'': - help("vncviewer"); - return 0; - default: - fprintf(stderr, "option `%c'' not supported.\n", optopt); - break; - } - } - - if (argc - optind != 1) { - help("vncviewer"); - return 2; + } } domid = find_domain(argv[optind]); @@ -2572,7 +2574,7 @@ int main_pcilist(int argc, char **argv) uint32_t domid; int opt; - if ((opt = def_getopt(argc, argv, "", "pci-list", 1)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "pci-list", 1)) != -1) return opt; domid = find_domain(argv[optind]); @@ -2611,7 +2613,7 @@ int main_pcidetach(int argc, char **argv int force = 0; const char *bdf = NULL; - while ((opt = def_getopt(argc, argv, "f", "pci-detach", 2)) != -1) { + while ((opt = def_getopt(argc, argv, "f", NULL, "pci-detach", 2)) != -1) { switch (opt) { case 0: case 2: return opt; @@ -2653,7 +2655,7 @@ int main_pciattach(int argc, char **argv int opt; const char *bdf = NULL, *vs = NULL; - if ((opt = def_getopt(argc, argv, "", "pci-attach", 2)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "pci-attach", 2)) != -1) return opt; domid = find_domain(argv[optind]); @@ -2687,7 +2689,7 @@ int main_pciassignable_list(int argc, ch { int opt; - if ((opt = def_getopt(argc, argv, "", "pci-assignable-list", 0)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "pci-assignable-list", 0)) != -1) return opt; pciassignable_list(); @@ -2719,7 +2721,7 @@ int main_pciassignable_add(int argc, cha int opt; const char *bdf = NULL; - while ((opt = def_getopt(argc, argv, "", "pci-assignable-add", 1)) != -1) { + while ((opt = def_getopt(argc, argv, "", NULL, "pci-assignable-add", 1)) != -1) { switch (opt) { case 0: case 2: return opt; @@ -2758,7 +2760,7 @@ int main_pciassignable_remove(int argc, const char *bdf = NULL; int rebind = 0; - while ((opt = def_getopt(argc, argv, "r", "pci-assignable-remove", 1)) != -1) { + while ((opt = def_getopt(argc, argv, "r", NULL, "pci-assignable-remove", 1)) != -1) { switch (opt) { case 0: case 2: return opt; @@ -3569,24 +3571,18 @@ int main_restore(int argc, char **argv) int paused = 0, debug = 0, daemonize = 1, monitor = 1, console_autoconnect = 0, vnc = 0, vncautopass = 0; int opt, rc; - int option_index = 0; - static struct option long_options[] = { + static struct option opts[] = { {"vncviewer", 0, 0, ''V''}, {"vncviewer-autopass", 0, 0, ''A''}, + COMMON_LONG_OPTS, {0, 0, 0, 0} }; - while (1) { - opt = getopt_long(argc, argv, "FhcpdeVA", long_options, &option_index); - if (opt == -1) - break; - + while ((opt = def_getopt(argc, argv, "FhcpdeVA", + opts, "restore", 1)) != -1) { switch (opt) { case 0: case 2: return opt; - case ''h'': - help("restore"); - return 2; case ''c'': console_autoconnect = 1; break; @@ -3646,7 +3642,7 @@ int main_migrate_receive(int argc, char int debug = 0, daemonize = 1, monitor = 1, remus = 0; int opt; - while ((opt = def_getopt(argc, argv, "Fedr", "migrate-receive", 0)) != -1) { + while ((opt = def_getopt(argc, argv, "Fedr", NULL, "migrate-receive", 0)) != -1) { switch (opt) { case 0: case 2: return opt; @@ -3685,7 +3681,7 @@ int main_save(int argc, char **argv) int checkpoint = 0; int opt; - while ((opt = def_getopt(argc, argv, "c", "save", 2)) != -1) { + while ((opt = def_getopt(argc, argv, "c", NULL, "save", 2)) != -1) { switch (opt) { case 0: case 2: return opt; @@ -3718,7 +3714,7 @@ int main_migrate(int argc, char **argv) char *host; int opt, daemonize = 1, monitor = 1, debug = 0; - while ((opt = def_getopt(argc, argv, "FC:s:ed", "migrate", 2)) != -1) { + while ((opt = def_getopt(argc, argv, "FC:s:ed", NULL, "migrate", 2)) != -1) { switch (opt) { case 0: case 2: return opt; @@ -3762,7 +3758,7 @@ int main_dump_core(int argc, char **argv { int opt; - if ((opt = def_getopt(argc, argv, "", "dump-core", 2)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "dump-core", 2)) != -1) return opt; core_dump_domain(find_domain(argv[optind]), argv[optind + 1]); @@ -3773,7 +3769,7 @@ int main_pause(int argc, char **argv) { int opt; - if ((opt = def_getopt(argc, argv, "", "pause", 1)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "pause", 1)) != -1) return opt; pause_domain(find_domain(argv[optind])); @@ -3785,7 +3781,7 @@ int main_unpause(int argc, char **argv) { int opt; - if ((opt = def_getopt(argc, argv, "", "unpause", 1)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "unpause", 1)) != -1) return opt; unpause_domain(find_domain(argv[optind])); @@ -3797,7 +3793,7 @@ int main_destroy(int argc, char **argv) { int opt; - if ((opt = def_getopt(argc, argv, "", "destroy", 1)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "destroy", 1)) != -1) return opt; destroy_domain(find_domain(argv[optind])); @@ -3806,19 +3802,21 @@ int main_destroy(int argc, char **argv) static int main_shutdown_or_reboot(int do_reboot, int argc, char **argv) { + const char *what = do_reboot ? "reboot" : "shutdown"; void (*fn)(uint32_t domid, libxl_evgen_domain_death **, libxl_ev_user, int) do_reboot ? &reboot_domain : &shutdown_domain; int opt, i, nb_domain; int wait_for_it = 0, all =0; int fallback_trigger = 0; - static struct option long_options[] = { + static struct option opts[] = { {"all", 0, 0, ''a''}, {"wait", 0, 0, ''w''}, + COMMON_LONG_OPTS, {0, 0, 0, 0} }; - while ((opt = getopt_long(argc, argv, "awF", long_options, NULL)) != -1) { + while ((opt = def_getopt(argc, argv, "awF", opts, what, 0)) != -1) { switch (opt) { case 0: case 2: return opt; @@ -3890,12 +3888,11 @@ int main_list(int argc, char **argv) int opt, verbose = 0; int context = 0; int details = 0; - int option_index = 0; - static struct option long_options[] = { + static struct option opts[] = { {"long", 0, 0, ''l''}, - {"help", 0, 0, ''h''}, {"verbose", 0, 0, ''v''}, {"context", 0, 0, ''Z''}, + COMMON_LONG_OPTS, {0, 0, 0, 0} }; @@ -3903,12 +3900,10 @@ int main_list(int argc, char **argv) libxl_dominfo *info, *info_free=0; int nb_domain, rc; - while (1) { - opt = getopt_long(argc, argv, "lvhZ", long_options, &option_index); - if (opt == -1) - break; - + while ((opt = def_getopt(argc, argv, "lvhZ", opts, "list", 0)) != -1) { switch (opt) { + case 0: case 2: + return opt; case ''l'': details = 1; break; @@ -3921,9 +3916,6 @@ int main_list(int argc, char **argv) case ''Z'': context = 1; break; - default: - fprintf(stderr, "option `%c'' not supported.\n", optopt); - break; } } @@ -3970,7 +3962,7 @@ int main_vm_list(int argc, char **argv) { int opt; - if ((opt = def_getopt(argc, argv, "", "vm-list", 0)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "vm-list", 0)) != -1) return opt; list_vm(); @@ -3986,14 +3978,13 @@ int main_create(int argc, char **argv) int paused = 0, debug = 0, daemonize = 1, console_autoconnect = 0, quiet = 0, monitor = 1, vnc = 0, vncautopass = 0; int opt, rc; - int option_index = 0; - static struct option long_options[] = { + static struct option opts[] = { {"dryrun", 0, 0, ''n''}, {"quiet", 0, 0, ''q''}, - {"help", 0, 0, ''h''}, {"defconfig", 1, 0, ''f''}, {"vncviewer", 0, 0, ''V''}, {"vncviewer-autopass", 0, 0, ''A''}, + COMMON_LONG_OPTS, {0, 0, 0, 0} }; @@ -4002,12 +3993,10 @@ int main_create(int argc, char **argv) argc--; argv++; } - while (1) { - opt = getopt_long(argc, argv, "Fhnqf:pcdeVA", long_options, &option_index); - if (opt == -1) - break; - + while ((opt = def_getopt(argc, argv, "Fhnqf:pcdeVA", opts, "create", 0)) != -1) { switch (opt) { + case 0: case 2: + return opt; case ''f'': filename = optarg; break; @@ -4042,9 +4031,6 @@ int main_create(int argc, char **argv) case ''A'': vnc = vncautopass = 1; break; - default: - fprintf(stderr, "option `%c'' not supported.\n", optopt); - break; } } @@ -4092,11 +4078,10 @@ int main_config_update(int argc, char ** int config_len = 0; libxl_domain_config d_config; int opt, rc; - int option_index = 0; int debug = 0; - static struct option long_options[] = { - {"help", 0, 0, ''h''}, + static struct option opts[] = { {"defconfig", 1, 0, ''f''}, + COMMON_LONG_OPTS, {0, 0, 0, 0} }; @@ -4114,24 +4099,16 @@ int main_config_update(int argc, char ** argc--; argv++; } - while (1) { - opt = getopt_long(argc, argv, "dhqf:", long_options, &option_index); - if (opt == -1) - break; - + while ((opt = def_getopt(argc, argv, "dhqf:", opts, "config_update", 0)) != -1) { switch (opt) { + case 0: case 2: + return opt; case ''d'': debug = 1; break; case ''f'': filename = optarg; break; - case ''h'': - help("create"); - return 0; - default: - fprintf(stderr, "option `%c'' not supported.\n", optopt); - break; } } @@ -4220,7 +4197,7 @@ int main_button_press(int argc, char **a fprintf(stderr, "WARNING: \"button-press\" is deprecated. " "Please use \"trigger\"\n"); - if ((opt = def_getopt(argc, argv, "", "button-press", 2)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "button-press", 2)) != -1) return opt; button_press(find_domain(argv[optind]), argv[optind + 1]); @@ -4361,7 +4338,7 @@ int main_vcpulist(int argc, char **argv) { int opt; - if ((opt = def_getopt(argc, argv, "", "cpu-list", 0)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "cpu-list", 0)) != -1) return opt; vcpulist(argc - optind, argv + optind); @@ -4422,7 +4399,7 @@ int main_vcpupin(int argc, char **argv) { int opt; - if ((opt = def_getopt(argc, argv, "", "vcpu-pin", 3)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "vcpu-pin", 3)) != -1) return opt; vcpupin(find_domain(argv[optind]), argv[optind+1] , argv[optind+2]); @@ -4458,7 +4435,7 @@ int main_vcpuset(int argc, char **argv) { int opt; - if ((opt = def_getopt(argc, argv, "", "vcpu-set", 2)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "vcpu-set", 2)) != -1) return opt; vcpuset(find_domain(argv[optind]), argv[optind+1]); @@ -4634,25 +4611,20 @@ static void print_info(int numa) int main_info(int argc, char **argv) { int opt; - int option_index = 0; - static struct option long_options[] = { - {"help", 0, 0, ''h''}, + static struct option opts[] = { {"numa", 0, 0, ''n''}, + COMMON_LONG_OPTS, {0, 0, 0, 0} }; int numa = 0; - while ((opt = getopt_long(argc, argv, "hn", long_options, &option_index)) != -1) { + while ((opt = def_getopt(argc, argv, "hn", opts, "info", 0)) != -1) { switch (opt) { - case ''h'': - help("info"); - return 0; + case 0: case 2: + return opt; case ''n'': numa = 1; break; - default: - fprintf(stderr, "option `%c'' not supported.\n", optopt); - break; } } @@ -4687,7 +4659,7 @@ int main_sharing(int argc, char **argv) libxl_dominfo *info, *info_free = NULL; int nb_domain, rc; - if ((opt = def_getopt(argc, argv, "", "sharing", 0)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "sharing", 0)) != -1) return opt; if (optind >= argc) { @@ -4956,8 +4928,7 @@ int main_sched_credit(int argc, char **a int opt_s = 0; int tslice = 0, opt_t = 0, ratelimit = 0, opt_r = 0; int opt, rc; - int option_index = 0; - static struct option long_options[] = { + static struct option opts[] = { {"domain", 1, 0, ''d''}, {"weight", 1, 0, ''w''}, {"cap", 1, 0, ''c''}, @@ -4965,15 +4936,11 @@ int main_sched_credit(int argc, char **a {"tslice_ms", 1, 0, ''t''}, {"ratelimit_us", 1, 0, ''r''}, {"cpupool", 1, 0, ''p''}, - {"help", 0, 0, ''h''}, + COMMON_LONG_OPTS, {0, 0, 0, 0} }; - while (1) { - opt = getopt_long(argc, argv, "d:w:c:p:t:r:hs", long_options, - &option_index); - if (opt == -1) - break; + while ((opt = def_getopt(argc, argv, "d:w:c:p:t:r:hs", opts, "sched-credit", 0)) != -1) { switch (opt) { case 0: case 2: return opt; @@ -5002,9 +4969,6 @@ int main_sched_credit(int argc, char **a case ''p'': cpupool = optarg; break; - case ''h'': - help("sched-credit"); - return 0; } } @@ -5087,19 +5051,15 @@ int main_sched_credit2(int argc, char ** const char *cpupool = NULL; int weight = 256, opt_w = 0; int opt, rc; - int option_index = 0; - static struct option long_options[] = { + static struct option opts[] = { {"domain", 1, 0, ''d''}, {"weight", 1, 0, ''w''}, {"cpupool", 1, 0, ''p''}, - {"help", 0, 0, ''h''}, + COMMON_LONG_OPTS, {0, 0, 0, 0} }; - while (1) { - opt = getopt_long(argc, argv, "d:w:p:h", long_options, &option_index); - if (opt == -1) - break; + while ((opt = def_getopt(argc, argv, "d:w:p:h", opts, "sched-credit2", 0)) != -1) { switch (opt) { case 0: case 2: return opt; @@ -5113,9 +5073,6 @@ int main_sched_credit2(int argc, char ** case ''p'': cpupool = optarg; break; - case ''h'': - help("sched-credit"); - return 0; } } @@ -5166,23 +5123,18 @@ int main_sched_sedf(int argc, char **arg int extra = 0, opt_e = 0; int weight = 0, opt_w = 0; int opt, rc; - int option_index = 0; - static struct option long_options[] = { + static struct option opts[] = { {"period", 1, 0, ''p''}, {"slice", 1, 0, ''s''}, {"latency", 1, 0, ''l''}, {"extra", 1, 0, ''e''}, {"weight", 1, 0, ''w''}, {"cpupool", 1, 0, ''c''}, - {"help", 0, 0, ''h''}, + COMMON_LONG_OPTS, {0, 0, 0, 0} }; - while (1) { - opt = getopt_long(argc, argv, "d:p:s:l:e:w:c:h", long_options, - &option_index); - if (opt == -1) - break; + while ((opt = def_getopt(argc, argv, "d:p:s:l:e:w:c:h", opts, "sched-sedf", 0)) != -1) { switch (opt) { case 0: case 2: return opt; @@ -5212,9 +5164,6 @@ int main_sched_sedf(int argc, char **arg case ''c'': cpupool = optarg; break; - case ''h'': - help("sched-sedf"); - return 0; } } @@ -5282,7 +5231,7 @@ int main_domid(int argc, char **argv) int opt; const char *domname = NULL; - if ((opt = def_getopt(argc, argv, "", "domid", 1)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "domid", 1)) != -1) return opt; domname = argv[optind]; @@ -5304,7 +5253,7 @@ int main_domname(int argc, char **argv) char *domname = NULL; char *endptr = NULL; - if ((opt = def_getopt(argc, argv, "", "domname", 1)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "domname", 1)) != -1) return opt; domid = strtol(argv[optind], &endptr, 10); @@ -5332,7 +5281,7 @@ int main_rename(int argc, char **argv) int opt; const char *dom, *new_name; - if ((opt = def_getopt(argc, argv, "", "rename", 2)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "rename", 2)) != -1) return opt; dom = argv[optind++]; @@ -5356,7 +5305,7 @@ int main_trigger(int argc, char **argv) const char *trigger_name = NULL; libxl_trigger trigger; - if ((opt = def_getopt(argc, argv, "", "trigger", 2)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "trigger", 2)) != -1) return opt; domid = find_domain(argv[optind++]); @@ -5386,7 +5335,7 @@ int main_sysrq(int argc, char **argv) int opt; const char *sysrq = NULL; - if ((opt = def_getopt(argc, argv, "", "sysrq", 2)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "sysrq", 2)) != -1) return opt; domid = find_domain(argv[optind++]); @@ -5409,7 +5358,7 @@ int main_debug_keys(int argc, char **arg int opt; char *keys; - if ((opt = def_getopt(argc, argv, "", "debug-keys", 1)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "debug-keys", 1)) != -1) return opt; keys = argv[optind]; @@ -5429,7 +5378,7 @@ int main_dmesg(int argc, char **argv) char *line; int opt, ret = 1; - while ((opt = def_getopt(argc, argv, "c", "dmesg", 0)) != -1) { + while ((opt = def_getopt(argc, argv, "c", NULL, "dmesg", 0)) != -1) { switch (opt) { case 0: case 2: return opt; @@ -5455,7 +5404,7 @@ int main_top(int argc, char **argv) { int opt; - if ((opt = def_getopt(argc, argv, "", "top", 0)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "top", 0)) != -1) return opt; return system("xentop"); @@ -5472,7 +5421,7 @@ int main_networkattach(int argc, char ** int i; unsigned int val; - if ((opt = def_getopt(argc, argv, "", "network-attach", 1)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "network-attach", 1)) != -1) return opt; if (argc-optind > 11) { @@ -5559,7 +5508,7 @@ int main_networklist(int argc, char **ar libxl_nicinfo nicinfo; int nb, i; - if ((opt = def_getopt(argc, argv, "", "network-list", 1)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "network-list", 1)) != -1) return opt; /* Idx BE MAC Hdl Sta evch txr/rxr BE-path */ @@ -5596,7 +5545,7 @@ int main_networkdetach(int argc, char ** int opt; libxl_device_nic nic; - if ((opt = def_getopt(argc, argv, "", "network-detach", 2)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "network-detach", 2)) != -1) return opt; domid = find_domain(argv[optind]); @@ -5627,7 +5576,7 @@ int main_blockattach(int argc, char **ar libxl_device_disk disk = { 0 }; XLU_Config *config = 0; - if ((opt = def_getopt(argc, argv, "", "block-attach", 2)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "block-attach", 2)) != -1) return opt; if (domain_qualifier_to_domid(argv[optind], &fe_domid, 0) < 0) { @@ -5662,7 +5611,7 @@ int main_blocklist(int argc, char **argv libxl_device_disk *disks; libxl_diskinfo diskinfo; - if ((opt = def_getopt(argc, argv, "", "block-list", 1)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "block-list", 1)) != -1) return opt; printf("%-5s %-3s %-6s %-5s %-6s %-8s %-30s\n", @@ -5698,7 +5647,7 @@ int main_blockdetach(int argc, char **ar int opt, rc = 0; libxl_device_disk disk; - if ((opt = def_getopt(argc, argv, "", "block-detach", 2)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "block-detach", 2)) != -1) return opt; domid = find_domain(argv[optind]); @@ -5723,7 +5672,7 @@ int main_vtpmattach(int argc, char **arg unsigned int val; uint32_t domid; - if ((opt = def_getopt(argc, argv, "", "vtpm-attach", 1)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "vtpm-attach", 1)) != -1) return opt; if (domain_qualifier_to_domid(argv[optind], &domid, 0) < 0) { @@ -5776,7 +5725,7 @@ int main_vtpmlist(int argc, char **argv) libxl_vtpminfo vtpminfo; int nb, i; - if ((opt = def_getopt(argc, argv, "", "vtpm-list", 1)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "vtpm-list", 1)) != -1) return opt; /* Idx BE UUID Hdl Sta evch rref BE-path */ @@ -5816,7 +5765,7 @@ int main_vtpmdetach(int argc, char **arg libxl_device_vtpm vtpm; libxl_uuid uuid; - if ((opt = def_getopt(argc, argv, "", "vtpm-detach", 2)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "vtpm-detach", 2)) != -1) return opt; domid = find_domain(argv[optind]); @@ -6008,7 +5957,7 @@ int main_uptime(int argc, char **argv) int nb_doms = 0; int opt; - while ((opt = def_getopt(argc, argv, "s", "uptime", 1)) != -1) { + while ((opt = def_getopt(argc, argv, "s", NULL, "uptime", 1)) != -1) { switch (opt) { case 0: case 2: return opt; @@ -6035,7 +5984,7 @@ int main_tmem_list(int argc, char **argv int all = 0; int opt; - while ((opt = def_getopt(argc, argv, "al", "tmem-list", 0)) != -1) { + while ((opt = def_getopt(argc, argv, "al", NULL, "tmem-list", 0)) != -1) { switch (opt) { case 0: case 2: return opt; @@ -6076,7 +6025,7 @@ int main_tmem_freeze(int argc, char **ar int all = 0; int opt; - while ((opt = def_getopt(argc, argv, "a", "tmem-freeze", 0)) != -1) { + while ((opt = def_getopt(argc, argv, "a", NULL, "tmem-freeze", 0)) != -1) { switch (opt) { case 0: case 2: return opt; @@ -6109,7 +6058,7 @@ int main_tmem_thaw(int argc, char **argv int all = 0; int opt; - while ((opt = def_getopt(argc, argv, "a", "tmem-thaw", 0)) != -1) { + while ((opt = def_getopt(argc, argv, "a", NULL, "tmem-thaw", 0)) != -1) { switch (opt) { case 0: case 2: return opt; @@ -6144,7 +6093,7 @@ int main_tmem_set(int argc, char **argv) int all = 0; int opt; - while ((opt = def_getopt(argc, argv, "aw:c:p:", "tmem-set", 0)) != -1) { + while ((opt = def_getopt(argc, argv, "aw:c:p:", NULL, "tmem-set", 0)) != -1) { switch (opt) { case 0: case 2: return opt; @@ -6205,7 +6154,7 @@ int main_tmem_shared_auth(int argc, char int all = 0; int opt; - while ((opt = def_getopt(argc, argv, "au:A:", "tmem-shared-auth", 0)) != -1) { + while ((opt = def_getopt(argc, argv, "au:A:", NULL, "tmem-shared-auth", 0)) != -1) { switch (opt) { case 0: case 2: return opt; @@ -6255,7 +6204,7 @@ int main_tmem_freeable(int argc, char ** int opt; int mb; - if ((opt = def_getopt(argc, argv, "", "tmem-freeable", 0)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "tmem-freeable", 0)) != -1) return opt; mb = libxl_tmem_freeable(ctx); @@ -6272,11 +6221,10 @@ int main_cpupoolcreate(int argc, char ** const char *p; char extra_config[1024]; int opt; - int option_index = 0; - static struct option long_options[] = { - {"help", 0, 0, ''h''}, + static struct option opts[] = { {"defconfig", 1, 0, ''f''}, {"dryrun", 0, 0, ''n''}, + COMMON_LONG_OPTS, {0, 0, 0, 0} }; int ret; @@ -6294,26 +6242,18 @@ int main_cpupoolcreate(int argc, char ** libxl_bitmap cpumap; libxl_uuid uuid; libxl_cputopology *topology; - int rc = -ERROR_FAIL; - - while (1) { - opt = getopt_long(argc, argv, "hnf:", long_options, &option_index); - if (opt == -1) - break; - + int rc = -ERROR_FAIL; + + while ((opt = def_getopt(argc, argv, "hnf:", opts, "cpupool-create", 0)) != -1) { switch (opt) { + case 0: case 2: + return opt; case ''f'': filename = optarg; break; - case ''h'': - help("cpupool-create"); - return 0; case ''n'': dryrun_only = 1; break; - default: - fprintf(stderr, "option `%c'' not supported.\n", optopt); - break; } } @@ -6476,10 +6416,9 @@ out: int main_cpupoollist(int argc, char **argv) { int opt; - int option_index = 0; - static struct option long_options[] = { - {"help", 0, 0, ''h''}, + static struct option opts[] = { {"cpus", 0, 0, ''c''}, + COMMON_LONG_OPTS, {0, 0, 0, 0} }; int opt_cpus = 0; @@ -6490,28 +6429,16 @@ int main_cpupoollist(int argc, char **ar char *name; int ret = 0; - while (1) { - opt = getopt_long(argc, argv, "hc", long_options, &option_index); - if (opt == -1) + while ((opt = def_getopt(argc, argv, "hc", opts, "cpupool-list", 1)) != -1) { + switch (opt) { + case 0: case 2: break; - - switch (opt) { - case ''h'': - help("cpupool-list"); - return 0; case ''c'': opt_cpus = 1; break; - default: - fprintf(stderr, "option `%c'' not supported.\n", optopt); - break; - } - } - - if ((optind + 1) < argc) { - help("cpupool-list"); - return -ERROR_FAIL; - } + } + } + if (optind < argc) { pool = argv[optind]; if (libxl_name_to_cpupoolid(ctx, pool, &poolid)) { @@ -6569,7 +6496,7 @@ int main_cpupooldestroy(int argc, char * const char *pool; uint32_t poolid; - if ((opt = def_getopt(argc, argv, "", "cpupool-destroy", 1)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "cpupool-destroy", 1)) != -1) return opt; pool = argv[optind]; @@ -6590,7 +6517,7 @@ int main_cpupoolrename(int argc, char ** const char *new_name; uint32_t poolid; - if ((opt = def_getopt(argc, argv, "", "cpupool-rename", 2)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "cpupool-rename", 2)) != -1) return opt; pool = argv[optind++]; @@ -6620,7 +6547,7 @@ int main_cpupoolcpuadd(int argc, char ** int node; int n; - if ((opt = def_getopt(argc, argv, "", "cpupool-cpu-add", 2)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "cpupool-cpu-add", 2)) != -1) return opt; pool = argv[optind++]; @@ -6664,7 +6591,7 @@ int main_cpupoolcpuremove(int argc, char int node; int n; - if ((opt = def_getopt(argc, argv, "", "cpupool-cpu-remove", 2)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "cpupool-cpu-remove", 2)) != -1) return opt; pool = argv[optind++]; @@ -6707,7 +6634,7 @@ int main_cpupoolmigrate(int argc, char * const char *dom; uint32_t domid; - if ((opt = def_getopt(argc, argv, "", "cpupool-migrate", 2)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "cpupool-migrate", 2)) != -1) return opt; dom = argv[optind++]; @@ -6747,7 +6674,7 @@ int main_cpupoolnumasplit(int argc, char libxl_cputopology *topology; libxl_dominfo info; - if ((opt = def_getopt(argc, argv, "", "cpupool-numa-split", 0)) != -1) + if ((opt = def_getopt(argc, argv, "", NULL, "cpupool-numa-split", 0)) != -1) return opt; ret = 0; @@ -7000,7 +6927,7 @@ int main_remus(int argc, char **argv) r_info.blackhole = 0; r_info.compression = 1; - while ((opt = def_getopt(argc, argv, "bui:s:e", "remus", 2)) != -1) { + while ((opt = def_getopt(argc, argv, "bui:s:e", NULL, "remus", 2)) != -1) { switch (opt) { case 0: case 2: return opt;
Ian Campbell
2013-Jan-03 11:39 UTC
[PATCH 2 of 3 V4] xl: Introduce helper macro for option parsing
# HG changeset patch # User Ian Campbell <ijc@hellion.org.uk> # Date 1357213128 0 # Node ID 1a1a2fa73670fd55004505b18a2b31418dcf447a # Parent a229cbca375a438829955b993bde259602371714 xl: Introduce helper macro for option parsing. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> --- v3: - drop underscores from macro params. - improved macro documentation. v2: - s/FOREACH_OPT/SWITCH_FOREACH_OPT/ - Document the macro diff -r a229cbca375a -r 1a1a2fa73670 tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Thu Jan 03 11:03:38 2013 +0000 +++ b/tools/libxl/xl_cmdimpl.c Thu Jan 03 11:38:48 2013 +0000 @@ -2326,6 +2326,10 @@ static int64_t parse_mem_size_kb(const c #define COMMON_LONG_OPTS {"help", 0, 0, ''h''} +/* + * Callers should use SWITCH_FOREACH_OPT in preference to calling this + * directly. + */ static int def_getopt(int argc, char * const argv[], const char *optstring, const struct option *longopts, @@ -2364,6 +2368,66 @@ static int def_getopt(int argc, char * c return -1; } +/* + * Wraps def_getopt into a convenient loop+switch to process all + * arguments. This macro is intended to be called from main_XXX(). + * + * SWITCH_FOREACH_OPT(int *opt, const char *opts, + * const struct option *longopts, + * const char *commandname, + * int num_opts_req) { ... + * + * opt: pointer to an int variable, holds the current option + * during processing. + * opts: short options, as per getopt_long(3)''s optstring argument. + * longopts: long options, as per getopt_long(3)''s longopts argument. + * May be null. + * commandname: name of this command, for usage string. + * num_required_opts: number of non-option command line parameters + * which are required. + * + * In addition the calling context is expected to contain variables + * "argc" and "argv" in the conventional C-style: + * main(int argc, char **argv) + * manner. + * + * Callers should treat SWITCH_FOREACH_OPT as they would a switch + * statement over the value of `opt`. Each option given in `opts` (or + * `lopts`) should be handled by a case statement as if it were inside + * a switch statement. + * + * In addition to the options provided in opts callers must handle + * two additional pseudo options: + * 0 -- generated if the user passes a -h option. help will be printed, + * caller should immediately return 0. + * 2 -- generated if the user does not provided `num_required_opts` + * non-option arguments, caller should immediately return 2. + * + * Example: + * + * int main_foo(int argc, char **argv) { + * int opt; + * + * SWITCH_FOREACH_OPT(opt, "blah", NULL, "foo", 0) { + * case 0: case2: + * return opt; + * case ''b'': + * ... handle b option... + * break; + * case ''l'': + * ... handle l option ... + * break; + * case etc etc... + * } + * ... do something useful with the options ... + * } + */ +#define SWITCH_FOREACH_OPT(opt, opts, longopts, \ + commandname, num_required_opts) \ + while (((opt) = def_getopt(argc, argv, (opts), (longopts), \ + (commandname), (num_required_opts))) != -1) \ + switch (opt) + static int set_memory_max(uint32_t domid, const char *mem) { int64_t memorykb; @@ -2387,8 +2451,10 @@ int main_memmax(int argc, char **argv) char *mem; int rc; - if ((opt = def_getopt(argc, argv, "", NULL, "mem-max", 2)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "mem-max", 2) { + case 0: case 2: return opt; + } domid = find_domain(argv[optind]); mem = argv[optind + 1]; @@ -2421,8 +2487,10 @@ int main_memset(int argc, char **argv) int opt = 0; const char *mem; - if ((opt = def_getopt(argc, argv, "", NULL, "mem-set", 2)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "mem-set", 2) { + case 0: case 2: return opt; + } domid = find_domain(argv[optind]); mem = argv[optind + 1]; @@ -2460,8 +2528,10 @@ int main_cd_eject(int argc, char **argv) int opt = 0; const char *virtdev; - if ((opt = def_getopt(argc, argv, "", NULL, "cd-eject", 2)) != -1) - return opt; + SWITCH_FOREACH_OPT(opt, "", NULL, "cd-eject", 2) { + case 0: case 2: + return opt; + } domid = find_domain(argv[optind]); virtdev = argv[optind + 1]; @@ -2477,8 +2547,10 @@ int main_cd_insert(int argc, char **argv const char *virtdev; char *file = NULL; /* modified by cd_insert tokenising it */ - if ((opt = def_getopt(argc, argv, "", NULL, "cd-insert", 3)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "cd-insert", 3) { + case 0: case 2: return opt; + } domid = find_domain(argv[optind]); virtdev = argv[optind + 1]; @@ -2494,24 +2566,22 @@ int main_console(int argc, char **argv) int opt = 0, num = 0; libxl_console_type type = 0; - while ((opt = def_getopt(argc, argv, "n:t:", NULL, "console", 1)) != -1) { - switch (opt) { - case 0: case 2: - return opt; - case ''t'': - if (!strcmp(optarg, "pv")) - type = LIBXL_CONSOLE_TYPE_PV; - else if (!strcmp(optarg, "serial")) - type = LIBXL_CONSOLE_TYPE_SERIAL; - else { - fprintf(stderr, "console type supported are: pv, serial\n"); - return 2; - } - break; - case ''n'': - num = atoi(optarg); - break; - } + SWITCH_FOREACH_OPT(opt, "n:t:", NULL, "console", 1) { + case 0: case 2: + return opt; + case ''t'': + if (!strcmp(optarg, "pv")) + type = LIBXL_CONSOLE_TYPE_PV; + else if (!strcmp(optarg, "serial")) + type = LIBXL_CONSOLE_TYPE_SERIAL; + else { + fprintf(stderr, "console type supported are: pv, serial\n"); + return 2; + } + break; + case ''n'': + num = atoi(optarg); + break; } domid = find_domain(argv[optind]); @@ -2534,14 +2604,12 @@ int main_vncviewer(int argc, char **argv uint32_t domid; int opt, autopass = 0; - while ((opt = def_getopt(argc, argv, "ah", opts, "vncviewer", 1)) != -1) { - switch (opt) { - case 0: case 2: - return opt; - case ''a'': - autopass = 1; - break; - } + SWITCH_FOREACH_OPT(opt, "ah", opts, "vncviewer", 1) { + case 0: case 2: + return opt; + case ''a'': + autopass = 1; + break; } domid = find_domain(argv[optind]); @@ -2574,8 +2642,10 @@ int main_pcilist(int argc, char **argv) uint32_t domid; int opt; - if ((opt = def_getopt(argc, argv, "", NULL, "pci-list", 1)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "pci-list", 1) { + case 0: case 2: return opt; + } domid = find_domain(argv[optind]); @@ -2613,14 +2683,12 @@ int main_pcidetach(int argc, char **argv int force = 0; const char *bdf = NULL; - while ((opt = def_getopt(argc, argv, "f", NULL, "pci-detach", 2)) != -1) { - switch (opt) { - case 0: case 2: - return opt; - case ''f'': - force = 1; - break; - } + SWITCH_FOREACH_OPT(opt, "f", NULL, "pci-detach", 2) { + case 0: case 2: + return opt; + case ''f'': + force = 1; + break; } domid = find_domain(argv[optind]); @@ -2655,8 +2723,10 @@ int main_pciattach(int argc, char **argv int opt; const char *bdf = NULL, *vs = NULL; - if ((opt = def_getopt(argc, argv, "", NULL, "pci-attach", 2)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "pci-attach", 2) { + case 0: case 2: return opt; + } domid = find_domain(argv[optind]); bdf = argv[optind + 1]; @@ -2689,8 +2759,10 @@ int main_pciassignable_list(int argc, ch { int opt; - if ((opt = def_getopt(argc, argv, "", NULL, "pci-assignable-list", 0)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "pci-assignable-list", 0) { + case 0: case 2: return opt; + } pciassignable_list(); return 0; @@ -2721,11 +2793,9 @@ int main_pciassignable_add(int argc, cha int opt; const char *bdf = NULL; - while ((opt = def_getopt(argc, argv, "", NULL, "pci-assignable-add", 1)) != -1) { - switch (opt) { - case 0: case 2: - return opt; - } + SWITCH_FOREACH_OPT(opt, "", NULL, "pci-assignable-add", 1) { + case 0: case 2: + return opt; } bdf = argv[optind]; @@ -2760,14 +2830,12 @@ int main_pciassignable_remove(int argc, const char *bdf = NULL; int rebind = 0; - while ((opt = def_getopt(argc, argv, "r", NULL, "pci-assignable-remove", 1)) != -1) { - switch (opt) { - case 0: case 2: - return opt; - case ''r'': - rebind=1; - break; - } + SWITCH_FOREACH_OPT(opt, "r", NULL, "pci-assignable-remove", 1) { + case 0: case 2: + return opt; + case ''r'': + rebind=1; + break; } bdf = argv[optind]; @@ -3578,34 +3646,31 @@ int main_restore(int argc, char **argv) {0, 0, 0, 0} }; - while ((opt = def_getopt(argc, argv, "FhcpdeVA", - opts, "restore", 1)) != -1) { - switch (opt) { - case 0: case 2: - return opt; - case ''c'': - console_autoconnect = 1; - break; - case ''p'': - paused = 1; - break; - case ''d'': - debug = 1; - break; - case ''F'': - daemonize = 0; - break; - case ''e'': - daemonize = 0; - monitor = 0; - break; - case ''V'': - vnc = 1; - break; - case ''A'': - vnc = vncautopass = 1; - break; - } + SWITCH_FOREACH_OPT(opt, "FhcpdeVA", opts, "restore", 1) { + case 0: case 2: + return opt; + case ''c'': + console_autoconnect = 1; + break; + case ''p'': + paused = 1; + break; + case ''d'': + debug = 1; + break; + case ''F'': + daemonize = 0; + break; + case ''e'': + daemonize = 0; + monitor = 0; + break; + case ''V'': + vnc = 1; + break; + case ''A'': + vnc = vncautopass = 1; + break; } if (argc-optind == 1) { @@ -3642,24 +3707,22 @@ int main_migrate_receive(int argc, char int debug = 0, daemonize = 1, monitor = 1, remus = 0; int opt; - while ((opt = def_getopt(argc, argv, "Fedr", NULL, "migrate-receive", 0)) != -1) { - switch (opt) { - case 0: case 2: - return opt; - case ''F'': - daemonize = 0; - break; - case ''e'': - daemonize = 0; - monitor = 0; - break; - case ''d'': - debug = 1; - break; - case ''r'': - remus = 1; - break; - } + SWITCH_FOREACH_OPT(opt, "Fedr", NULL, "migrate-receive", 0) { + case 0: case 2: + return opt; + case ''F'': + daemonize = 0; + break; + case ''e'': + daemonize = 0; + monitor = 0; + break; + case ''d'': + debug = 1; + break; + case ''r'': + remus = 1; + break; } if (argc-optind != 0) { @@ -3681,14 +3744,12 @@ int main_save(int argc, char **argv) int checkpoint = 0; int opt; - while ((opt = def_getopt(argc, argv, "c", NULL, "save", 2)) != -1) { - switch (opt) { - case 0: case 2: - return opt; - case ''c'': - checkpoint = 1; - break; - } + SWITCH_FOREACH_OPT(opt, "c", NULL, "save", 2) { + case 0: case 2: + return opt; + case ''c'': + checkpoint = 1; + break; } if (argc-optind > 3) { @@ -3714,27 +3775,25 @@ int main_migrate(int argc, char **argv) char *host; int opt, daemonize = 1, monitor = 1, debug = 0; - while ((opt = def_getopt(argc, argv, "FC:s:ed", NULL, "migrate", 2)) != -1) { - switch (opt) { - case 0: case 2: - return opt; - case ''C'': - config_filename = optarg; - break; - case ''s'': - ssh_command = optarg; - break; - case ''F'': - daemonize = 0; - break; - case ''e'': - daemonize = 0; - monitor = 0; - break; - case ''d'': - debug = 1; - break; - } + SWITCH_FOREACH_OPT(opt, "FC:s:ed", NULL, "migrate", 2) { + case 0: case 2: + return opt; + case ''C'': + config_filename = optarg; + break; + case ''s'': + ssh_command = optarg; + break; + case ''F'': + daemonize = 0; + break; + case ''e'': + daemonize = 0; + monitor = 0; + break; + case ''d'': + debug = 1; + break; } domid = find_domain(argv[optind]); @@ -3758,8 +3817,10 @@ int main_dump_core(int argc, char **argv { int opt; - if ((opt = def_getopt(argc, argv, "", NULL, "dump-core", 2)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "dump-core", 2) { + case 0: case 2: return opt; + } core_dump_domain(find_domain(argv[optind]), argv[optind + 1]); return 0; @@ -3769,8 +3830,10 @@ int main_pause(int argc, char **argv) { int opt; - if ((opt = def_getopt(argc, argv, "", NULL, "pause", 1)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "pause", 1) { + case 0: case 2: return opt; + } pause_domain(find_domain(argv[optind])); @@ -3781,8 +3844,10 @@ int main_unpause(int argc, char **argv) { int opt; - if ((opt = def_getopt(argc, argv, "", NULL, "unpause", 1)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "unpause", 1) { + case 0: case 2: return opt; + } unpause_domain(find_domain(argv[optind])); @@ -3793,8 +3858,10 @@ int main_destroy(int argc, char **argv) { int opt; - if ((opt = def_getopt(argc, argv, "", NULL, "destroy", 1)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "destroy", 1) { + case 0: case 2: return opt; + } destroy_domain(find_domain(argv[optind])); return 0; @@ -3816,20 +3883,18 @@ static int main_shutdown_or_reboot(int d {0, 0, 0, 0} }; - while ((opt = def_getopt(argc, argv, "awF", opts, what, 0)) != -1) { - switch (opt) { - case 0: case 2: - return opt; - case ''a'': - all = 1; - break; - case ''w'': - wait_for_it = 1; - break; - case ''F'': - fallback_trigger = 1; - break; - } + SWITCH_FOREACH_OPT(opt, "awF", opts, what, 0) { + case 0: case 2: + return opt; + case ''a'': + all = 1; + break; + case ''w'': + wait_for_it = 1; + break; + case ''F'': + fallback_trigger = 1; + break; } if (!argv[optind] && !all) { @@ -3900,23 +3965,18 @@ int main_list(int argc, char **argv) libxl_dominfo *info, *info_free=0; int nb_domain, rc; - while ((opt = def_getopt(argc, argv, "lvhZ", opts, "list", 0)) != -1) { - switch (opt) { - case 0: case 2: - return opt; - case ''l'': - details = 1; - break; - case ''h'': - help("list"); - return 0; - case ''v'': - verbose = 1; - break; - case ''Z'': - context = 1; - break; - } + SWITCH_FOREACH_OPT(opt, "lvhZ", opts, "list", 0) { + case 0: case 2: + return opt; + case ''l'': + details = 1; + break; + case ''v'': + verbose = 1; + break; + case ''Z'': + context = 1; + break; } if (optind >= argc) { @@ -3962,8 +4022,10 @@ int main_vm_list(int argc, char **argv) { int opt; - if ((opt = def_getopt(argc, argv, "", NULL, "vm-list", 0)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "vm-list", 0) { + case 0: case 2: return opt; + } list_vm(); return 0; @@ -3993,45 +4055,40 @@ int main_create(int argc, char **argv) argc--; argv++; } - while ((opt = def_getopt(argc, argv, "Fhnqf:pcdeVA", opts, "create", 0)) != -1) { - switch (opt) { - case 0: case 2: - return opt; - case ''f'': - filename = optarg; - break; - case ''p'': - paused = 1; - break; - case ''c'': - console_autoconnect = 1; - break; - case ''d'': - debug = 1; - break; - case ''F'': - daemonize = 0; - break; - case ''e'': - daemonize = 0; - monitor = 0; - break; - case ''h'': - help("create"); - return 0; - case ''n'': - dryrun_only = 1; - break; - case ''q'': - quiet = 1; - break; - case ''V'': - vnc = 1; - break; - case ''A'': - vnc = vncautopass = 1; - break; - } + SWITCH_FOREACH_OPT(opt, "Fhnqf:pcdeVA", opts, "create", 0) { + case 0: case 2: + return opt; + case ''f'': + filename = optarg; + break; + case ''p'': + paused = 1; + break; + case ''c'': + console_autoconnect = 1; + break; + case ''d'': + debug = 1; + break; + case ''F'': + daemonize = 0; + break; + case ''e'': + daemonize = 0; + monitor = 0; + break; + case ''n'': + dryrun_only = 1; + break; + case ''q'': + quiet = 1; + break; + case ''V'': + vnc = 1; + break; + case ''A'': + vnc = vncautopass = 1; + break; } extra_config[0] = ''\0''; @@ -4099,17 +4156,15 @@ int main_config_update(int argc, char ** argc--; argv++; } - while ((opt = def_getopt(argc, argv, "dhqf:", opts, "config_update", 0)) != -1) { - switch (opt) { - case 0: case 2: - return opt; - case ''d'': - debug = 1; - break; - case ''f'': - filename = optarg; - break; - } + SWITCH_FOREACH_OPT(opt, "dhqf:", opts, "config_update", 0) { + case 0: case 2: + return opt; + case ''d'': + debug = 1; + break; + case ''f'': + filename = optarg; + break; } extra_config[0] = ''\0''; @@ -4197,8 +4252,11 @@ int main_button_press(int argc, char **a fprintf(stderr, "WARNING: \"button-press\" is deprecated. " "Please use \"trigger\"\n"); - if ((opt = def_getopt(argc, argv, "", NULL, "button-press", 2)) != -1) + + SWITCH_FOREACH_OPT(opt, "", NULL, "button-press", 2) { + case 0: case 2: return opt; + } button_press(find_domain(argv[optind]), argv[optind + 1]); @@ -4338,8 +4396,10 @@ int main_vcpulist(int argc, char **argv) { int opt; - if ((opt = def_getopt(argc, argv, "", NULL, "cpu-list", 0)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "cpu-list", 0) { + case 0: case 2: return opt; + } vcpulist(argc - optind, argv + optind); return 0; @@ -4399,8 +4459,10 @@ int main_vcpupin(int argc, char **argv) { int opt; - if ((opt = def_getopt(argc, argv, "", NULL, "vcpu-pin", 3)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "vcpu-pin", 3) { + case 0: case 2: return opt; + } vcpupin(find_domain(argv[optind]), argv[optind+1] , argv[optind+2]); return 0; @@ -4435,8 +4497,10 @@ int main_vcpuset(int argc, char **argv) { int opt; - if ((opt = def_getopt(argc, argv, "", NULL, "vcpu-set", 2)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "vcpu-set", 2) { + case 0: case 2: return opt; + } vcpuset(find_domain(argv[optind]), argv[optind+1]); return 0; @@ -4618,14 +4682,12 @@ int main_info(int argc, char **argv) }; int numa = 0; - while ((opt = def_getopt(argc, argv, "hn", opts, "info", 0)) != -1) { - switch (opt) { - case 0: case 2: - return opt; - case ''n'': - numa = 1; - break; - } + SWITCH_FOREACH_OPT(opt, "hn", opts, "info", 0) { + case 0: case 2: + return opt; + case ''n'': + numa = 1; + break; } print_info(numa); @@ -4659,8 +4721,10 @@ int main_sharing(int argc, char **argv) libxl_dominfo *info, *info_free = NULL; int nb_domain, rc; - if ((opt = def_getopt(argc, argv, "", NULL, "sharing", 0)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "sharing", 0) { + case 0: case 2: return opt; + } if (optind >= argc) { info = libxl_list_domain(ctx, &nb_domain); @@ -4940,36 +5004,34 @@ int main_sched_credit(int argc, char **a {0, 0, 0, 0} }; - while ((opt = def_getopt(argc, argv, "d:w:c:p:t:r:hs", opts, "sched-credit", 0)) != -1) { - switch (opt) { - case 0: case 2: - return opt; - case ''d'': - dom = optarg; - break; - case ''w'': - weight = strtol(optarg, NULL, 10); - opt_w = 1; - break; - case ''c'': - cap = strtol(optarg, NULL, 10); - opt_c = 1; - break; - case ''t'': - tslice = strtol(optarg, NULL, 10); - opt_t = 1; - break; - case ''r'': - ratelimit = strtol(optarg, NULL, 10); - opt_r = 1; - break; - case ''s'': - opt_s = 1; - break; - case ''p'': - cpupool = optarg; - break; - } + SWITCH_FOREACH_OPT(opt, "d:w:c:p:t:r:hs", opts, "sched-credit", 0) { + case 0: case 2: + return opt; + case ''d'': + dom = optarg; + break; + case ''w'': + weight = strtol(optarg, NULL, 10); + opt_w = 1; + break; + case ''c'': + cap = strtol(optarg, NULL, 10); + opt_c = 1; + break; + case ''t'': + tslice = strtol(optarg, NULL, 10); + opt_t = 1; + break; + case ''r'': + ratelimit = strtol(optarg, NULL, 10); + opt_r = 1; + break; + case ''s'': + opt_s = 1; + break; + case ''p'': + cpupool = optarg; + break; } if ((cpupool || opt_s) && (dom || opt_w || opt_c)) { @@ -5059,21 +5121,19 @@ int main_sched_credit2(int argc, char ** {0, 0, 0, 0} }; - while ((opt = def_getopt(argc, argv, "d:w:p:h", opts, "sched-credit2", 0)) != -1) { - switch (opt) { - case 0: case 2: - return opt; - case ''d'': - dom = optarg; - break; - case ''w'': - weight = strtol(optarg, NULL, 10); - opt_w = 1; - break; - case ''p'': - cpupool = optarg; - break; - } + SWITCH_FOREACH_OPT(opt, "d:w:p:h", opts, "sched-credit2", 0) { + case 0: case 2: + return opt; + case ''d'': + dom = optarg; + break; + case ''w'': + weight = strtol(optarg, NULL, 10); + opt_w = 1; + break; + case ''p'': + cpupool = optarg; + break; } if (cpupool && (dom || opt_w)) { @@ -5134,37 +5194,35 @@ int main_sched_sedf(int argc, char **arg {0, 0, 0, 0} }; - while ((opt = def_getopt(argc, argv, "d:p:s:l:e:w:c:h", opts, "sched-sedf", 0)) != -1) { - switch (opt) { - case 0: case 2: - return opt; - case ''d'': - dom = optarg; - break; - case ''p'': - period = strtol(optarg, NULL, 10); - opt_p = 1; - break; - case ''s'': - slice = strtol(optarg, NULL, 10); - opt_s = 1; - break; - case ''l'': - latency = strtol(optarg, NULL, 10); - opt_l = 1; - break; - case ''e'': - extra = strtol(optarg, NULL, 10); - opt_e = 1; - break; - case ''w'': - weight = strtol(optarg, NULL, 10); - opt_w = 1; - break; - case ''c'': - cpupool = optarg; - break; - } + SWITCH_FOREACH_OPT(opt, "d:p:s:l:e:w:c:h", opts, "sched-sedf", 0) { + case 0: case 2: + return opt; + case ''d'': + dom = optarg; + break; + case ''p'': + period = strtol(optarg, NULL, 10); + opt_p = 1; + break; + case ''s'': + slice = strtol(optarg, NULL, 10); + opt_s = 1; + break; + case ''l'': + latency = strtol(optarg, NULL, 10); + opt_l = 1; + break; + case ''e'': + extra = strtol(optarg, NULL, 10); + opt_e = 1; + break; + case ''w'': + weight = strtol(optarg, NULL, 10); + opt_w = 1; + break; + case ''c'': + cpupool = optarg; + break; } if (cpupool && (dom || opt_p || opt_s || opt_l || opt_e || opt_w)) { @@ -5231,8 +5289,10 @@ int main_domid(int argc, char **argv) int opt; const char *domname = NULL; - if ((opt = def_getopt(argc, argv, "", NULL, "domid", 1)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "domid", 1) { + case 0: case 2: return opt; + } domname = argv[optind]; @@ -5253,8 +5313,10 @@ int main_domname(int argc, char **argv) char *domname = NULL; char *endptr = NULL; - if ((opt = def_getopt(argc, argv, "", NULL, "domname", 1)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "domname", 1) { + case 0: case 2: return opt; + } domid = strtol(argv[optind], &endptr, 10); if (domid == 0 && !strcmp(endptr, argv[optind])) { @@ -5281,8 +5343,10 @@ int main_rename(int argc, char **argv) int opt; const char *dom, *new_name; - if ((opt = def_getopt(argc, argv, "", NULL, "rename", 2)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "rename", 2) { + case 0: case 2: return opt; + } dom = argv[optind++]; new_name = argv[optind]; @@ -5305,8 +5369,10 @@ int main_trigger(int argc, char **argv) const char *trigger_name = NULL; libxl_trigger trigger; - if ((opt = def_getopt(argc, argv, "", NULL, "trigger", 2)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "trigger", 2) { + case 0: case 2: return opt; + } domid = find_domain(argv[optind++]); @@ -5335,8 +5401,10 @@ int main_sysrq(int argc, char **argv) int opt; const char *sysrq = NULL; - if ((opt = def_getopt(argc, argv, "", NULL, "sysrq", 2)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "sysrq", 2) { + case 0: case 2: return opt; + } domid = find_domain(argv[optind++]); @@ -5358,8 +5426,10 @@ int main_debug_keys(int argc, char **arg int opt; char *keys; - if ((opt = def_getopt(argc, argv, "", NULL, "debug-keys", 1)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "debug-keys", 1) { + case 0: case 2: return opt; + } keys = argv[optind]; @@ -5378,14 +5448,12 @@ int main_dmesg(int argc, char **argv) char *line; int opt, ret = 1; - while ((opt = def_getopt(argc, argv, "c", NULL, "dmesg", 0)) != -1) { - switch (opt) { - case 0: case 2: - return opt; - case ''c'': - clear = 1; - break; - } + SWITCH_FOREACH_OPT(opt, "c", NULL, "dmesg", 0) { + case 0: case 2: + return opt; + case ''c'': + clear = 1; + break; } cr = libxl_xen_console_read_start(ctx, clear); @@ -5404,8 +5472,10 @@ int main_top(int argc, char **argv) { int opt; - if ((opt = def_getopt(argc, argv, "", NULL, "top", 0)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "top", 0) { + case 0: case 2: return opt; + } return system("xentop"); } @@ -5421,8 +5491,10 @@ int main_networkattach(int argc, char ** int i; unsigned int val; - if ((opt = def_getopt(argc, argv, "", NULL, "network-attach", 1)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "network-attach", 1) { + case 0: case 2: return opt; + } if (argc-optind > 11) { help("network-attach"); @@ -5508,8 +5580,10 @@ int main_networklist(int argc, char **ar libxl_nicinfo nicinfo; int nb, i; - if ((opt = def_getopt(argc, argv, "", NULL, "network-list", 1)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "network-list", 1) { + case 0: case 2: return opt; + } /* Idx BE MAC Hdl Sta evch txr/rxr BE-path */ printf("%-3s %-2s %-17s %-6s %-5s %-6s %5s/%-5s %-30s\n", @@ -5545,8 +5619,10 @@ int main_networkdetach(int argc, char ** int opt; libxl_device_nic nic; - if ((opt = def_getopt(argc, argv, "", NULL, "network-detach", 2)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "network-detach", 2) { + case 0: case 2: return opt; + } domid = find_domain(argv[optind]); @@ -5576,8 +5652,10 @@ int main_blockattach(int argc, char **ar libxl_device_disk disk = { 0 }; XLU_Config *config = 0; - if ((opt = def_getopt(argc, argv, "", NULL, "block-attach", 2)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "block-attach", 2) { + case 0: case 2: return opt; + } if (domain_qualifier_to_domid(argv[optind], &fe_domid, 0) < 0) { fprintf(stderr, "%s is an invalid domain identifier\n", argv[optind]); @@ -5611,8 +5689,10 @@ int main_blocklist(int argc, char **argv libxl_device_disk *disks; libxl_diskinfo diskinfo; - if ((opt = def_getopt(argc, argv, "", NULL, "block-list", 1)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "block-list", 1) { + case 0: case 2: return opt; + } printf("%-5s %-3s %-6s %-5s %-6s %-8s %-30s\n", "Vdev", "BE", "handle", "state", "evt-ch", "ring-ref", "BE-path"); @@ -5647,8 +5727,10 @@ int main_blockdetach(int argc, char **ar int opt, rc = 0; libxl_device_disk disk; - if ((opt = def_getopt(argc, argv, "", NULL, "block-detach", 2)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "block-detach", 2) { + case 0: case 2: return opt; + } domid = find_domain(argv[optind]); @@ -5672,8 +5754,10 @@ int main_vtpmattach(int argc, char **arg unsigned int val; uint32_t domid; - if ((opt = def_getopt(argc, argv, "", NULL, "vtpm-attach", 1)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "vtpm-attach", 1) { + case 0: case 2: return opt; + } if (domain_qualifier_to_domid(argv[optind], &domid, 0) < 0) { fprintf(stderr, "%s is an invalid domain identifier\n", argv[optind]); @@ -5725,8 +5809,10 @@ int main_vtpmlist(int argc, char **argv) libxl_vtpminfo vtpminfo; int nb, i; - if ((opt = def_getopt(argc, argv, "", NULL, "vtpm-list", 1)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "vtpm-list", 1) { + case 0: case 2: return opt; + } /* Idx BE UUID Hdl Sta evch rref BE-path */ printf("%-3s %-2s %-36s %-6s %-5s %-6s %-5s %-10s\n", @@ -5765,8 +5851,10 @@ int main_vtpmdetach(int argc, char **arg libxl_device_vtpm vtpm; libxl_uuid uuid; - if ((opt = def_getopt(argc, argv, "", NULL, "vtpm-detach", 2)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "vtpm-detach", 2) { + case 0: case 2: return opt; + } domid = find_domain(argv[optind]); @@ -5957,14 +6045,12 @@ int main_uptime(int argc, char **argv) int nb_doms = 0; int opt; - while ((opt = def_getopt(argc, argv, "s", NULL, "uptime", 1)) != -1) { - switch (opt) { - case 0: case 2: - return opt; - case ''s'': - short_mode = 1; - break; - } + SWITCH_FOREACH_OPT(opt, "s", NULL, "uptime", 1) { + case 0: case 2: + return opt; + case ''s'': + short_mode = 1; + break; } for (;(dom = argv[optind]) != NULL; nb_doms++,optind++) @@ -5984,17 +6070,15 @@ int main_tmem_list(int argc, char **argv int all = 0; int opt; - while ((opt = def_getopt(argc, argv, "al", NULL, "tmem-list", 0)) != -1) { - switch (opt) { - case 0: case 2: - return opt; - case ''l'': - use_long = 1; - break; - case ''a'': - all = 1; - break; - } + SWITCH_FOREACH_OPT(opt, "al", NULL, "tmem-list", 0) { + case 0: case 2: + return opt; + case ''l'': + use_long = 1; + break; + case ''a'': + all = 1; + break; } dom = argv[optind]; @@ -6025,14 +6109,12 @@ int main_tmem_freeze(int argc, char **ar int all = 0; int opt; - while ((opt = def_getopt(argc, argv, "a", NULL, "tmem-freeze", 0)) != -1) { - switch (opt) { - case 0: case 2: - return opt; - case ''a'': - all = 1; - break; - } + SWITCH_FOREACH_OPT(opt, "a", NULL, "tmem-freeze", 0) { + case 0: case 2: + return opt; + case ''a'': + all = 1; + break; } dom = argv[optind]; @@ -6058,14 +6140,12 @@ int main_tmem_thaw(int argc, char **argv int all = 0; int opt; - while ((opt = def_getopt(argc, argv, "a", NULL, "tmem-thaw", 0)) != -1) { - switch (opt) { - case 0: case 2: - return opt; - case ''a'': - all = 1; - break; - } + SWITCH_FOREACH_OPT(opt, "a", NULL, "tmem-thaw", 0) { + case 0: case 2: + return opt; + case ''a'': + all = 1; + break; } dom = argv[optind]; @@ -6093,26 +6173,24 @@ int main_tmem_set(int argc, char **argv) int all = 0; int opt; - while ((opt = def_getopt(argc, argv, "aw:c:p:", NULL, "tmem-set", 0)) != -1) { - switch (opt) { - case 0: case 2: - return opt; - case ''a'': - all = 1; - break; - case ''w'': - weight = strtol(optarg, NULL, 10); - opt_w = 1; - break; - case ''c'': - cap = strtol(optarg, NULL, 10); - opt_c = 1; - break; - case ''p'': - compress = strtol(optarg, NULL, 10); - opt_p = 1; - break; - } + SWITCH_FOREACH_OPT(opt, "aw:c:p:", NULL, "tmem-set", 0) { + case 0: case 2: + return opt; + case ''a'': + all = 1; + break; + case ''w'': + weight = strtol(optarg, NULL, 10); + opt_w = 1; + break; + case ''c'': + cap = strtol(optarg, NULL, 10); + opt_c = 1; + break; + case ''p'': + compress = strtol(optarg, NULL, 10); + opt_p = 1; + break; } dom = argv[optind]; @@ -6154,20 +6232,18 @@ int main_tmem_shared_auth(int argc, char int all = 0; int opt; - while ((opt = def_getopt(argc, argv, "au:A:", NULL, "tmem-shared-auth", 0)) != -1) { - switch (opt) { - case 0: case 2: - return opt; - case ''a'': - all = 1; - break; - case ''u'': - uuid = optarg; - break; - case ''A'': - autharg = optarg; - break; - } + SWITCH_FOREACH_OPT(opt, "au:A:", NULL, "tmem-shared-auth", 0) { + case 0: case 2: + return opt; + case ''a'': + all = 1; + break; + case ''u'': + uuid = optarg; + break; + case ''A'': + autharg = optarg; + break; } dom = argv[optind]; @@ -6204,8 +6280,10 @@ int main_tmem_freeable(int argc, char ** int opt; int mb; - if ((opt = def_getopt(argc, argv, "", NULL, "tmem-freeable", 0)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "tmem-freeale", 0) { + case 0: case 2: return opt; + } mb = libxl_tmem_freeable(ctx); if (mb == -1) @@ -6244,17 +6322,15 @@ int main_cpupoolcreate(int argc, char ** libxl_cputopology *topology; int rc = -ERROR_FAIL; - while ((opt = def_getopt(argc, argv, "hnf:", opts, "cpupool-create", 0)) != -1) { - switch (opt) { - case 0: case 2: - return opt; - case ''f'': - filename = optarg; - break; - case ''n'': - dryrun_only = 1; - break; - } + SWITCH_FOREACH_OPT(opt, "hnf:", opts, "cpupool-create", 0) { + case 0: case 2: + return opt; + case ''f'': + filename = optarg; + break; + case ''n'': + dryrun_only = 1; + break; } memset(extra_config, 0, sizeof(extra_config)); @@ -6429,14 +6505,12 @@ int main_cpupoollist(int argc, char **ar char *name; int ret = 0; - while ((opt = def_getopt(argc, argv, "hc", opts, "cpupool-list", 1)) != -1) { - switch (opt) { - case 0: case 2: - break; - case ''c'': - opt_cpus = 1; - break; - } + SWITCH_FOREACH_OPT(opt, "hc", opts, "cpupool-list", 1) { + case 0: case 2: + break; + case ''c'': + opt_cpus = 1; + break; } if (optind < argc) { @@ -6496,8 +6570,10 @@ int main_cpupooldestroy(int argc, char * const char *pool; uint32_t poolid; - if ((opt = def_getopt(argc, argv, "", NULL, "cpupool-destroy", 1)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-destroy", 1) { + case 0: case 2: return opt; + } pool = argv[optind]; @@ -6517,8 +6593,10 @@ int main_cpupoolrename(int argc, char ** const char *new_name; uint32_t poolid; - if ((opt = def_getopt(argc, argv, "", NULL, "cpupool-rename", 2)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-rename", 2) { + case 0: case 2: return opt; + } pool = argv[optind++]; @@ -6547,8 +6625,10 @@ int main_cpupoolcpuadd(int argc, char ** int node; int n; - if ((opt = def_getopt(argc, argv, "", NULL, "cpupool-cpu-add", 2)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-cpu-add", 2) { + case 0: case 2: return opt; + } pool = argv[optind++]; node = -1; @@ -6591,8 +6671,10 @@ int main_cpupoolcpuremove(int argc, char int node; int n; - if ((opt = def_getopt(argc, argv, "", NULL, "cpupool-cpu-remove", 2)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-cpu-remove", 2) { + case 0: case 2: return opt; + } pool = argv[optind++]; node = -1; @@ -6634,8 +6716,10 @@ int main_cpupoolmigrate(int argc, char * const char *dom; uint32_t domid; - if ((opt = def_getopt(argc, argv, "", NULL, "cpupool-migrate", 2)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-migrate", 2) { + case 0: case 2: return opt; + } dom = argv[optind++]; pool = argv[optind]; @@ -6674,8 +6758,11 @@ int main_cpupoolnumasplit(int argc, char libxl_cputopology *topology; libxl_dominfo info; - if ((opt = def_getopt(argc, argv, "", NULL, "cpupool-numa-split", 0)) != -1) + SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-numa-split", 0) { + case 0: case 2: return opt; + } + ret = 0; poolinfo = libxl_list_cpupool(ctx, &n_pools); @@ -6927,27 +7014,24 @@ int main_remus(int argc, char **argv) r_info.blackhole = 0; r_info.compression = 1; - while ((opt = def_getopt(argc, argv, "bui:s:e", NULL, "remus", 2)) != -1) { - switch (opt) { - case 0: case 2: - return opt; - - case ''i'': - r_info.interval = atoi(optarg); - break; - case ''b'': - r_info.blackhole = 1; - break; - case ''u'': - r_info.compression = 0; - break; - case ''s'': - ssh_command = optarg; - break; - case ''e'': - daemonize = 0; - break; - } + SWITCH_FOREACH_OPT(opt, "bui:s:e", NULL, "remus", 2) { + case 0: case 2: + return opt; + case ''i'': + r_info.interval = atoi(optarg); + break; + case ''b'': + r_info.blackhole = 1; + break; + case ''u'': + r_info.compression = 0; + break; + case ''s'': + ssh_command = optarg; + break; + case ''e'': + daemonize = 0; + break; } domid = find_domain(argv[optind]);
Ian Campbell
2013-Jan-03 11:39 UTC
[PATCH 3 of 3 V4] xl: SWITCH_FOREACH_OPT handles special options directly
# HG changeset patch # User Ian Campbell <ijc@hellion.org.uk> # Date 1357213146 0 # Node ID 0d2f4198f2c3fd6574e9058a528ac5530332b14e # Parent 1a1a2fa73670fd55004505b18a2b31418dcf447a xl: SWITCH_FOREACH_OPT handles special options directly. This removes the need for the "case 0: case 2:" boilerplate in every main_foo(). Calls exit(3) directly which is OK since xl cleans up the context etc in an atexit(3) handler. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> -- v4: exit() directly instead of returning. diff -r 1a1a2fa73670 -r 0d2f4198f2c3 tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Thu Jan 03 11:38:48 2013 +0000 +++ b/tools/libxl/xl_cmdimpl.c Thu Jan 03 11:39:06 2013 +0000 @@ -2396,12 +2396,13 @@ static int def_getopt(int argc, char * c * `lopts`) should be handled by a case statement as if it were inside * a switch statement. * - * In addition to the options provided in opts callers must handle - * two additional pseudo options: - * 0 -- generated if the user passes a -h option. help will be printed, - * caller should immediately return 0. - * 2 -- generated if the user does not provided `num_required_opts` - * non-option arguments, caller should immediately return 2. + * In addition to the options provided in opts the macro will handle + * the "help" option and enforce a minimum number of non-option + * command line pearameters as follows: + * -- if the user passes a -h or --help option. help will be printed, + * and the macro will cause the process to exit with code 0. + * -- if the user does not provided `num_required_opts` non-option + * arguments, the macro will cause the process to exit with code 2. * * Example: * @@ -2409,8 +2410,6 @@ static int def_getopt(int argc, char * c * int opt; * * SWITCH_FOREACH_OPT(opt, "blah", NULL, "foo", 0) { - * case 0: case2: - * return opt; * case ''b'': * ... handle b option... * break; @@ -2426,6 +2425,8 @@ static int def_getopt(int argc, char * c commandname, num_required_opts) \ while (((opt) = def_getopt(argc, argv, (opts), (longopts), \ (commandname), (num_required_opts))) != -1) \ + if (opt == 0) exit(0); \ + if (opt == 2) exit(2); \ switch (opt) static int set_memory_max(uint32_t domid, const char *mem) @@ -2452,8 +2453,7 @@ int main_memmax(int argc, char **argv) int rc; SWITCH_FOREACH_OPT(opt, "", NULL, "mem-max", 2) { - case 0: case 2: - return opt; + /* No options */ } domid = find_domain(argv[optind]); @@ -2488,8 +2488,7 @@ int main_memset(int argc, char **argv) const char *mem; SWITCH_FOREACH_OPT(opt, "", NULL, "mem-set", 2) { - case 0: case 2: - return opt; + /* No options */ } domid = find_domain(argv[optind]); @@ -2529,8 +2528,7 @@ int main_cd_eject(int argc, char **argv) const char *virtdev; SWITCH_FOREACH_OPT(opt, "", NULL, "cd-eject", 2) { - case 0: case 2: - return opt; + /* No options */ } domid = find_domain(argv[optind]); @@ -2548,8 +2546,7 @@ int main_cd_insert(int argc, char **argv char *file = NULL; /* modified by cd_insert tokenising it */ SWITCH_FOREACH_OPT(opt, "", NULL, "cd-insert", 3) { - case 0: case 2: - return opt; + /* No options */ } domid = find_domain(argv[optind]); @@ -2567,8 +2564,6 @@ int main_console(int argc, char **argv) libxl_console_type type = 0; SWITCH_FOREACH_OPT(opt, "n:t:", NULL, "console", 1) { - case 0: case 2: - return opt; case ''t'': if (!strcmp(optarg, "pv")) type = LIBXL_CONSOLE_TYPE_PV; @@ -2605,8 +2600,6 @@ int main_vncviewer(int argc, char **argv int opt, autopass = 0; SWITCH_FOREACH_OPT(opt, "ah", opts, "vncviewer", 1) { - case 0: case 2: - return opt; case ''a'': autopass = 1; break; @@ -2643,8 +2636,7 @@ int main_pcilist(int argc, char **argv) int opt; SWITCH_FOREACH_OPT(opt, "", NULL, "pci-list", 1) { - case 0: case 2: - return opt; + /* No options */ } domid = find_domain(argv[optind]); @@ -2684,8 +2676,6 @@ int main_pcidetach(int argc, char **argv const char *bdf = NULL; SWITCH_FOREACH_OPT(opt, "f", NULL, "pci-detach", 2) { - case 0: case 2: - return opt; case ''f'': force = 1; break; @@ -2724,8 +2714,7 @@ int main_pciattach(int argc, char **argv const char *bdf = NULL, *vs = NULL; SWITCH_FOREACH_OPT(opt, "", NULL, "pci-attach", 2) { - case 0: case 2: - return opt; + /* No options */ } domid = find_domain(argv[optind]); @@ -2760,8 +2749,7 @@ int main_pciassignable_list(int argc, ch int opt; SWITCH_FOREACH_OPT(opt, "", NULL, "pci-assignable-list", 0) { - case 0: case 2: - return opt; + /* No options */ } pciassignable_list(); @@ -2794,8 +2782,7 @@ int main_pciassignable_add(int argc, cha const char *bdf = NULL; SWITCH_FOREACH_OPT(opt, "", NULL, "pci-assignable-add", 1) { - case 0: case 2: - return opt; + /* No options */ } bdf = argv[optind]; @@ -2831,8 +2818,6 @@ int main_pciassignable_remove(int argc, int rebind = 0; SWITCH_FOREACH_OPT(opt, "r", NULL, "pci-assignable-remove", 1) { - case 0: case 2: - return opt; case ''r'': rebind=1; break; @@ -3647,8 +3632,6 @@ int main_restore(int argc, char **argv) }; SWITCH_FOREACH_OPT(opt, "FhcpdeVA", opts, "restore", 1) { - case 0: case 2: - return opt; case ''c'': console_autoconnect = 1; break; @@ -3708,8 +3691,6 @@ int main_migrate_receive(int argc, char int opt; SWITCH_FOREACH_OPT(opt, "Fedr", NULL, "migrate-receive", 0) { - case 0: case 2: - return opt; case ''F'': daemonize = 0; break; @@ -3745,8 +3726,6 @@ int main_save(int argc, char **argv) int opt; SWITCH_FOREACH_OPT(opt, "c", NULL, "save", 2) { - case 0: case 2: - return opt; case ''c'': checkpoint = 1; break; @@ -3776,8 +3755,6 @@ int main_migrate(int argc, char **argv) int opt, daemonize = 1, monitor = 1, debug = 0; SWITCH_FOREACH_OPT(opt, "FC:s:ed", NULL, "migrate", 2) { - case 0: case 2: - return opt; case ''C'': config_filename = optarg; break; @@ -3818,8 +3795,7 @@ int main_dump_core(int argc, char **argv int opt; SWITCH_FOREACH_OPT(opt, "", NULL, "dump-core", 2) { - case 0: case 2: - return opt; + /* No options */ } core_dump_domain(find_domain(argv[optind]), argv[optind + 1]); @@ -3831,8 +3807,7 @@ int main_pause(int argc, char **argv) int opt; SWITCH_FOREACH_OPT(opt, "", NULL, "pause", 1) { - case 0: case 2: - return opt; + /* No options */ } pause_domain(find_domain(argv[optind])); @@ -3845,8 +3820,7 @@ int main_unpause(int argc, char **argv) int opt; SWITCH_FOREACH_OPT(opt, "", NULL, "unpause", 1) { - case 0: case 2: - return opt; + /* No options */ } unpause_domain(find_domain(argv[optind])); @@ -3859,8 +3833,7 @@ int main_destroy(int argc, char **argv) int opt; SWITCH_FOREACH_OPT(opt, "", NULL, "destroy", 1) { - case 0: case 2: - return opt; + /* No options */ } destroy_domain(find_domain(argv[optind])); @@ -3884,8 +3857,6 @@ static int main_shutdown_or_reboot(int d }; SWITCH_FOREACH_OPT(opt, "awF", opts, what, 0) { - case 0: case 2: - return opt; case ''a'': all = 1; break; @@ -3966,8 +3937,6 @@ int main_list(int argc, char **argv) int nb_domain, rc; SWITCH_FOREACH_OPT(opt, "lvhZ", opts, "list", 0) { - case 0: case 2: - return opt; case ''l'': details = 1; break; @@ -4023,8 +3992,7 @@ int main_vm_list(int argc, char **argv) int opt; SWITCH_FOREACH_OPT(opt, "", NULL, "vm-list", 0) { - case 0: case 2: - return opt; + /* No options */ } list_vm(); @@ -4056,8 +4024,6 @@ int main_create(int argc, char **argv) } SWITCH_FOREACH_OPT(opt, "Fhnqf:pcdeVA", opts, "create", 0) { - case 0: case 2: - return opt; case ''f'': filename = optarg; break; @@ -4157,8 +4123,6 @@ int main_config_update(int argc, char ** } SWITCH_FOREACH_OPT(opt, "dhqf:", opts, "config_update", 0) { - case 0: case 2: - return opt; case ''d'': debug = 1; break; @@ -4254,8 +4218,7 @@ int main_button_press(int argc, char **a SWITCH_FOREACH_OPT(opt, "", NULL, "button-press", 2) { - case 0: case 2: - return opt; + /* No options */ } button_press(find_domain(argv[optind]), argv[optind + 1]); @@ -4397,8 +4360,7 @@ int main_vcpulist(int argc, char **argv) int opt; SWITCH_FOREACH_OPT(opt, "", NULL, "cpu-list", 0) { - case 0: case 2: - return opt; + /* No options */ } vcpulist(argc - optind, argv + optind); @@ -4460,8 +4422,7 @@ int main_vcpupin(int argc, char **argv) int opt; SWITCH_FOREACH_OPT(opt, "", NULL, "vcpu-pin", 3) { - case 0: case 2: - return opt; + /* No options */ } vcpupin(find_domain(argv[optind]), argv[optind+1] , argv[optind+2]); @@ -4498,8 +4459,7 @@ int main_vcpuset(int argc, char **argv) int opt; SWITCH_FOREACH_OPT(opt, "", NULL, "vcpu-set", 2) { - case 0: case 2: - return opt; + /* No options */ } vcpuset(find_domain(argv[optind]), argv[optind+1]); @@ -4683,8 +4643,6 @@ int main_info(int argc, char **argv) int numa = 0; SWITCH_FOREACH_OPT(opt, "hn", opts, "info", 0) { - case 0: case 2: - return opt; case ''n'': numa = 1; break; @@ -4722,8 +4680,7 @@ int main_sharing(int argc, char **argv) int nb_domain, rc; SWITCH_FOREACH_OPT(opt, "", NULL, "sharing", 0) { - case 0: case 2: - return opt; + /* No options */ } if (optind >= argc) { @@ -5005,8 +4962,6 @@ int main_sched_credit(int argc, char **a }; SWITCH_FOREACH_OPT(opt, "d:w:c:p:t:r:hs", opts, "sched-credit", 0) { - case 0: case 2: - return opt; case ''d'': dom = optarg; break; @@ -5122,8 +5077,6 @@ int main_sched_credit2(int argc, char ** }; SWITCH_FOREACH_OPT(opt, "d:w:p:h", opts, "sched-credit2", 0) { - case 0: case 2: - return opt; case ''d'': dom = optarg; break; @@ -5195,8 +5148,6 @@ int main_sched_sedf(int argc, char **arg }; SWITCH_FOREACH_OPT(opt, "d:p:s:l:e:w:c:h", opts, "sched-sedf", 0) { - case 0: case 2: - return opt; case ''d'': dom = optarg; break; @@ -5290,8 +5241,7 @@ int main_domid(int argc, char **argv) const char *domname = NULL; SWITCH_FOREACH_OPT(opt, "", NULL, "domid", 1) { - case 0: case 2: - return opt; + /* No options */ } domname = argv[optind]; @@ -5314,8 +5264,7 @@ int main_domname(int argc, char **argv) char *endptr = NULL; SWITCH_FOREACH_OPT(opt, "", NULL, "domname", 1) { - case 0: case 2: - return opt; + /* No options */ } domid = strtol(argv[optind], &endptr, 10); @@ -5344,8 +5293,7 @@ int main_rename(int argc, char **argv) const char *dom, *new_name; SWITCH_FOREACH_OPT(opt, "", NULL, "rename", 2) { - case 0: case 2: - return opt; + /* No options */ } dom = argv[optind++]; @@ -5370,8 +5318,7 @@ int main_trigger(int argc, char **argv) libxl_trigger trigger; SWITCH_FOREACH_OPT(opt, "", NULL, "trigger", 2) { - case 0: case 2: - return opt; + /* No options */ } domid = find_domain(argv[optind++]); @@ -5402,8 +5349,7 @@ int main_sysrq(int argc, char **argv) const char *sysrq = NULL; SWITCH_FOREACH_OPT(opt, "", NULL, "sysrq", 2) { - case 0: case 2: - return opt; + /* No options */ } domid = find_domain(argv[optind++]); @@ -5427,8 +5373,7 @@ int main_debug_keys(int argc, char **arg char *keys; SWITCH_FOREACH_OPT(opt, "", NULL, "debug-keys", 1) { - case 0: case 2: - return opt; + /* No options */ } keys = argv[optind]; @@ -5449,8 +5394,6 @@ int main_dmesg(int argc, char **argv) int opt, ret = 1; SWITCH_FOREACH_OPT(opt, "c", NULL, "dmesg", 0) { - case 0: case 2: - return opt; case ''c'': clear = 1; break; @@ -5473,8 +5416,7 @@ int main_top(int argc, char **argv) int opt; SWITCH_FOREACH_OPT(opt, "", NULL, "top", 0) { - case 0: case 2: - return opt; + /* No options */ } return system("xentop"); @@ -5492,8 +5434,7 @@ int main_networkattach(int argc, char ** unsigned int val; SWITCH_FOREACH_OPT(opt, "", NULL, "network-attach", 1) { - case 0: case 2: - return opt; + /* No options */ } if (argc-optind > 11) { @@ -5581,8 +5522,7 @@ int main_networklist(int argc, char **ar int nb, i; SWITCH_FOREACH_OPT(opt, "", NULL, "network-list", 1) { - case 0: case 2: - return opt; + /* No options */ } /* Idx BE MAC Hdl Sta evch txr/rxr BE-path */ @@ -5620,8 +5560,7 @@ int main_networkdetach(int argc, char ** libxl_device_nic nic; SWITCH_FOREACH_OPT(opt, "", NULL, "network-detach", 2) { - case 0: case 2: - return opt; + /* No options */ } domid = find_domain(argv[optind]); @@ -5653,8 +5592,7 @@ int main_blockattach(int argc, char **ar XLU_Config *config = 0; SWITCH_FOREACH_OPT(opt, "", NULL, "block-attach", 2) { - case 0: case 2: - return opt; + /* No options */ } if (domain_qualifier_to_domid(argv[optind], &fe_domid, 0) < 0) { @@ -5690,8 +5628,7 @@ int main_blocklist(int argc, char **argv libxl_diskinfo diskinfo; SWITCH_FOREACH_OPT(opt, "", NULL, "block-list", 1) { - case 0: case 2: - return opt; + /* No options */ } printf("%-5s %-3s %-6s %-5s %-6s %-8s %-30s\n", @@ -5728,8 +5665,7 @@ int main_blockdetach(int argc, char **ar libxl_device_disk disk; SWITCH_FOREACH_OPT(opt, "", NULL, "block-detach", 2) { - case 0: case 2: - return opt; + /* No options */ } domid = find_domain(argv[optind]); @@ -5755,8 +5691,7 @@ int main_vtpmattach(int argc, char **arg uint32_t domid; SWITCH_FOREACH_OPT(opt, "", NULL, "vtpm-attach", 1) { - case 0: case 2: - return opt; + /* No options */ } if (domain_qualifier_to_domid(argv[optind], &domid, 0) < 0) { @@ -5810,8 +5745,7 @@ int main_vtpmlist(int argc, char **argv) int nb, i; SWITCH_FOREACH_OPT(opt, "", NULL, "vtpm-list", 1) { - case 0: case 2: - return opt; + /* No options */ } /* Idx BE UUID Hdl Sta evch rref BE-path */ @@ -5852,8 +5786,7 @@ int main_vtpmdetach(int argc, char **arg libxl_uuid uuid; SWITCH_FOREACH_OPT(opt, "", NULL, "vtpm-detach", 2) { - case 0: case 2: - return opt; + /* No options */ } domid = find_domain(argv[optind]); @@ -6046,8 +5979,6 @@ int main_uptime(int argc, char **argv) int opt; SWITCH_FOREACH_OPT(opt, "s", NULL, "uptime", 1) { - case 0: case 2: - return opt; case ''s'': short_mode = 1; break; @@ -6071,8 +6002,6 @@ int main_tmem_list(int argc, char **argv int opt; SWITCH_FOREACH_OPT(opt, "al", NULL, "tmem-list", 0) { - case 0: case 2: - return opt; case ''l'': use_long = 1; break; @@ -6110,8 +6039,6 @@ int main_tmem_freeze(int argc, char **ar int opt; SWITCH_FOREACH_OPT(opt, "a", NULL, "tmem-freeze", 0) { - case 0: case 2: - return opt; case ''a'': all = 1; break; @@ -6141,8 +6068,6 @@ int main_tmem_thaw(int argc, char **argv int opt; SWITCH_FOREACH_OPT(opt, "a", NULL, "tmem-thaw", 0) { - case 0: case 2: - return opt; case ''a'': all = 1; break; @@ -6174,8 +6099,6 @@ int main_tmem_set(int argc, char **argv) int opt; SWITCH_FOREACH_OPT(opt, "aw:c:p:", NULL, "tmem-set", 0) { - case 0: case 2: - return opt; case ''a'': all = 1; break; @@ -6233,8 +6156,6 @@ int main_tmem_shared_auth(int argc, char int opt; SWITCH_FOREACH_OPT(opt, "au:A:", NULL, "tmem-shared-auth", 0) { - case 0: case 2: - return opt; case ''a'': all = 1; break; @@ -6281,8 +6202,7 @@ int main_tmem_freeable(int argc, char ** int mb; SWITCH_FOREACH_OPT(opt, "", NULL, "tmem-freeale", 0) { - case 0: case 2: - return opt; + /* No options */ } mb = libxl_tmem_freeable(ctx); @@ -6323,8 +6243,6 @@ int main_cpupoolcreate(int argc, char ** int rc = -ERROR_FAIL; SWITCH_FOREACH_OPT(opt, "hnf:", opts, "cpupool-create", 0) { - case 0: case 2: - return opt; case ''f'': filename = optarg; break; @@ -6506,8 +6424,6 @@ int main_cpupoollist(int argc, char **ar int ret = 0; SWITCH_FOREACH_OPT(opt, "hc", opts, "cpupool-list", 1) { - case 0: case 2: - break; case ''c'': opt_cpus = 1; break; @@ -6571,8 +6487,7 @@ int main_cpupooldestroy(int argc, char * uint32_t poolid; SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-destroy", 1) { - case 0: case 2: - return opt; + /* No options */ } pool = argv[optind]; @@ -6594,8 +6509,7 @@ int main_cpupoolrename(int argc, char ** uint32_t poolid; SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-rename", 2) { - case 0: case 2: - return opt; + /* No options */ } pool = argv[optind++]; @@ -6626,8 +6540,7 @@ int main_cpupoolcpuadd(int argc, char ** int n; SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-cpu-add", 2) { - case 0: case 2: - return opt; + /* No options */ } pool = argv[optind++]; @@ -6672,8 +6585,7 @@ int main_cpupoolcpuremove(int argc, char int n; SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-cpu-remove", 2) { - case 0: case 2: - return opt; + /* No options */ } pool = argv[optind++]; @@ -6717,8 +6629,7 @@ int main_cpupoolmigrate(int argc, char * uint32_t domid; SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-migrate", 2) { - case 0: case 2: - return opt; + /* No options */ } dom = argv[optind++]; @@ -6759,8 +6670,7 @@ int main_cpupoolnumasplit(int argc, char libxl_dominfo info; SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-numa-split", 0) { - case 0: case 2: - return opt; + /* No options */ } ret = 0; @@ -7015,8 +6925,6 @@ int main_remus(int argc, char **argv) r_info.compression = 1; SWITCH_FOREACH_OPT(opt, "bui:s:e", NULL, "remus", 2) { - case 0: case 2: - return opt; case ''i'': r_info.interval = atoi(optarg); break;
Ian Campbell
2013-Jan-03 16:27 UTC
Re: [PATCH 3 of 3 V4] xl: SWITCH_FOREACH_OPT handles special options directly
On Thu, 2013-01-03 at 11:39 +0000, Ian Campbell wrote:> # HG changeset patch > # User Ian Campbell <ijc@hellion.org.uk> > # Date 1357213146 0 > # Node ID 0d2f4198f2c3fd6574e9058a528ac5530332b14e > # Parent 1a1a2fa73670fd55004505b18a2b31418dcf447a > xl: SWITCH_FOREACH_OPT handles special options directly. > > This removes the need for the "case 0: case 2:" boilerplate in every > main_foo(). Calls exit(3) directly which is OK since xl cleans up the > context etc in an atexit(3) handler. > > Signed-off-by: Ian Campbell <ian.campbell@citrix.com> > -- > v4: exit() directly instead of returning. > > diff -r 1a1a2fa73670 -r 0d2f4198f2c3 tools/libxl/xl_cmdimpl.c > --- a/tools/libxl/xl_cmdimpl.c Thu Jan 03 11:38:48 2013 +0000 > +++ b/tools/libxl/xl_cmdimpl.c Thu Jan 03 11:39:06 2013 +0000 > @@ -2396,12 +2396,13 @@ static int def_getopt(int argc, char * c > * `lopts`) should be handled by a case statement as if it were inside > * a switch statement. > * > - * In addition to the options provided in opts callers must handle > - * two additional pseudo options: > - * 0 -- generated if the user passes a -h option. help will be printed, > - * caller should immediately return 0. > - * 2 -- generated if the user does not provided `num_required_opts` > - * non-option arguments, caller should immediately return 2. > + * In addition to the options provided in opts the macro will handle > + * the "help" option and enforce a minimum number of non-option > + * command line pearameters as follows: > + * -- if the user passes a -h or --help option. help will be printed, > + * and the macro will cause the process to exit with code 0. > + * -- if the user does not provided `num_required_opts` non-option > + * arguments, the macro will cause the process to exit with code 2. > * > * Example: > * > @@ -2409,8 +2410,6 @@ static int def_getopt(int argc, char * c > * int opt; > * > * SWITCH_FOREACH_OPT(opt, "blah", NULL, "foo", 0) { > - * case 0: case2: > - * return opt; > * case ''b'': > * ... handle b option... > * break; > @@ -2426,6 +2425,8 @@ static int def_getopt(int argc, char * c > commandname, num_required_opts) \ > while (((opt) = def_getopt(argc, argv, (opts), (longopts), \ > (commandname), (num_required_opts))) != -1) \ > + if (opt == 0) exit(0); \ > + if (opt == 2) exit(2); \ > switch (opt)This is bogus due to the lack of a { after the while which leads to an infinite loop (the original case I tested was lucky enough not to hit it...) It''s obviously a brain fart anyway -- I should push the exits down into def_getopt... Ian.
Ian Campbell
2013-Jan-03 16:33 UTC
Re: [PATCH 3 of 3 V4] xl: SWITCH_FOREACH_OPT handles special options directly
On Thu, 2013-01-03 at 16:27 +0000, Ian Campbell wrote:> It''s obviously a brain fart anyway -- I should push the exits down > into def_getopt...V5 of this patch: 8<------------------- # HG changeset patch # User Ian Campbell <ijc@hellion.org.uk> # Date 1357230704 0 # Node ID 7a61269a0c1ab33cc93b47f88d760f0d1f88eaab # Parent 1a1a2fa73670fd55004505b18a2b31418dcf447a xl: SWITCH_FOREACH_OPT handles special options directly. This removes the need for the "case 0: case 2:" boilerplate in every main_foo(). Calls exit(3) directly which is OK since xl cleans up the context etc in an atexit(3) handler. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> -- v5: push exit() into def_getopt to avoid infinite loop. v4: exit() directly instead of returning. diff -r 1a1a2fa73670 -r 7a61269a0c1a tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Thu Jan 03 11:38:48 2013 +0000 +++ b/tools/libxl/xl_cmdimpl.c Thu Jan 03 16:31:44 2013 +0000 @@ -2348,13 +2348,13 @@ static int def_getopt(int argc, char * c while ((opt = getopt_long(argc, argv, optstring, longopts, NULL)) == ''?'') { if (optopt == ''h'') { help(helpstr); - return 0; + exit(0); } fprintf(stderr, "option `%c'' not supported.\n", optopt); } if (opt == ''h'') { help(helpstr); - return 0; + exit(0); } if (opt != -1) return opt; @@ -2363,7 +2363,7 @@ static int def_getopt(int argc, char * c fprintf(stderr, "''xl %s'' requires at least %d argument%s.\n\n", helpstr, reqargs, reqargs > 1 ? "s" : ""); help(helpstr); - return 2; + exit(2); } return -1; } @@ -2396,12 +2396,13 @@ static int def_getopt(int argc, char * c * `lopts`) should be handled by a case statement as if it were inside * a switch statement. * - * In addition to the options provided in opts callers must handle - * two additional pseudo options: - * 0 -- generated if the user passes a -h option. help will be printed, - * caller should immediately return 0. - * 2 -- generated if the user does not provided `num_required_opts` - * non-option arguments, caller should immediately return 2. + * In addition to the options provided in opts the macro will handle + * the "help" option and enforce a minimum number of non-option + * command line pearameters as follows: + * -- if the user passes a -h or --help option. help will be printed, + * and the macro will cause the process to exit with code 0. + * -- if the user does not provided `num_required_opts` non-option + * arguments, the macro will cause the process to exit with code 2. * * Example: * @@ -2409,8 +2410,6 @@ static int def_getopt(int argc, char * c * int opt; * * SWITCH_FOREACH_OPT(opt, "blah", NULL, "foo", 0) { - * case 0: case2: - * return opt; * case ''b'': * ... handle b option... * break; @@ -2452,8 +2451,7 @@ int main_memmax(int argc, char **argv) int rc; SWITCH_FOREACH_OPT(opt, "", NULL, "mem-max", 2) { - case 0: case 2: - return opt; + /* No options */ } domid = find_domain(argv[optind]); @@ -2488,8 +2486,7 @@ int main_memset(int argc, char **argv) const char *mem; SWITCH_FOREACH_OPT(opt, "", NULL, "mem-set", 2) { - case 0: case 2: - return opt; + /* No options */ } domid = find_domain(argv[optind]); @@ -2529,8 +2526,7 @@ int main_cd_eject(int argc, char **argv) const char *virtdev; SWITCH_FOREACH_OPT(opt, "", NULL, "cd-eject", 2) { - case 0: case 2: - return opt; + /* No options */ } domid = find_domain(argv[optind]); @@ -2548,8 +2544,7 @@ int main_cd_insert(int argc, char **argv char *file = NULL; /* modified by cd_insert tokenising it */ SWITCH_FOREACH_OPT(opt, "", NULL, "cd-insert", 3) { - case 0: case 2: - return opt; + /* No options */ } domid = find_domain(argv[optind]); @@ -2567,8 +2562,6 @@ int main_console(int argc, char **argv) libxl_console_type type = 0; SWITCH_FOREACH_OPT(opt, "n:t:", NULL, "console", 1) { - case 0: case 2: - return opt; case ''t'': if (!strcmp(optarg, "pv")) type = LIBXL_CONSOLE_TYPE_PV; @@ -2605,8 +2598,6 @@ int main_vncviewer(int argc, char **argv int opt, autopass = 0; SWITCH_FOREACH_OPT(opt, "ah", opts, "vncviewer", 1) { - case 0: case 2: - return opt; case ''a'': autopass = 1; break; @@ -2643,8 +2634,7 @@ int main_pcilist(int argc, char **argv) int opt; SWITCH_FOREACH_OPT(opt, "", NULL, "pci-list", 1) { - case 0: case 2: - return opt; + /* No options */ } domid = find_domain(argv[optind]); @@ -2684,8 +2674,6 @@ int main_pcidetach(int argc, char **argv const char *bdf = NULL; SWITCH_FOREACH_OPT(opt, "f", NULL, "pci-detach", 2) { - case 0: case 2: - return opt; case ''f'': force = 1; break; @@ -2724,8 +2712,7 @@ int main_pciattach(int argc, char **argv const char *bdf = NULL, *vs = NULL; SWITCH_FOREACH_OPT(opt, "", NULL, "pci-attach", 2) { - case 0: case 2: - return opt; + /* No options */ } domid = find_domain(argv[optind]); @@ -2760,8 +2747,7 @@ int main_pciassignable_list(int argc, ch int opt; SWITCH_FOREACH_OPT(opt, "", NULL, "pci-assignable-list", 0) { - case 0: case 2: - return opt; + /* No options */ } pciassignable_list(); @@ -2794,8 +2780,7 @@ int main_pciassignable_add(int argc, cha const char *bdf = NULL; SWITCH_FOREACH_OPT(opt, "", NULL, "pci-assignable-add", 1) { - case 0: case 2: - return opt; + /* No options */ } bdf = argv[optind]; @@ -2831,8 +2816,6 @@ int main_pciassignable_remove(int argc, int rebind = 0; SWITCH_FOREACH_OPT(opt, "r", NULL, "pci-assignable-remove", 1) { - case 0: case 2: - return opt; case ''r'': rebind=1; break; @@ -3647,8 +3630,6 @@ int main_restore(int argc, char **argv) }; SWITCH_FOREACH_OPT(opt, "FhcpdeVA", opts, "restore", 1) { - case 0: case 2: - return opt; case ''c'': console_autoconnect = 1; break; @@ -3708,8 +3689,6 @@ int main_migrate_receive(int argc, char int opt; SWITCH_FOREACH_OPT(opt, "Fedr", NULL, "migrate-receive", 0) { - case 0: case 2: - return opt; case ''F'': daemonize = 0; break; @@ -3745,8 +3724,6 @@ int main_save(int argc, char **argv) int opt; SWITCH_FOREACH_OPT(opt, "c", NULL, "save", 2) { - case 0: case 2: - return opt; case ''c'': checkpoint = 1; break; @@ -3776,8 +3753,6 @@ int main_migrate(int argc, char **argv) int opt, daemonize = 1, monitor = 1, debug = 0; SWITCH_FOREACH_OPT(opt, "FC:s:ed", NULL, "migrate", 2) { - case 0: case 2: - return opt; case ''C'': config_filename = optarg; break; @@ -3818,8 +3793,7 @@ int main_dump_core(int argc, char **argv int opt; SWITCH_FOREACH_OPT(opt, "", NULL, "dump-core", 2) { - case 0: case 2: - return opt; + /* No options */ } core_dump_domain(find_domain(argv[optind]), argv[optind + 1]); @@ -3831,8 +3805,7 @@ int main_pause(int argc, char **argv) int opt; SWITCH_FOREACH_OPT(opt, "", NULL, "pause", 1) { - case 0: case 2: - return opt; + /* No options */ } pause_domain(find_domain(argv[optind])); @@ -3845,8 +3818,7 @@ int main_unpause(int argc, char **argv) int opt; SWITCH_FOREACH_OPT(opt, "", NULL, "unpause", 1) { - case 0: case 2: - return opt; + /* No options */ } unpause_domain(find_domain(argv[optind])); @@ -3859,8 +3831,7 @@ int main_destroy(int argc, char **argv) int opt; SWITCH_FOREACH_OPT(opt, "", NULL, "destroy", 1) { - case 0: case 2: - return opt; + /* No options */ } destroy_domain(find_domain(argv[optind])); @@ -3884,8 +3855,6 @@ static int main_shutdown_or_reboot(int d }; SWITCH_FOREACH_OPT(opt, "awF", opts, what, 0) { - case 0: case 2: - return opt; case ''a'': all = 1; break; @@ -3966,8 +3935,6 @@ int main_list(int argc, char **argv) int nb_domain, rc; SWITCH_FOREACH_OPT(opt, "lvhZ", opts, "list", 0) { - case 0: case 2: - return opt; case ''l'': details = 1; break; @@ -4023,8 +3990,7 @@ int main_vm_list(int argc, char **argv) int opt; SWITCH_FOREACH_OPT(opt, "", NULL, "vm-list", 0) { - case 0: case 2: - return opt; + /* No options */ } list_vm(); @@ -4056,8 +4022,6 @@ int main_create(int argc, char **argv) } SWITCH_FOREACH_OPT(opt, "Fhnqf:pcdeVA", opts, "create", 0) { - case 0: case 2: - return opt; case ''f'': filename = optarg; break; @@ -4157,8 +4121,6 @@ int main_config_update(int argc, char ** } SWITCH_FOREACH_OPT(opt, "dhqf:", opts, "config_update", 0) { - case 0: case 2: - return opt; case ''d'': debug = 1; break; @@ -4254,8 +4216,7 @@ int main_button_press(int argc, char **a SWITCH_FOREACH_OPT(opt, "", NULL, "button-press", 2) { - case 0: case 2: - return opt; + /* No options */ } button_press(find_domain(argv[optind]), argv[optind + 1]); @@ -4397,8 +4358,7 @@ int main_vcpulist(int argc, char **argv) int opt; SWITCH_FOREACH_OPT(opt, "", NULL, "cpu-list", 0) { - case 0: case 2: - return opt; + /* No options */ } vcpulist(argc - optind, argv + optind); @@ -4460,8 +4420,7 @@ int main_vcpupin(int argc, char **argv) int opt; SWITCH_FOREACH_OPT(opt, "", NULL, "vcpu-pin", 3) { - case 0: case 2: - return opt; + /* No options */ } vcpupin(find_domain(argv[optind]), argv[optind+1] , argv[optind+2]); @@ -4498,8 +4457,7 @@ int main_vcpuset(int argc, char **argv) int opt; SWITCH_FOREACH_OPT(opt, "", NULL, "vcpu-set", 2) { - case 0: case 2: - return opt; + /* No options */ } vcpuset(find_domain(argv[optind]), argv[optind+1]); @@ -4683,8 +4641,6 @@ int main_info(int argc, char **argv) int numa = 0; SWITCH_FOREACH_OPT(opt, "hn", opts, "info", 0) { - case 0: case 2: - return opt; case ''n'': numa = 1; break; @@ -4722,8 +4678,7 @@ int main_sharing(int argc, char **argv) int nb_domain, rc; SWITCH_FOREACH_OPT(opt, "", NULL, "sharing", 0) { - case 0: case 2: - return opt; + /* No options */ } if (optind >= argc) { @@ -5005,8 +4960,6 @@ int main_sched_credit(int argc, char **a }; SWITCH_FOREACH_OPT(opt, "d:w:c:p:t:r:hs", opts, "sched-credit", 0) { - case 0: case 2: - return opt; case ''d'': dom = optarg; break; @@ -5122,8 +5075,6 @@ int main_sched_credit2(int argc, char ** }; SWITCH_FOREACH_OPT(opt, "d:w:p:h", opts, "sched-credit2", 0) { - case 0: case 2: - return opt; case ''d'': dom = optarg; break; @@ -5195,8 +5146,6 @@ int main_sched_sedf(int argc, char **arg }; SWITCH_FOREACH_OPT(opt, "d:p:s:l:e:w:c:h", opts, "sched-sedf", 0) { - case 0: case 2: - return opt; case ''d'': dom = optarg; break; @@ -5290,8 +5239,7 @@ int main_domid(int argc, char **argv) const char *domname = NULL; SWITCH_FOREACH_OPT(opt, "", NULL, "domid", 1) { - case 0: case 2: - return opt; + /* No options */ } domname = argv[optind]; @@ -5314,8 +5262,7 @@ int main_domname(int argc, char **argv) char *endptr = NULL; SWITCH_FOREACH_OPT(opt, "", NULL, "domname", 1) { - case 0: case 2: - return opt; + /* No options */ } domid = strtol(argv[optind], &endptr, 10); @@ -5344,8 +5291,7 @@ int main_rename(int argc, char **argv) const char *dom, *new_name; SWITCH_FOREACH_OPT(opt, "", NULL, "rename", 2) { - case 0: case 2: - return opt; + /* No options */ } dom = argv[optind++]; @@ -5370,8 +5316,7 @@ int main_trigger(int argc, char **argv) libxl_trigger trigger; SWITCH_FOREACH_OPT(opt, "", NULL, "trigger", 2) { - case 0: case 2: - return opt; + /* No options */ } domid = find_domain(argv[optind++]); @@ -5402,8 +5347,7 @@ int main_sysrq(int argc, char **argv) const char *sysrq = NULL; SWITCH_FOREACH_OPT(opt, "", NULL, "sysrq", 2) { - case 0: case 2: - return opt; + /* No options */ } domid = find_domain(argv[optind++]); @@ -5427,8 +5371,7 @@ int main_debug_keys(int argc, char **arg char *keys; SWITCH_FOREACH_OPT(opt, "", NULL, "debug-keys", 1) { - case 0: case 2: - return opt; + /* No options */ } keys = argv[optind]; @@ -5449,8 +5392,6 @@ int main_dmesg(int argc, char **argv) int opt, ret = 1; SWITCH_FOREACH_OPT(opt, "c", NULL, "dmesg", 0) { - case 0: case 2: - return opt; case ''c'': clear = 1; break; @@ -5473,8 +5414,7 @@ int main_top(int argc, char **argv) int opt; SWITCH_FOREACH_OPT(opt, "", NULL, "top", 0) { - case 0: case 2: - return opt; + /* No options */ } return system("xentop"); @@ -5492,8 +5432,7 @@ int main_networkattach(int argc, char ** unsigned int val; SWITCH_FOREACH_OPT(opt, "", NULL, "network-attach", 1) { - case 0: case 2: - return opt; + /* No options */ } if (argc-optind > 11) { @@ -5581,8 +5520,7 @@ int main_networklist(int argc, char **ar int nb, i; SWITCH_FOREACH_OPT(opt, "", NULL, "network-list", 1) { - case 0: case 2: - return opt; + /* No options */ } /* Idx BE MAC Hdl Sta evch txr/rxr BE-path */ @@ -5620,8 +5558,7 @@ int main_networkdetach(int argc, char ** libxl_device_nic nic; SWITCH_FOREACH_OPT(opt, "", NULL, "network-detach", 2) { - case 0: case 2: - return opt; + /* No options */ } domid = find_domain(argv[optind]); @@ -5653,8 +5590,7 @@ int main_blockattach(int argc, char **ar XLU_Config *config = 0; SWITCH_FOREACH_OPT(opt, "", NULL, "block-attach", 2) { - case 0: case 2: - return opt; + /* No options */ } if (domain_qualifier_to_domid(argv[optind], &fe_domid, 0) < 0) { @@ -5690,8 +5626,7 @@ int main_blocklist(int argc, char **argv libxl_diskinfo diskinfo; SWITCH_FOREACH_OPT(opt, "", NULL, "block-list", 1) { - case 0: case 2: - return opt; + /* No options */ } printf("%-5s %-3s %-6s %-5s %-6s %-8s %-30s\n", @@ -5728,8 +5663,7 @@ int main_blockdetach(int argc, char **ar libxl_device_disk disk; SWITCH_FOREACH_OPT(opt, "", NULL, "block-detach", 2) { - case 0: case 2: - return opt; + /* No options */ } domid = find_domain(argv[optind]); @@ -5755,8 +5689,7 @@ int main_vtpmattach(int argc, char **arg uint32_t domid; SWITCH_FOREACH_OPT(opt, "", NULL, "vtpm-attach", 1) { - case 0: case 2: - return opt; + /* No options */ } if (domain_qualifier_to_domid(argv[optind], &domid, 0) < 0) { @@ -5810,8 +5743,7 @@ int main_vtpmlist(int argc, char **argv) int nb, i; SWITCH_FOREACH_OPT(opt, "", NULL, "vtpm-list", 1) { - case 0: case 2: - return opt; + /* No options */ } /* Idx BE UUID Hdl Sta evch rref BE-path */ @@ -5852,8 +5784,7 @@ int main_vtpmdetach(int argc, char **arg libxl_uuid uuid; SWITCH_FOREACH_OPT(opt, "", NULL, "vtpm-detach", 2) { - case 0: case 2: - return opt; + /* No options */ } domid = find_domain(argv[optind]); @@ -6046,8 +5977,6 @@ int main_uptime(int argc, char **argv) int opt; SWITCH_FOREACH_OPT(opt, "s", NULL, "uptime", 1) { - case 0: case 2: - return opt; case ''s'': short_mode = 1; break; @@ -6071,8 +6000,6 @@ int main_tmem_list(int argc, char **argv int opt; SWITCH_FOREACH_OPT(opt, "al", NULL, "tmem-list", 0) { - case 0: case 2: - return opt; case ''l'': use_long = 1; break; @@ -6110,8 +6037,6 @@ int main_tmem_freeze(int argc, char **ar int opt; SWITCH_FOREACH_OPT(opt, "a", NULL, "tmem-freeze", 0) { - case 0: case 2: - return opt; case ''a'': all = 1; break; @@ -6141,8 +6066,6 @@ int main_tmem_thaw(int argc, char **argv int opt; SWITCH_FOREACH_OPT(opt, "a", NULL, "tmem-thaw", 0) { - case 0: case 2: - return opt; case ''a'': all = 1; break; @@ -6174,8 +6097,6 @@ int main_tmem_set(int argc, char **argv) int opt; SWITCH_FOREACH_OPT(opt, "aw:c:p:", NULL, "tmem-set", 0) { - case 0: case 2: - return opt; case ''a'': all = 1; break; @@ -6233,8 +6154,6 @@ int main_tmem_shared_auth(int argc, char int opt; SWITCH_FOREACH_OPT(opt, "au:A:", NULL, "tmem-shared-auth", 0) { - case 0: case 2: - return opt; case ''a'': all = 1; break; @@ -6281,8 +6200,7 @@ int main_tmem_freeable(int argc, char ** int mb; SWITCH_FOREACH_OPT(opt, "", NULL, "tmem-freeale", 0) { - case 0: case 2: - return opt; + /* No options */ } mb = libxl_tmem_freeable(ctx); @@ -6323,8 +6241,6 @@ int main_cpupoolcreate(int argc, char ** int rc = -ERROR_FAIL; SWITCH_FOREACH_OPT(opt, "hnf:", opts, "cpupool-create", 0) { - case 0: case 2: - return opt; case ''f'': filename = optarg; break; @@ -6506,8 +6422,6 @@ int main_cpupoollist(int argc, char **ar int ret = 0; SWITCH_FOREACH_OPT(opt, "hc", opts, "cpupool-list", 1) { - case 0: case 2: - break; case ''c'': opt_cpus = 1; break; @@ -6571,8 +6485,7 @@ int main_cpupooldestroy(int argc, char * uint32_t poolid; SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-destroy", 1) { - case 0: case 2: - return opt; + /* No options */ } pool = argv[optind]; @@ -6594,8 +6507,7 @@ int main_cpupoolrename(int argc, char ** uint32_t poolid; SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-rename", 2) { - case 0: case 2: - return opt; + /* No options */ } pool = argv[optind++]; @@ -6626,8 +6538,7 @@ int main_cpupoolcpuadd(int argc, char ** int n; SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-cpu-add", 2) { - case 0: case 2: - return opt; + /* No options */ } pool = argv[optind++]; @@ -6672,8 +6583,7 @@ int main_cpupoolcpuremove(int argc, char int n; SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-cpu-remove", 2) { - case 0: case 2: - return opt; + /* No options */ } pool = argv[optind++]; @@ -6717,8 +6627,7 @@ int main_cpupoolmigrate(int argc, char * uint32_t domid; SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-migrate", 2) { - case 0: case 2: - return opt; + /* No options */ } dom = argv[optind++]; @@ -6759,8 +6668,7 @@ int main_cpupoolnumasplit(int argc, char libxl_dominfo info; SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-numa-split", 0) { - case 0: case 2: - return opt; + /* No options */ } ret = 0; @@ -7015,8 +6923,6 @@ int main_remus(int argc, char **argv) r_info.compression = 1; SWITCH_FOREACH_OPT(opt, "bui:s:e", NULL, "remus", 2) { - case 0: case 2: - return opt; case ''i'': r_info.interval = atoi(optarg); break;
Ian Campbell
2013-Jan-24 11:55 UTC
Re: [PATCH 0 of 3 V4] xl: add helpers for option parsing
ping? The first is acked but the 2nd and 3rd remain not. On Thu, 2013-01-03 at 11:39 +0000, Ian Campbell wrote:> This is a repost of the last two patches of "xl shutdown compatibility > with xm" which were actually helpers for xl option parsing. > > I''ve addressed Ian J''s review comments on the second patch and rebased. > > I''ve added a third patch which makes the macro handle the 0 and 2 > cases internally. In this new series this now exits directly instead > of returning. > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xen.org > http://lists.xen.org/xen-devel
Ian Jackson
2013-Jan-24 12:07 UTC
Re: [PATCH 0 of 3 V4] xl: add helpers for option parsing
Ian Campbell writes ("Re: [Xen-devel] [PATCH 0 of 3 V4] xl: add helpers for option parsing"):> ping? The first is acked but the 2nd and 3rd remain not.I wouldn''t have structured the series like this but you can have my ack for both of them provided you actualy apply all three. (Normally I think acking a series would indicate approval of all initial subsets...) Acked-by: Ian Jackson <ian.jackson@eu.citrix.com> Ian.
Ian Campbell
2013-Jan-25 10:03 UTC
Re: [PATCH 0 of 3 V4] xl: add helpers for option parsing
On Thu, 2013-01-24 at 12:07 +0000, Ian Jackson wrote:> Ian Campbell writes ("Re: [Xen-devel] [PATCH 0 of 3 V4] xl: add helpers for option parsing"): > > ping? The first is acked but the 2nd and 3rd remain not. > > I wouldn''t have structured the series like this but you can have my > ack for both of them provided you actualy apply all three. (Normally > I think acking a series would indicate approval of all initial > subsets...) > > Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>Applied, thanks.> > Ian.