diff options
author | William Manley <will@stb-tester.com> | 2020-07-14 12:53:17 +0100 |
---|---|---|
committer | William Manley <will@stb-tester.com> | 2020-10-26 23:51:11 +0000 |
commit | a8dce46b5fb7d19e554ecaec994f51f4269de9ea (patch) | |
tree | 58738fbd5aed29cad2c63e20828bf183a85d939c | |
parent | 31acd2ef99acd43c165b3678cfc4a5076a4fc5c0 (diff) | |
download | ostree-a8dce46b5fb7d19e554ecaec994f51f4269de9ea.tar.gz |
Refactor `ostree_sysroot_query_bootloader`
This is more regular, so will make it easier to add more bootloader types
in the future.
-rw-r--r-- | src/libostree/ostree-sysroot.c | 96 |
1 files changed, 47 insertions, 49 deletions
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; } |