/* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once #include #include #include #include "sd-id128.h" #include "string-util.h" typedef enum BootEntryType { BOOT_ENTRY_CONF, /* Type #1 entries: *.conf files */ BOOT_ENTRY_UNIFIED, /* Type #2 entries: *.efi files */ BOOT_ENTRY_LOADER, /* Additional entries augmented from LoaderEntries EFI var */ _BOOT_ENTRY_MAX, _BOOT_ENTRY_INVALID = -1, } BootEntryType; typedef struct BootEntry { BootEntryType type; char *id; /* This is the file basename without extension */ char *id_old; /* Old-style ID, for deduplication purposes. */ char *path; /* This is the full path to the drop-in file */ char *root; /* The root path in which the drop-in was found, i.e. to which 'kernel', 'efi' and 'initrd' are relative */ char *title; char *show_title; char *version; char *machine_id; char *architecture; char **options; char *kernel; /* linux is #defined to 1, yikes! */ char *efi; char **initrd; char *device_tree; } BootEntry; typedef struct BootConfig { char *default_pattern; char *timeout; char *editor; char *auto_entries; char *auto_firmware; char *console_mode; char *random_seed_mode; char *entry_oneshot; char *entry_default; BootEntry *entries; size_t n_entries; ssize_t default_entry; } BootConfig; static inline bool boot_config_has_entry(BootConfig *config, const char *id) { size_t j; for (j = 0; j < config->n_entries; j++) { const char* entry_id_old = config->entries[j].id_old; if (streq(config->entries[j].id, id) || (entry_id_old && streq(entry_id_old, id))) return true; } return false; } static inline BootEntry* boot_config_default_entry(BootConfig *config) { if (config->default_entry < 0) return NULL; return config->entries + config->default_entry; } void boot_config_free(BootConfig *config); int boot_entries_load_config(const char *esp_path, const char *xbootldr_path, BootConfig *config); int boot_entries_load_config_auto(const char *override_esp_path, const char *override_xbootldr_path, BootConfig *config); int boot_entries_augment_from_loader(BootConfig *config, char **list, bool only_auto); static inline const char* boot_entry_title(const BootEntry *entry) { return entry->show_title ?: entry->title ?: entry->id; } int find_esp_and_warn(const char *path, bool unprivileged_mode, char **ret_path, uint32_t *ret_part, uint64_t *ret_pstart, uint64_t *ret_psize, sd_id128_t *ret_uuid); int find_xbootldr_and_warn(const char *path, bool unprivileged_mode, char **ret_path,sd_id128_t *ret_uuid);