From 7c2dbf684bb58a39f3a5aad1a1f1bd11c7b83713 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Wed, 19 Mar 2014 10:47:30 +0100 Subject: boot command: honour global.boot.default also for -l and -m The boot command is expected to work on bootsources from the commandline if given, on global.boot.default otherwise. Fix this behaviour for the -m and -l options also. Signed-off-by: Sascha Hauer --- commands/boot.c | 79 +++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 48 insertions(+), 31 deletions(-) (limited to 'commands/boot.c') diff --git a/commands/boot.c b/commands/boot.c index bb8d07fce4..9c7aa213c3 100644 --- a/commands/boot.c +++ b/commands/boot.c @@ -333,9 +333,11 @@ static int boot(const char *name) static int do_boot(int argc, char *argv[]) { - const char *sources = NULL; - char *source, *freep; + char *freep = NULL; int opt, ret = 0, do_list = 0, do_menu = 0; + char **sources; + int num_sources; + int i; verbose = 0; dryrun = 0; @@ -361,47 +363,62 @@ static int do_boot(int argc, char *argv[]) } } - if (do_list) { - bootsources_list(&argv[optind], argc - optind); - return 0; - } + if (optind < argc) { + num_sources = argc - optind; + sources = xmemdup(&argv[optind], sizeof(char *) * num_sources); + } else { + const char *def; + char *sep; - if (do_menu) { - bootsources_menu(&argv[optind], argc - optind); - return 0; - } + def = getenv("global.boot.default"); + if (!def) + return 0; - if (optind < argc) { - while (optind < argc) { - source = argv[optind]; - optind++; - ret = boot(source); - if (!ret) + sep = freep = xstrdup(def); + + num_sources = 0; + + while (1) { + num_sources++; + + sep = strchr(sep, ' '); + if (!sep) break; + sep++; + } + + sources = xmalloc(sizeof(char *) * num_sources); + + sep = freep; + + for (i = 0; i < num_sources; i++) { + sources[i] = sep; + sep = strchr(sep, ' '); + if (sep) + *sep = 0; + sep++; } - return ret; } - sources = getenv("global.boot.default"); - if (!sources) - return 0; + if (do_list) { + bootsources_list(sources, num_sources); + goto out; + } - freep = source = xstrdup(sources); + if (do_menu) { + bootsources_menu(sources, num_sources); + goto out; + } - while (1) { - char *sep = strchr(source, ' '); - if (sep) - *sep = 0; - ret = boot(source); + for (i = 0; i < num_sources; i++) { + ret = boot(sources[i]); if (!ret) break; - - if (sep) - source = sep + 1; - else - break; + goto out; } +out: + free(sources); free(freep); return ret; -- cgit v1.2.3