for (size_t i = 0; i < config->n_entries; i++)
boot_entry_free(config->entries + i);
free(config->entries);
+ free(config->global_addons.items);
set_free(config->inodes_seen);
}
return 0;
}
+static int boot_entries_find_unified_global_addons(
+ BootConfig *config,
+ const char *root,
+ const char *d_name) {
+
+ int r;
+ _cleanup_closedir_ DIR *d = NULL;
+
+ r = chase_and_opendir(root, NULL, CHASE_PROHIBIT_SYMLINKS, NULL, &d);
+ if (r == -ENOENT)
+ return 0;
+ if (r < 0)
+ return log_error_errno(r, "Failed to open '%s/%s': %m", root, d_name);
+
+ return boot_entries_find_unified_addons(config, dirfd(d), d_name, root, &config->global_addons);
+}
+
static int boot_entries_find_unified_local_addons(
BootConfig *config,
int d_fd,
int r;
assert(config);
+ config->global_addons = (BootEntryAddons) {};
if (esp_path) {
r = boot_loader_read_conf_path(config, esp_path, "/loader/loader.conf");
r = boot_entries_find_unified(config, esp_path, "/EFI/Linux/");
if (r < 0)
return r;
+
+ r = boot_entries_find_unified_global_addons(config, esp_path, "/loader/addons/");
+ if (r < 0)
+ return r;
}
if (xbootldr_path) {
printf(" cmdline: %s%s\n", special_glyph(SPECIAL_GLYPH_TREE_RIGHT), addon->cmdline);
}
-static int print_cmdline(const BootEntry *e) {
+static int print_cmdline(
+ const BootEntry *e,
+ const BootEntryAddons *global_arr) {
+
_cleanup_free_ char *final_cmdline = NULL;
assert(e);
final_cmdline = TAKE_PTR(t2);
}
+ FOREACH_ARRAY(addon, global_arr->items, global_arr->count) {
+ print_addon(addon, "globalAddon");
+ if (!strextend(&final_cmdline, " ", addon->cmdline))
+ return log_oom();
+ }
+
FOREACH_ARRAY(addon, e->local_addons.items, e->local_addons.count) {
/* Add space at the beginning of addon_str to align it correctly */
print_addon(addon, " localAddon");
return 0;
}
-static int json_cmdline(const BootEntry *e, JsonVariant **v) {
+static int json_cmdline(
+ const BootEntry *e,
+ const BootEntryAddons *global_arr,
+ JsonVariant **v) {
+
_cleanup_free_ char *final_cmdline = NULL, *def_cmdline = NULL;
_cleanup_(json_variant_unrefp) JsonVariant *addons_array = NULL;
int r;
final_cmdline = TAKE_PTR(def_cmdline);
}
+ FOREACH_ARRAY(addon, global_arr->items, global_arr->count) {
+ r = json_addon(addon, "globalAddon", &addons_array);
+ if (r < 0)
+ return r;
+ if (!strextend(&final_cmdline, " ", addon->cmdline))
+ return log_oom();
+ }
+
FOREACH_ARRAY(addon, e->local_addons.items, e->local_addons.count) {
r = json_addon(addon, "localAddon", &addons_array);
if (r < 0)
int show_boot_entry(
const BootEntry *e,
+ const BootEntryAddons *global_addons,
bool show_as_default,
bool show_as_selected,
bool show_reported) {
*s,
&status);
- r = print_cmdline(e);
+ r = print_cmdline(e, global_addons);
if (r < 0)
return r;
if (r < 0)
return log_oom();
- r = json_cmdline(e, &v);
+ r = json_cmdline(e, &config->global_addons, &v);
if (r < 0)
return log_oom();
for (size_t n = 0; n < config->n_entries; n++) {
r = show_boot_entry(
config->entries + n,
+ &config->global_addons,
/* show_as_default= */ n == (size_t) config->default_entry,
/* show_as_selected= */ n == (size_t) config->selected_entry,
/* show_discovered= */ true);