From: William Manley Date: Tue, 14 Jul 2020 11:53:17 +0000 (+0100) Subject: Refactor `ostree_sysroot_query_bootloader` X-Git-Tag: archive/raspbian/2022.1-3+rpi1~1^2~4^2~6^2~12^2~3 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=a8dce46b5fb7d19e554ecaec994f51f4269de9ea;p=ostree.git Refactor `ostree_sysroot_query_bootloader` This is more regular, so will make it easier to add more bootloader types in the future. --- diff --git a/src/libostree/ostree-sysroot.c b/src/libostree/ostree-sysroot.c index 265d39d1..a69984b7 100644 --- a/src/libostree/ostree-sysroot.c +++ b/src/libostree/ostree-sysroot.c @@ -1325,6 +1325,31 @@ ostree_sysroot_repo (OstreeSysroot *self) return self->repo; } +static OstreeBootloader* +_ostree_sysroot_new_bootloader_by_type ( + OstreeSysroot *sysroot, + OstreeCfgSysrootBootloaderOpt bl_type) +{ + switch (bl_type) + { + case CFG_SYSROOT_BOOTLOADER_OPT_NONE: + /* No bootloader specified; do not query bootloaders to run. */ + return NULL; + case CFG_SYSROOT_BOOTLOADER_OPT_GRUB2: + return (OstreeBootloader*) _ostree_bootloader_grub2_new (sysroot); + case CFG_SYSROOT_BOOTLOADER_OPT_SYSLINUX: + return (OstreeBootloader*) _ostree_bootloader_syslinux_new (sysroot); + case CFG_SYSROOT_BOOTLOADER_OPT_UBOOT: + return (OstreeBootloader*) _ostree_bootloader_uboot_new (sysroot); + case CFG_SYSROOT_BOOTLOADER_OPT_ZIPL: + /* We never consider zipl as active by default, so it can only be created + * if it's explicitly requested in the config */ + return (OstreeBootloader*) _ostree_bootloader_zipl_new (sysroot); + default: + g_assert_not_reached (); + } +} + /** * ostree_sysroot_query_bootloader: * @sysroot: Sysroot @@ -1346,58 +1371,31 @@ _ostree_sysroot_query_bootloader (OstreeSysroot *sysroot, CFG_SYSROOT_BOOTLOADER_OPTS_STR[bootloader_config]); g_autoptr(OstreeBootloader) ret_loader = NULL; - switch (repo->bootloader) + if (bootloader_config == CFG_SYSROOT_BOOTLOADER_OPT_AUTO) { - case CFG_SYSROOT_BOOTLOADER_OPT_NONE: - /* No bootloader specified; do not query bootloaders to run. */ - ret_loader = NULL; - break; - case CFG_SYSROOT_BOOTLOADER_OPT_GRUB2: - ret_loader = (OstreeBootloader*) _ostree_bootloader_grub2_new (sysroot); - break; - case CFG_SYSROOT_BOOTLOADER_OPT_SYSLINUX: - ret_loader = (OstreeBootloader*) _ostree_bootloader_syslinux_new (sysroot); - break; - case CFG_SYSROOT_BOOTLOADER_OPT_UBOOT: - ret_loader = (OstreeBootloader*) _ostree_bootloader_uboot_new (sysroot); - break; - case CFG_SYSROOT_BOOTLOADER_OPT_ZIPL: - /* We never consider zipl as active by default, so it can only be created - * if it's explicitly requested in the config */ - ret_loader = (OstreeBootloader*) _ostree_bootloader_zipl_new (sysroot); - break; - case CFG_SYSROOT_BOOTLOADER_OPT_AUTO: - { - gboolean is_active; - ret_loader = (OstreeBootloader*)_ostree_bootloader_syslinux_new (sysroot); - if (!_ostree_bootloader_query (ret_loader, &is_active, - cancellable, error)) - return FALSE; - - if (!is_active) - { - g_object_unref (ret_loader); - ret_loader = (OstreeBootloader*)_ostree_bootloader_grub2_new (sysroot); - if (!_ostree_bootloader_query (ret_loader, &is_active, - cancellable, error)) - return FALSE; - } - if (!is_active) - { - g_object_unref (ret_loader); - ret_loader = (OstreeBootloader*)_ostree_bootloader_uboot_new (sysroot); - if (!_ostree_bootloader_query (ret_loader, &is_active, cancellable, error)) - return FALSE; - } - if (!is_active) - g_clear_object (&ret_loader); - break; - } - default: - g_assert_not_reached (); + OstreeCfgSysrootBootloaderOpt probe[] = { + CFG_SYSROOT_BOOTLOADER_OPT_SYSLINUX, + CFG_SYSROOT_BOOTLOADER_OPT_GRUB2, + CFG_SYSROOT_BOOTLOADER_OPT_UBOOT, + }; + for (int i = 0; i < G_N_ELEMENTS (probe); i++) + { + g_autoptr(OstreeBootloader) bl = _ostree_sysroot_new_bootloader_by_type ( + sysroot, probe[i]); + gboolean is_active = FALSE; + if (!_ostree_bootloader_query (bl, &is_active, cancellable, error)) + return FALSE; + if (is_active) + { + ret_loader = g_steal_pointer (&bl); + break; + } + } } + else + ret_loader = _ostree_sysroot_new_bootloader_by_type (sysroot, bootloader_config); - ot_transfer_out_value(out_bootloader, &ret_loader); + ot_transfer_out_value (out_bootloader, &ret_loader) return TRUE; }