From 70013eb56ddaacb518aeb4d7d35f627c5387d557 Mon Sep 17 00:00:00 2001 From: Andreas Schmidt Date: Wed, 2 May 2018 15:23:56 +0200 Subject: blspec: add checking of optional key machine-id For filtering of Bootloader Spec entries, Bootloader Spec specify an optional key machine-id. By set the global.boot.machine-id variable the checking of machine-id key in Bootloader Spec entries will be activate. If the variable and key match, appropriate boot entry will be booting. If it not match boot entry will be ignore and barebox check the next boot entry. Signed-off-by: Andreas Schmidt Signed-off-by: Sascha Hauer --- Documentation/user/booting-linux.rst | 6 ++++++ common/blspec.c | 31 ++++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/Documentation/user/booting-linux.rst b/Documentation/user/booting-linux.rst index b5e4320ef6..408f87d8e8 100644 --- a/Documentation/user/booting-linux.rst +++ b/Documentation/user/booting-linux.rst @@ -212,6 +212,12 @@ The entry can be listed with the -l option: When on barebox the SD card shows up as ``mmc1`` then this entry can be booted with ``boot mmc1`` or with setting ``global.boot.default`` to ``mmc1``. +``machine-id`` is an optional key. If ``global.boot.machine_id`` variable is set to +non-empty value, then barebox accepts only Bootloader Spec entries with ``machine-id`` +key. In case if value of global variable and Bootloader Spec key match each other, +barebox will choose the boot entry for booting. All other Bootloader Spec entries will +be ignored. + A bootloader spec entry can also reside on an NFS server in which case a RFC2224 compatible NFS URI string must be passed to the boot command: diff --git a/common/blspec.c b/common/blspec.c index 6171461a72..2c682e1990 100644 --- a/common/blspec.c +++ b/common/blspec.c @@ -419,6 +419,30 @@ out: return ret; } +/* + * entry_is_match_machine_id - check if a bootspec entry is match with + * the machine id given by global variable. + * + * returns true if the entry is match, false otherwise + */ + +static bool entry_is_match_machine_id(struct blspec_entry *entry) +{ + int ret = true; + const char *env_machineid = getenv_nonempty("global.boot.machine_id"); + + if (env_machineid) { + const char *machineid = blspec_entry_var_get(entry, "machine-id"); + if (!machineid || strcmp(machineid, env_machineid)) { + pr_debug("ignoring entry with missmatched machine-id " \ + "\"%s\" != \"%s\"\n", env_machineid, machineid); + ret = false; + } + } + + return ret; +} + /* * blspec_scan_directory - scan over a directory * @@ -504,6 +528,11 @@ int blspec_scan_directory(struct bootentries *bootentries, const char *root) continue; } + if (!entry_is_match_machine_id(entry)) { + blspec_entry_free(&entry->entry); + continue; + } + found++; if (entry->cdev && entry->cdev->dev) { @@ -756,4 +785,4 @@ static int blspec_init(void) { return bootentry_register_provider(blspec_bootentry_provider); } -device_initcall(blspec_init); \ No newline at end of file +device_initcall(blspec_init); -- cgit v1.2.3