mirror of
https://github.com/systemd/systemd
synced 2025-10-05 16:03:15 +02:00
shared/bootspec: don't warn for new loader.conf
options and correctly parse new uki
and profile
boot entry options (#39165)
Commite2a3d56218
added the `uki` option to sd-boot, and1e9c9773b9
added `profile`, but because these were not added in src/shared/bootspec, bootctl still shows warnings like `Unknown line 'uki', ignoring.` when parsing the config. This PR allows parsing and displaying them correctly in `bootctl` output. It also stops it from printing a warning for any of the new `loader.conf` options (`log-level`, `reboot-on-error`, etc.). Note that `uki-url` is still not handled as I can't easily test it.
This commit is contained in:
@@ -1013,6 +1013,8 @@ static void config_defaults_load_from_file(Config *config, char *content) {
|
||||
assert(config);
|
||||
assert(content);
|
||||
|
||||
/* If you add, remove, or change an option name here, please also update
|
||||
* shared/bootspec.c@boot_loader_read_conf() to make parsing by bootctl/logind/etc. work. */
|
||||
while ((line = line_get_key_value(content, " \t", &pos, &key, &value)))
|
||||
if (streq8(key, "timeout")) {
|
||||
if (streq8(value, "menu-disabled"))
|
||||
@@ -1291,6 +1293,8 @@ static void boot_entry_add_type1(
|
||||
.call = call_image_start,
|
||||
};
|
||||
|
||||
/* If you add, remove, or change an option name here, please also update shared/bootspec.c and
|
||||
* shared/varlink-io.systemd.BootControl to make parsing by bootctl/logind/etc. work. */
|
||||
while ((line = line_get_key_value(content, " \t", &pos, &key, &value)))
|
||||
if (streq8(key, "title")) {
|
||||
free(entry->title);
|
||||
@@ -1299,6 +1303,7 @@ static void boot_entry_add_type1(
|
||||
} else if (streq8(key, "sort-key")) {
|
||||
free(entry->sort_key);
|
||||
entry->sort_key = xstr8_to_16(value);
|
||||
|
||||
} else if (streq8(key, "profile")) {
|
||||
uint64_t u;
|
||||
if (parse_number8(value, &u, NULL) && u <= UINT_MAX)
|
||||
|
@@ -732,6 +732,9 @@ static int count_known_files(const BootConfig *config, const char* root, Hashmap
|
||||
if (r < 0)
|
||||
return r;
|
||||
r = ref_file(&known_files, e->efi, +1);
|
||||
if (r < 0)
|
||||
return r;
|
||||
r = ref_file(&known_files, e->uki, +1);
|
||||
if (r < 0)
|
||||
return r;
|
||||
STRV_FOREACH(s, e->initrd) {
|
||||
@@ -792,6 +795,7 @@ static int unlink_entry(const BootConfig *config, const char *root, const char *
|
||||
|
||||
deref_unlink_file(&known_files, e->kernel, e->root);
|
||||
deref_unlink_file(&known_files, e->efi, e->root);
|
||||
deref_unlink_file(&known_files, e->uki, e->root);
|
||||
STRV_FOREACH(s, e->initrd)
|
||||
deref_unlink_file(&known_files, *s, e->root);
|
||||
deref_unlink_file(&known_files, e->device_tree, e->root);
|
||||
|
@@ -93,6 +93,7 @@ static void boot_entry_free(BootEntry *entry) {
|
||||
boot_entry_addons_done(&entry->local_addons);
|
||||
free(entry->kernel);
|
||||
free(entry->efi);
|
||||
free(entry->uki);
|
||||
strv_free(entry->initrd);
|
||||
free(entry->device_tree);
|
||||
strv_free(entry->device_tree_overlay);
|
||||
@@ -403,6 +404,10 @@ static int boot_entry_load_type1(
|
||||
r = parse_path_one(tmp.path, line, field, &tmp.kernel, p);
|
||||
else if (streq(field, "efi"))
|
||||
r = parse_path_one(tmp.path, line, field, &tmp.efi, p);
|
||||
else if (streq(field, "uki"))
|
||||
r = parse_path_one(tmp.path, line, field, &tmp.uki, p);
|
||||
else if (streq(field, "profile"))
|
||||
r = safe_atou_full(p, 10, &tmp.profile);
|
||||
else if (streq(field, "initrd"))
|
||||
r = parse_path_strv(tmp.path, line, field, &tmp.initrd, p);
|
||||
else if (streq(field, "devicetree"))
|
||||
@@ -511,7 +516,8 @@ int boot_loader_read_conf(BootConfig *config, FILE *file, const char *path) {
|
||||
r = free_and_strdup(&config->default_pattern, p);
|
||||
else if (STR_IN_SET(field, "timeout", "editor", "auto-entries", "auto-firmware",
|
||||
"auto-poweroff", "auto-reboot", "beep", "reboot-for-bitlocker",
|
||||
"secure-boot-enroll", "console-mode"))
|
||||
"reboot-on-error", "secure-boot-enroll", "secure-boot-enroll-action",
|
||||
"secure-boot-enroll-timeout-sec", "console-mode", "log-level"))
|
||||
r = 0; /* we don't parse these in userspace, but they are OK */
|
||||
else {
|
||||
log_syntax(NULL, LOG_WARNING, path, line, 0, "Unknown line '%s', ignoring.", field);
|
||||
@@ -1628,6 +1634,7 @@ int boot_config_augment_from_loader(
|
||||
.reported_by_loader = true,
|
||||
.tries_left = UINT_MAX,
|
||||
.tries_done = UINT_MAX,
|
||||
.profile = UINT_MAX,
|
||||
.global_addons = &no_addons,
|
||||
};
|
||||
}
|
||||
@@ -1896,6 +1903,10 @@ int show_boot_entry(
|
||||
boot_entry_file_list("linux", e->root, e->kernel, &status);
|
||||
if (e->efi)
|
||||
boot_entry_file_list("efi", e->root, e->efi, &status);
|
||||
if (e->uki)
|
||||
boot_entry_file_list("uki", e->root, e->uki, &status);
|
||||
if (e->profile != UINT_MAX)
|
||||
printf(" profile: %u\n", e->profile);
|
||||
|
||||
STRV_FOREACH(s, e->initrd)
|
||||
boot_entry_file_list(s == e->initrd ? "initrd" : NULL,
|
||||
@@ -1957,9 +1968,9 @@ int boot_entry_to_json(const BootConfig *c, size_t i, sd_json_variant **ret) {
|
||||
SD_JSON_BUILD_PAIR_CONDITION(!!opts, "options", SD_JSON_BUILD_STRING(opts)),
|
||||
SD_JSON_BUILD_PAIR_CONDITION(!!e->kernel, "linux", SD_JSON_BUILD_STRING(e->kernel)),
|
||||
SD_JSON_BUILD_PAIR_CONDITION(!!e->efi, "efi", SD_JSON_BUILD_STRING(e->efi)),
|
||||
SD_JSON_BUILD_PAIR_CONDITION(!strv_isempty(e->initrd), "initrd", SD_JSON_BUILD_STRV(e->initrd)),
|
||||
SD_JSON_BUILD_PAIR_CONDITION(!!e->device_tree, "devicetree", SD_JSON_BUILD_STRING(e->device_tree)),
|
||||
SD_JSON_BUILD_PAIR_CONDITION(!strv_isempty(e->device_tree_overlay), "devicetreeOverlay", SD_JSON_BUILD_STRV(e->device_tree_overlay)));
|
||||
SD_JSON_BUILD_PAIR_CONDITION(!!e->uki, "uki", SD_JSON_BUILD_STRING(e->uki)),
|
||||
SD_JSON_BUILD_PAIR_CONDITION(e->profile != UINT_MAX, "profile", SD_JSON_BUILD_UNSIGNED(e->profile)),
|
||||
SD_JSON_BUILD_PAIR_CONDITION(!strv_isempty(e->initrd), "initrd", SD_JSON_BUILD_STRV(e->initrd)));
|
||||
if (r < 0)
|
||||
return log_oom();
|
||||
|
||||
@@ -1968,6 +1979,8 @@ int boot_entry_to_json(const BootConfig *c, size_t i, sd_json_variant **ret) {
|
||||
* at once. */
|
||||
r = sd_json_variant_merge_objectbo(
|
||||
&v,
|
||||
SD_JSON_BUILD_PAIR_CONDITION(!!e->device_tree, "devicetree", SD_JSON_BUILD_STRING(e->device_tree)),
|
||||
SD_JSON_BUILD_PAIR_CONDITION(!strv_isempty(e->device_tree_overlay), "devicetreeOverlay", SD_JSON_BUILD_STRV(e->device_tree_overlay)),
|
||||
SD_JSON_BUILD_PAIR("isReported", SD_JSON_BUILD_BOOLEAN(e->reported_by_loader)),
|
||||
SD_JSON_BUILD_PAIR_CONDITION(e->tries_left != UINT_MAX, "triesLeft", SD_JSON_BUILD_UNSIGNED(e->tries_left)),
|
||||
SD_JSON_BUILD_PAIR_CONDITION(e->tries_done != UINT_MAX, "triesDone", SD_JSON_BUILD_UNSIGNED(e->tries_done)),
|
||||
|
@@ -50,6 +50,7 @@ typedef struct BootEntry {
|
||||
const BootEntryAddons *global_addons; /* Backpointer into the BootConfig; we don't own this here */
|
||||
char *kernel; /* linux is #defined to 1, yikes! */
|
||||
char *efi;
|
||||
char *uki;
|
||||
char **initrd;
|
||||
char *device_tree;
|
||||
char **device_tree_overlay;
|
||||
@@ -64,6 +65,7 @@ typedef struct BootEntry {
|
||||
.source = (s), \
|
||||
.tries_left = UINT_MAX, \
|
||||
.tries_done = UINT_MAX, \
|
||||
.profile = UINT_MAX, \
|
||||
}
|
||||
|
||||
typedef struct BootConfig {
|
||||
|
@@ -47,6 +47,8 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE(
|
||||
SD_VARLINK_DEFINE_FIELD(options, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
||||
SD_VARLINK_DEFINE_FIELD(linux, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
||||
SD_VARLINK_DEFINE_FIELD(efi, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
||||
SD_VARLINK_DEFINE_FIELD(uki, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
||||
SD_VARLINK_DEFINE_FIELD(profile, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
|
||||
SD_VARLINK_DEFINE_FIELD(initrd, SD_VARLINK_STRING, SD_VARLINK_NULLABLE|SD_VARLINK_ARRAY),
|
||||
SD_VARLINK_DEFINE_FIELD(devicetree, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
|
||||
SD_VARLINK_DEFINE_FIELD(devicetreeOverlay, SD_VARLINK_STRING, SD_VARLINK_NULLABLE|SD_VARLINK_ARRAY),
|
||||
|
Reference in New Issue
Block a user