diff options
author | William Manley <will@stb-tester.com> | 2020-07-06 15:50:28 +0100 |
---|---|---|
committer | William Manley <will@stb-tester.com> | 2020-10-26 23:51:11 +0000 |
commit | 9482ecfe5ad355a405d17272564c8b15c9f1d84b (patch) | |
tree | 3326eacd7d90c24cf4236e99b72419688f63c306 | |
parent | 062df6ee8111be538321ee624e219f5d61d5e7dc (diff) | |
download | ostree-9482ecfe5ad355a405d17272564c8b15c9f1d84b.tar.gz |
Refactor: sysroot.bootloader: Store enum value rather than string
It's easier to extend and it centralises the config parsing. In other
places we will no longer need to use `g_str_equal` to match these values,
a `switch` statement will be sufficient.
-rw-r--r-- | src/libostree/ostree-repo-private.h | 18 | ||||
-rw-r--r-- | src/libostree/ostree-repo.c | 41 | ||||
-rw-r--r-- | src/libostree/ostree-sysroot.c | 69 |
3 files changed, 73 insertions, 55 deletions
diff --git a/src/libostree/ostree-repo-private.h b/src/libostree/ostree-repo-private.h index cbbe6971..14e2f753 100644 --- a/src/libostree/ostree-repo-private.h +++ b/src/libostree/ostree-repo-private.h @@ -110,6 +110,22 @@ typedef enum { _OSTREE_FEATURE_YES, } _OstreeFeatureSupport; +/* Possible values for the sysroot.bootloader configuration variable */ +typedef enum { + CFG_SYSROOT_BOOTLOADER_OPT_AUTO = 0, + CFG_SYSROOT_BOOTLOADER_OPT_NONE, + CFG_SYSROOT_BOOTLOADER_OPT_ZIPL, + /* Non-exhaustive */ +} OstreeCfgSysrootBootloaderOpt; + +static const char* const CFG_SYSROOT_BOOTLOADER_OPTS_STR[] = { + /* This must be kept in the same order as the enum */ + "auto", + "none", + "zipl", + NULL, +}; + /** * OstreeRepo: * @@ -193,7 +209,7 @@ struct OstreeRepo { guint64 payload_link_threshold; gint fs_support_reflink; /* The underlying filesystem has support for ioctl (FICLONE..) */ gchar **repo_finders; - gchar *bootloader; /* Configure which bootloader to use. */ + OstreeCfgSysrootBootloaderOpt bootloader; /* Configure which bootloader to use. */ OstreeRepo *parent_repo; }; diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c index d3066e6a..11a209a4 100644 --- a/src/libostree/ostree-repo.c +++ b/src/libostree/ostree-repo.c @@ -1048,7 +1048,6 @@ ostree_repo_finalize (GObject *object) g_mutex_clear (&self->txn_lock); g_free (self->collection_id); g_strfreev (self->repo_finders); - g_free (self->bootloader); g_clear_pointer (&self->remotes, g_hash_table_destroy); g_mutex_clear (&self->remotes_lock); @@ -3186,28 +3185,28 @@ reload_sysroot_config (OstreeRepo *self, GCancellable *cancellable, GError **error) { - { g_autofree char *bootloader = NULL; + g_autofree char *bootloader = NULL; - if (!ot_keyfile_get_value_with_default_group_optional (self->config, "sysroot", - "bootloader", "auto", - &bootloader, error)) - return FALSE; - - /* TODO: possibly later add support for specifying a generic bootloader - * binary "x" in /usr/lib/ostree/bootloaders/x). See: - * https://github.com/ostreedev/ostree/issues/1719 - * https://github.com/ostreedev/ostree/issues/1801 - * Also, dedup these strings with the bootloader implementations - */ - if (!(g_str_equal (bootloader, "auto") || g_str_equal (bootloader, "none") - || g_str_equal (bootloader, "zipl"))) - return glnx_throw (error, "Invalid bootloader configuration: '%s'", bootloader); + if (!ot_keyfile_get_value_with_default_group_optional (self->config, "sysroot", + "bootloader", "auto", + &bootloader, error)) + return FALSE; - g_free (self->bootloader); - self->bootloader = g_steal_pointer (&bootloader); - } + /* TODO: possibly later add support for specifying a generic bootloader + * binary "x" in /usr/lib/ostree/bootloaders/x). See: + * https://github.com/ostreedev/ostree/issues/1719 + * https://github.com/ostreedev/ostree/issues/1801 + */ + for (int i = 0; CFG_SYSROOT_BOOTLOADER_OPTS_STR[i]; i++) + { + if (g_str_equal (bootloader, CFG_SYSROOT_BOOTLOADER_OPTS_STR[i])) + { + self->bootloader = (OstreeCfgSysrootBootloaderOpt) i; + return TRUE; + } + } - return TRUE; + return glnx_throw (error, "Invalid bootloader configuration: '%s'", bootloader); } /** @@ -6331,7 +6330,7 @@ ostree_repo_get_bootloader (OstreeRepo *self) { g_return_val_if_fail (OSTREE_IS_REPO (self), NULL); - return self->bootloader; + return CFG_SYSROOT_BOOTLOADER_OPTS_STR[self->bootloader]; } diff --git a/src/libostree/ostree-sysroot.c b/src/libostree/ostree-sysroot.c index f183edd1..63065fb9 100644 --- a/src/libostree/ostree-sysroot.c +++ b/src/libostree/ostree-sysroot.c @@ -1340,50 +1340,53 @@ _ostree_sysroot_query_bootloader (OstreeSysroot *sysroot, GError **error) { OstreeRepo *repo = ostree_sysroot_repo (sysroot); - g_autofree gchar *bootloader_config = ostree_repo_get_bootloader (repo); + OstreeCfgSysrootBootloaderOpt bootloader_config = repo->bootloader; - g_debug ("Using bootloader configuration: %s", bootloader_config); + g_debug ("Using bootloader configuration: %s", + CFG_SYSROOT_BOOTLOADER_OPTS_STR[bootloader_config]); g_autoptr(OstreeBootloader) ret_loader = NULL; - if (g_str_equal (bootloader_config, "none")) + switch (repo->bootloader) { + case CFG_SYSROOT_BOOTLOADER_OPT_NONE: /* No bootloader specified; do not query bootloaders to run. */ ret_loader = NULL; - } - else if (g_str_equal (bootloader_config, "zipl")) - { + 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); - } - else if (g_str_equal (bootloader_config, "auto")) - { - gboolean is_active; - ret_loader = (OstreeBootloader*)_ostree_bootloader_syslinux_new (sysroot); - if (!_ostree_bootloader_query (ret_loader, &is_active, - cancellable, error)) - return FALSE; + 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); + 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 (); } - else - g_assert_not_reached (); ot_transfer_out_value(out_bootloader, &ret_loader); return TRUE; |