bootspec: drop ".conf" from BootEntry.filename

The boot loader systemd-boot removes ".conf" from file name of entry
configs, and determine which entry is the default entry.
However, bootspec, which is used by systemctl and bootctl did not
remove ".conf", then sometimes bootctl marks wrong entry as default.
This fixes the logic to choose the default entry in bootspec, to
match the logic used in systemd-boot boot loader.

Fixes #7727.
This commit is contained in:
Yu Watanabe 2017-12-26 09:35:35 +09:00 committed by Lennart Poettering
parent 7629744a3d
commit 263195c6dd

View File

@ -52,22 +52,30 @@ void boot_entry_free(BootEntry *entry) {
}
int boot_entry_load(const char *path, BootEntry *entry) {
_cleanup_(boot_entry_free) BootEntry tmp = {};
_cleanup_fclose_ FILE *f = NULL;
unsigned line = 1;
_cleanup_(boot_entry_free) BootEntry tmp = {};
char *b, *c;
int r;
assert(path);
assert(entry);
c = endswith_no_case(path, ".conf");
if (!c) {
log_error("Invalid loader entry filename: %s", path);
return -EINVAL;
}
b = basename(path);
tmp.filename = strndup(b, c - b);
if (!tmp.filename)
return log_oom();
f = fopen(path, "re");
if (!f)
return log_error_errno(errno, "Failed to open \"%s\": %m", path);
tmp.filename = strdup(basename(path));
if (!tmp.filename)
return log_oom();
for (;;) {
_cleanup_free_ char *buf = NULL;
char *p;