summaryrefslogtreecommitdiffstats
path: root/commands/boot.c
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2014-03-19 10:47:30 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2014-03-19 16:17:54 +0100
commit7c2dbf684bb58a39f3a5aad1a1f1bd11c7b83713 (patch)
tree9ed9e8382b8253d98eaeced2681e14b306e5727b /commands/boot.c
parent5a6410edd7fcbd16c7c637a22a8bab7dcaeda402 (diff)
downloadbarebox-7c2dbf684bb58a39f3a5aad1a1f1bd11c7b83713.tar.gz
barebox-7c2dbf684bb58a39f3a5aad1a1f1bd11c7b83713.tar.xz
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 <s.hauer@pengutronix.de>
Diffstat (limited to 'commands/boot.c')
-rw-r--r--commands/boot.c79
1 files changed, 48 insertions, 31 deletions
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;