Refactor `ostree_sysroot_query_bootloader`
authorWilliam Manley <will@stb-tester.com>
Tue, 14 Jul 2020 11:53:17 +0000 (12:53 +0100)
committerWilliam Manley <will@stb-tester.com>
Mon, 26 Oct 2020 23:51:11 +0000 (23:51 +0000)
This is more regular, so will make it easier to add more bootloader types
in the future.

src/libostree/ostree-sysroot.c

index 265d39d1c16c667adbe340b4e122353b94c24c72..a69984b7a1be3e1247cda3aa4a78dc7efa28d9dd 100644 (file)
@@ -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;
 }