[ostree: 5/7] libostree: Nearly complete move of API into OstreeSysroot
- From: Colin Walters <walters src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [ostree: 5/7] libostree: Nearly complete move of API into OstreeSysroot
- Date: Mon, 16 Sep 2013 00:27:28 +0000 (UTC)
commit c6292942ff3d284f9a8056c314bf1ffbf45278ae
Author: Colin Walters <walters verbum org>
Date: Sun Sep 15 20:16:20 2013 -0400
libostree: Nearly complete move of API into OstreeSysroot
Move the deployment code too.
Makefile-libostree.am | 3 +
Makefile-ostree.am | 5 -
.../ostree-ordered-hash.c} | 22 +-
.../ostree-ordered-hash.h} | 22 +-
.../ostree-sysroot-deploy.c} | 114 +++++-----
src/libostree/ostree-sysroot-private.h | 7 +
src/libostree/ostree-sysroot.c | 240 ++++++++++++++++++++
src/libostree/ostree-sysroot.h | 41 ++++
src/ostree/ot-admin-builtin-deploy.c | 22 +-
src/ostree/ot-admin-builtin-diff.c | 8 +-
src/ostree/ot-admin-builtin-status.c | 6 +-
src/ostree/ot-admin-builtin-undeploy.c | 12 +-
src/ostree/ot-admin-builtin-upgrade.c | 27 +--
src/ostree/ot-admin-deploy.h | 55 -----
src/ostree/ot-admin-functions.c | 234 -------------------
src/ostree/ot-admin-functions.h | 47 ----
src/ostree/ot-admin-util.c | 78 -------
17 files changed, 400 insertions(+), 543 deletions(-)
---
diff --git a/Makefile-libostree.am b/Makefile-libostree.am
index 3576b44..d9ee1f1 100644
--- a/Makefile-libostree.am
+++ b/Makefile-libostree.am
@@ -46,6 +46,7 @@ libostree_1_la_SOURCES = \
src/libostree/ostree-sysroot-private.h \
src/libostree/ostree-sysroot.c \
src/libostree/ostree-sysroot-cleanup.c \
+ src/libostree/ostree-sysroot-deploy.c \
src/libostree/ostree-bootconfig-parser.c \
src/libostree/ostree-deployment.c \
src/libostree/ostree-bootloader.c \
@@ -53,6 +54,8 @@ libostree_1_la_SOURCES = \
src/libostree/ostree-bootloader-syslinux.c \
src/libostree/ostree-bootloader-uboot.h \
src/libostree/ostree-bootloader-uboot.c \
+ src/libostree/ostree-ordered-hash.h \
+ src/libostree/ostree-ordered-hash.c \
$(NULL)
if USE_LIBARCHIVE
libostree_1_la_SOURCES += src/libostree/ostree-libarchive-input-stream.h \
diff --git a/Makefile-ostree.am b/Makefile-ostree.am
index df5c3a4..f2a3615 100644
--- a/Makefile-ostree.am
+++ b/Makefile-ostree.am
@@ -59,13 +59,8 @@ ostree_SOURCES += \
src/ostree/ot-admin-builtin-status.c \
src/ostree/ot-admin-builtin-upgrade.c \
src/ostree/ot-admin-builtins.h \
- src/ostree/ot-admin-util.c \
src/ostree/ot-admin-functions.h \
src/ostree/ot-admin-functions.c \
- src/ostree/ot-admin-deploy.h \
- src/ostree/ot-admin-deploy.c \
- src/ostree/ot-ordered-hash.h \
- src/ostree/ot-ordered-hash.c \
$(NULL)
ostree_bin_shared_cflags = $(AM_CFLAGS) -I$(srcdir)/src/libgsystem -I$(srcdir)/src/libotutil
-I$(srcdir)/src/libostree -I$(srcdir)/src/ostree -DLOCALEDIR=\"$(datadir)/locale\"
diff --git a/src/ostree/ot-ordered-hash.c b/src/libostree/ostree-ordered-hash.c
similarity index 78%
rename from src/ostree/ot-ordered-hash.c
rename to src/libostree/ostree-ordered-hash.c
index 02c9e43..ba13bf9 100644
--- a/src/ostree/ot-ordered-hash.c
+++ b/src/libostree/ostree-ordered-hash.c
@@ -20,21 +20,21 @@
#include "config.h"
-#include "ot-ordered-hash.h"
+#include "ostree-ordered-hash.h"
#include "libgsystem.h"
-OtOrderedHash *
-ot_ordered_hash_new (void)
+OstreeOrderedHash *
+_ostree_ordered_hash_new (void)
{
- OtOrderedHash *ret;
- ret = g_new0 (OtOrderedHash, 1);
+ OstreeOrderedHash *ret;
+ ret = g_new0 (OstreeOrderedHash, 1);
ret->order = g_ptr_array_new_with_free_func (g_free);
ret->table = g_hash_table_new (g_str_hash, g_str_equal);
return ret;
}
void
-ot_ordered_hash_free (OtOrderedHash *ohash)
+_ostree_ordered_hash_free (OstreeOrderedHash *ohash)
{
if (!ohash)
return;
@@ -44,13 +44,13 @@ ot_ordered_hash_free (OtOrderedHash *ohash)
}
void
-ot_ordered_hash_cleanup (void *loc)
+_ostree_ordered_hash_cleanup (void *loc)
{
- ot_ordered_hash_free (*((OtOrderedHash**)loc));
+ _ostree_ordered_hash_free (*((OstreeOrderedHash**)loc));
}
void
-ot_ordered_hash_replace_key_take (OtOrderedHash *ohash,
+_ostree_ordered_hash_replace_key_take (OstreeOrderedHash *ohash,
char *key,
const char *value)
{
@@ -63,7 +63,7 @@ ot_ordered_hash_replace_key_take (OtOrderedHash *ohash,
}
void
-ot_ordered_hash_replace_key (OtOrderedHash *ohash,
+_ostree_ordered_hash_replace_key (OstreeOrderedHash *ohash,
const char *key,
const char *val)
{
@@ -79,5 +79,5 @@ ot_ordered_hash_replace_key (OtOrderedHash *ohash,
valblock = g_string_free (buf, FALSE);
valp = valblock + keylen + 1;
- ot_ordered_hash_replace_key_take (ohash, valblock, valp);
+ _ostree_ordered_hash_replace_key_take (ohash, valblock, valp);
}
diff --git a/src/ostree/ot-ordered-hash.h b/src/libostree/ostree-ordered-hash.h
similarity index 63%
rename from src/ostree/ot-ordered-hash.h
rename to src/libostree/ostree-ordered-hash.h
index 1a3aa09..1cfe852 100644
--- a/src/ostree/ot-ordered-hash.h
+++ b/src/libostree/ostree-ordered-hash.h
@@ -27,17 +27,17 @@ G_BEGIN_DECLS
typedef struct {
GPtrArray *order;
GHashTable *table;
-} OtOrderedHash;
-
-OtOrderedHash *ot_ordered_hash_new (void);
-void ot_ordered_hash_free (OtOrderedHash *ohash);
-void ot_ordered_hash_cleanup (void *loc);
-void ot_ordered_hash_replace_key_take (OtOrderedHash *ohash,
- char *key,
- const char *value);
-void ot_ordered_hash_replace_key (OtOrderedHash *ohash,
- const char *key,
- const char *val);
+} OstreeOrderedHash;
+
+OstreeOrderedHash *_ostree_ordered_hash_new (void);
+void _ostree_ordered_hash_free (OstreeOrderedHash *ohash);
+void _ostree_ordered_hash_cleanup (void *loc);
+void _ostree_ordered_hash_replace_key_take (OstreeOrderedHash *ohash,
+ char *key,
+ const char *value);
+void _ostree_ordered_hash_replace_key (OstreeOrderedHash *ohash,
+ const char *key,
+ const char *val);
G_END_DECLS
diff --git a/src/ostree/ot-admin-deploy.c b/src/libostree/ostree-sysroot-deploy.c
similarity index 92%
rename from src/ostree/ot-admin-deploy.c
rename to src/libostree/ostree-sysroot-deploy.c
index 32d0d95..2b3e853 100644
--- a/src/ostree/ot-admin-deploy.c
+++ b/src/libostree/ostree-sysroot-deploy.c
@@ -22,13 +22,10 @@
#include "config.h"
-#include "ot-admin-functions.h"
-#include "ot-admin-deploy.h"
+#include "ostree-sysroot-private.h"
#include "otutil.h"
-#include "ostree-core.h"
#include "libgsystem.h"
-
/**
* copy_one_config_file:
*
@@ -197,7 +194,7 @@ merge_etc_changes (GFile *orig_etc,
* /ostree/deploy/OS/deploy/${treecsum}.${deployserial}.
*/
static gboolean
-checkout_deployment_tree (GFile *sysroot,
+checkout_deployment_tree (OstreeSysroot *sysroot,
OstreeRepo *repo,
OstreeDeployment *deployment,
GFile **out_deployment_path,
@@ -222,7 +219,7 @@ checkout_deployment_tree (GFile *sysroot,
if (!file_info)
goto out;
- osdeploy_path = ot_gfile_get_child_build_path (sysroot, "ostree", "deploy",
+ osdeploy_path = ot_gfile_get_child_build_path (sysroot->path, "ostree", "deploy",
ostree_deployment_get_osname (deployment),
"deploy", NULL);
checkout_target_name = g_strdup_printf ("%s.%d", csum, ostree_deployment_get_deployserial (deployment));
@@ -246,7 +243,7 @@ checkout_deployment_tree (GFile *sysroot,
}
static gboolean
-merge_configuration (OstreeSysroot *sysroot_obj,
+merge_configuration (OstreeSysroot *sysroot,
OstreeDeployment *previous_deployment,
OstreeDeployment *deployment,
GFile *deployment_path,
@@ -266,7 +263,7 @@ merge_configuration (OstreeSysroot *sysroot_obj,
gs_unref_object GFile *previous_path = NULL;
OstreeBootconfigParser *previous_bootconfig;
- previous_path = ostree_sysroot_get_deployment_directory (sysroot_obj, previous_deployment);
+ previous_path = ostree_sysroot_get_deployment_directory (sysroot, previous_deployment);
source_etc_path = g_file_resolve_relative_path (previous_path, "etc");
source_etc_pristine_path = g_file_resolve_relative_path (previous_path, "usr/etc");
@@ -330,20 +327,17 @@ merge_configuration (OstreeSysroot *sysroot_obj,
}
static gboolean
-write_origin_file (GFile *sysroot,
+write_origin_file (OstreeSysroot *sysroot,
OstreeDeployment *deployment,
GCancellable *cancellable,
GError **error)
{
gboolean ret = FALSE;
- gs_unref_object OstreeSysroot *sysroot_obj = NULL;
GKeyFile *origin = ostree_deployment_get_origin (deployment);
- sysroot_obj = ostree_sysroot_new (sysroot);
-
if (origin)
{
- gs_unref_object GFile *deployment_path = ostree_sysroot_get_deployment_directory (sysroot_obj,
deployment);
+ gs_unref_object GFile *deployment_path = ostree_sysroot_get_deployment_directory (sysroot, deployment);
gs_unref_object GFile *origin_path = ostree_sysroot_get_deployment_origin_path (deployment_path);
gs_free char *contents = NULL;
gsize len;
@@ -852,7 +846,7 @@ install_deployment_kernel (OstreeSysroot *sysroot,
gs_free char *version_key = NULL;
gs_free char *ostree_kernel_arg = NULL;
gs_free char *options_key = NULL;
- __attribute__((cleanup(ot_ordered_hash_cleanup))) OtOrderedHash *ohash = NULL;
+ __attribute__((cleanup(_ostree_ordered_hash_cleanup))) OstreeOrderedHash *ohash = NULL;
const char *val;
OstreeBootconfigParser *bootconfig;
gsize len;
@@ -948,9 +942,9 @@ install_deployment_kernel (OstreeSysroot *sysroot,
ostree_kernel_arg = g_strdup_printf ("/ostree/boot.%d/%s/%s/%d",
new_bootversion, osname, bootcsum,
ostree_deployment_get_bootserial (deployment));
- ohash = ot_admin_parse_kernel_args (val);
- ot_ordered_hash_replace_key (ohash, "ostree", ostree_kernel_arg);
- options_key = ot_admin_kernel_arg_string_serialize (ohash);
+ ohash = _ostree_sysroot_parse_kernel_args (val);
+ _ostree_ordered_hash_replace_key (ohash, "ostree", ostree_kernel_arg);
+ options_key = _ostree_sysroot_kernel_arg_string_serialize (ohash);
ostree_bootconfig_parser_set (bootconfig, "options", options_key);
if (!ostree_bootconfig_parser_write (ostree_deployment_get_bootconfig (deployment), bootconfpath,
@@ -963,7 +957,7 @@ install_deployment_kernel (OstreeSysroot *sysroot,
}
static gboolean
-swap_bootloader (GFile *sysroot,
+swap_bootloader (OstreeSysroot *sysroot,
int current_bootversion,
int new_bootversion,
GCancellable *cancellable,
@@ -976,7 +970,7 @@ swap_bootloader (GFile *sysroot,
g_assert ((current_bootversion == 0 && new_bootversion == 1) ||
(current_bootversion == 1 && new_bootversion == 0));
- boot_loader_link = g_file_resolve_relative_path (sysroot, "boot/loader");
+ boot_loader_link = g_file_resolve_relative_path (sysroot->path, "boot/loader");
new_target = g_strdup_printf ("loader.%d", new_bootversion);
if (!ot_gfile_atomic_symlink_swap (boot_loader_link, new_target,
@@ -989,17 +983,16 @@ swap_bootloader (GFile *sysroot,
}
gboolean
-ot_admin_write_deployments (GFile *sysroot,
- int current_bootversion,
- int new_bootversion,
- GPtrArray *new_deployments,
- GCancellable *cancellable,
- GError **error)
+ostree_sysroot_write_deployments (OstreeSysroot *sysroot,
+ int current_bootversion,
+ int new_bootversion,
+ GPtrArray *new_deployments,
+ GCancellable *cancellable,
+ GError **error)
{
gboolean ret = FALSE;
guint i;
- gs_unref_object OstreeSysroot *sysroot_obj = ostree_sysroot_new (sysroot);
- gs_unref_object OstreeBootloader *bootloader = ostree_sysroot_query_bootloader (sysroot_obj);
+ gs_unref_object OstreeBootloader *bootloader = ostree_sysroot_query_bootloader (sysroot);
if (bootloader)
g_print ("Detected bootloader: %s\n", ostree_bootloader_get_name (bootloader));
@@ -1014,7 +1007,7 @@ ot_admin_write_deployments (GFile *sysroot,
goto out;
}
- if (!swap_bootlinks (sysroot_obj, current_bootversion,
+ if (!swap_bootlinks (sysroot, current_bootversion,
new_deployments,
cancellable, error))
{
@@ -1027,7 +1020,7 @@ ot_admin_write_deployments (GFile *sysroot,
for (i = 0; i < new_deployments->len; i++)
{
OstreeDeployment *deployment = new_deployments->pdata[i];
- if (!install_deployment_kernel (sysroot_obj, new_bootversion,
+ if (!install_deployment_kernel (sysroot, new_bootversion,
deployment, new_deployments->len,
cancellable, error))
{
@@ -1037,7 +1030,7 @@ ot_admin_write_deployments (GFile *sysroot,
}
/* Swap bootlinks for *new* version */
- if (!swap_bootlinks (sysroot_obj, new_bootversion, new_deployments,
+ if (!swap_bootlinks (sysroot, new_bootversion, new_deployments,
cancellable, error))
{
g_prefix_error (error, "Generating new bootlinks: ");
@@ -1071,25 +1064,24 @@ ot_admin_write_deployments (GFile *sysroot,
}
gboolean
-ot_admin_deploy (GFile *sysroot,
- int current_bootversion,
- GPtrArray *current_deployments,
- const char *osname,
- const char *revision,
- GKeyFile *origin,
- char **add_kernel_argv,
- gboolean retain,
- OstreeDeployment *booted_deployment,
- OstreeDeployment *provided_merge_deployment,
- OstreeDeployment **out_new_deployment,
- int *out_new_bootversion,
- GPtrArray **out_new_deployments,
- GCancellable *cancellable,
- GError **error)
+ostree_sysroot_deploy (OstreeSysroot *sysroot,
+ int current_bootversion,
+ GPtrArray *current_deployments,
+ const char *osname,
+ const char *revision,
+ GKeyFile *origin,
+ char **add_kernel_argv,
+ gboolean retain,
+ OstreeDeployment *booted_deployment,
+ OstreeDeployment *provided_merge_deployment,
+ OstreeDeployment **out_new_deployment,
+ int *out_new_bootversion,
+ GPtrArray **out_new_deployments,
+ GCancellable *cancellable,
+ GError **error)
{
gboolean ret = FALSE;
OstreeDeployment *new_deployment;
- gs_unref_object OstreeSysroot *sysroot_obj = NULL;
gs_unref_object OstreeDeployment *merge_deployment = NULL;
gs_unref_object OstreeRepo *repo = NULL;
gs_unref_object GFile *commit_root = NULL;
@@ -1101,9 +1093,7 @@ ot_admin_deploy (GFile *sysroot,
gs_unref_ptrarray GPtrArray *new_deployments = NULL;
int new_bootversion;
- sysroot_obj = ostree_sysroot_new (sysroot);
-
- if (!ostree_sysroot_get_repo (sysroot_obj, &repo, cancellable, error))
+ if (!ostree_sysroot_get_repo (sysroot, &repo, cancellable, error))
goto out;
/* Here we perform cleanup of any leftover data from previous
@@ -1113,7 +1103,7 @@ ot_admin_deploy (GFile *sysroot,
* TODO: Add /ostree/transaction file, and only do this cleanup if
* we find it.
*/
- if (!ostree_sysroot_cleanup (sysroot_obj, cancellable, error))
+ if (!ostree_sysroot_cleanup (sysroot, cancellable, error))
{
g_prefix_error (error, "Performing initial cleanup: ");
goto out;
@@ -1144,8 +1134,8 @@ ot_admin_deploy (GFile *sysroot,
if (provided_merge_deployment != NULL)
merge_deployment = g_object_ref (provided_merge_deployment);
else
- merge_deployment = ot_admin_get_merge_deployment (current_deployments, osname,
- booted_deployment);
+ merge_deployment = ostree_sysroot_get_merge_deployment (current_deployments, osname,
+ booted_deployment);
compute_new_deployment_list (current_bootversion,
current_deployments, osname,
@@ -1179,7 +1169,7 @@ ot_admin_deploy (GFile *sysroot,
bootconfig = ostree_bootconfig_parser_new ();
ostree_deployment_set_bootconfig (new_deployment, bootconfig);
- if (!merge_configuration (sysroot_obj, merge_deployment, new_deployment,
+ if (!merge_configuration (sysroot, merge_deployment, new_deployment,
new_deployment_path,
cancellable, error))
{
@@ -1197,25 +1187,25 @@ ot_admin_deploy (GFile *sysroot,
if (add_kernel_argv)
{
char **strviter;
- __attribute__((cleanup(ot_ordered_hash_cleanup))) OtOrderedHash *ohash = NULL;
+ __attribute__((cleanup(_ostree_ordered_hash_cleanup))) OstreeOrderedHash *ohash = NULL;
gs_free char *new_options = NULL;
- ohash = ot_admin_parse_kernel_args (ostree_bootconfig_parser_get (bootconfig, "options"));
+ ohash = _ostree_sysroot_parse_kernel_args (ostree_bootconfig_parser_get (bootconfig, "options"));
for (strviter = add_kernel_argv; *strviter; strviter++)
{
char *karg = g_strdup (*strviter);
- const char *val = ot_admin_util_split_keyeq (karg);
+ const char *val = _ostree_sysroot_split_keyeq (karg);
- ot_ordered_hash_replace_key_take (ohash, karg, val);
+ _ostree_ordered_hash_replace_key_take (ohash, karg, val);
}
- new_options = ot_admin_kernel_arg_string_serialize (ohash);
+ new_options = _ostree_sysroot_kernel_arg_string_serialize (ohash);
ostree_bootconfig_parser_set (bootconfig, "options", new_options);
}
- if (!ot_admin_write_deployments (sysroot, current_bootversion, new_bootversion,
- new_deployments, cancellable, error))
+ if (!ostree_sysroot_write_deployments (sysroot, current_bootversion, new_bootversion,
+ new_deployments, cancellable, error))
goto out;
g_print ("Transaction complete, performing cleanup\n");
@@ -1226,7 +1216,7 @@ ot_admin_deploy (GFile *sysroot,
* done from the host.
*/
{
- gs_unref_object GFile *osdir = ot_gfile_resolve_path_printf (sysroot, "ostree/deploy/%s",
ostree_deployment_get_osname (new_deployment));
+ gs_unref_object GFile *osdir = ot_gfile_resolve_path_printf (sysroot->path, "ostree/deploy/%s",
ostree_deployment_get_osname (new_deployment));
gs_unref_object GFile *os_current_path = g_file_get_child (osdir, "current");
gs_free char *target = g_file_get_relative_path (osdir, new_deployment_path);
g_assert (target != NULL);
@@ -1237,7 +1227,7 @@ ot_admin_deploy (GFile *sysroot,
/* And finally, cleanup of any leftover data.
*/
- if (!ostree_sysroot_cleanup (sysroot_obj, cancellable, error))
+ if (!ostree_sysroot_cleanup (sysroot, cancellable, error))
{
g_prefix_error (error, "Performing final cleanup: ");
goto out;
diff --git a/src/libostree/ostree-sysroot-private.h b/src/libostree/ostree-sysroot-private.h
index 7da6507..f8b6d10 100644
--- a/src/libostree/ostree-sysroot-private.h
+++ b/src/libostree/ostree-sysroot-private.h
@@ -21,6 +21,7 @@
#pragma once
#include "ostree.h"
+#include "ostree-ordered-hash.h"
G_BEGIN_DECLS
@@ -53,5 +54,11 @@ _ostree_sysroot_get_devino (GFile *path,
char *_ostree_sysroot_join_lines (GPtrArray *lines);
+char *_ostree_sysroot_split_keyeq (char *str);
+
+OstreeOrderedHash *_ostree_sysroot_parse_kernel_args (const char *options);
+
+char * _ostree_sysroot_kernel_arg_string_serialize (OstreeOrderedHash *ohash);
+
G_END_DECLS
diff --git a/src/libostree/ostree-sysroot.c b/src/libostree/ostree-sysroot.c
index 71774de..464a42d 100644
--- a/src/libostree/ostree-sysroot.c
+++ b/src/libostree/ostree-sysroot.c
@@ -839,3 +839,243 @@ _ostree_sysroot_join_lines (GPtrArray *lines)
}
return g_string_free (buf, FALSE);
}
+
+static gboolean
+parse_kernel_commandline (OstreeOrderedHash **out_args,
+ GCancellable *cancellable,
+ GError **error)
+{
+ gboolean ret = FALSE;
+ gs_unref_object GFile *proc_cmdline = g_file_new_for_path ("/proc/cmdline");
+ gs_free char *contents = NULL;
+ gsize len;
+
+ if (!g_file_load_contents (proc_cmdline, cancellable, &contents, &len, NULL,
+ error))
+ goto out;
+
+ ret = TRUE;
+ *out_args = _ostree_sysroot_parse_kernel_args (contents);;
+ out:
+ return ret;
+}
+
+/**
+ * ostree_sysroot_find_booted_deployment:
+ * @target_sysroot: Root directory
+ * @deployments: (element-type OstreeDeployment): Loaded deployments
+ * @out_deployment: (out): The currently booted deployment
+ * @cancellable:
+ * @error:
+ *
+ * If the system is currently booted into a deployment in
+ * @deployments, set @out_deployment. Note that if @target_sysroot is
+ * not equal to "/", @out_deployment will always be set to %NULL.
+ */
+gboolean
+ostree_sysroot_find_booted_deployment (OstreeSysroot *self,
+ GPtrArray *deployments,
+ OstreeDeployment **out_deployment,
+ GCancellable *cancellable,
+ GError **error)
+{
+ gboolean ret = FALSE;
+ gs_unref_object GFile *active_root = g_file_new_for_path ("/");
+ gs_unref_object OstreeSysroot *active_deployment_root = ostree_sysroot_new_default ();
+ gs_unref_object OstreeDeployment *ret_deployment = NULL;
+
+ if (g_file_equal (active_root, self->path))
+ {
+ guint i;
+ const char *bootlink_arg;
+ __attribute__((cleanup(_ostree_ordered_hash_cleanup))) OstreeOrderedHash *kernel_args = NULL;
+ guint32 root_device;
+ guint64 root_inode;
+
+ if (!_ostree_sysroot_get_devino (active_root, &root_device, &root_inode,
+ cancellable, error))
+ goto out;
+
+ if (!parse_kernel_commandline (&kernel_args, cancellable, error))
+ goto out;
+
+ bootlink_arg = g_hash_table_lookup (kernel_args->table, "ostree");
+ if (bootlink_arg)
+ {
+ for (i = 0; i < deployments->len; i++)
+ {
+ OstreeDeployment *deployment = deployments->pdata[i];
+ gs_unref_object GFile *deployment_path = ostree_sysroot_get_deployment_directory
(active_deployment_root, deployment);
+ guint32 device;
+ guint64 inode;
+
+ if (!_ostree_sysroot_get_devino (deployment_path, &device, &inode,
+ cancellable, error))
+ goto out;
+
+ if (device == root_device && inode == root_inode)
+ {
+ ret_deployment = g_object_ref (deployment);
+ break;
+ }
+ }
+ if (ret_deployment == NULL)
+ {
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+ "Unexpected state: ostree= kernel argument found, but / is not a deployment
root");
+ goto out;
+ }
+ }
+ else
+ {
+ /* Not an ostree system */
+ }
+ }
+
+ ret = TRUE;
+ ot_transfer_out_value (out_deployment, &ret_deployment);
+ out:
+ return ret;
+}
+
+gboolean
+ostree_sysroot_require_deployment_or_osname (OstreeSysroot *sysroot,
+ GPtrArray *deployments,
+ const char *osname,
+ OstreeDeployment **out_deployment,
+ GCancellable *cancellable,
+ GError **error)
+{
+ gboolean ret = FALSE;
+ gs_unref_object OstreeDeployment *ret_deployment = NULL;
+
+ if (!ostree_sysroot_find_booted_deployment (sysroot, deployments, &ret_deployment,
+ cancellable, error))
+ goto out;
+
+ if (ret_deployment == NULL && osname == NULL)
+ {
+ g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+ "Not currently booted into an OSTree system and no --os= argument given");
+ goto out;
+ }
+
+ ret = TRUE;
+ ot_transfer_out_value (out_deployment, &ret_deployment);
+ out:
+ return ret;
+}
+
+OstreeOrderedHash *
+_ostree_sysroot_parse_kernel_args (const char *options)
+{
+ OstreeOrderedHash *ret;
+ char **args;
+ char **iter;
+
+ ret = _ostree_ordered_hash_new ();
+
+ if (!options)
+ return ret;
+
+ args = g_strsplit (options, " ", -1);
+ for (iter = args; *iter; iter++)
+ {
+ char *arg = *iter;
+ char *val;
+
+ val = _ostree_sysroot_split_keyeq (arg);
+
+ g_ptr_array_add (ret->order, arg);
+ g_hash_table_insert (ret->table, arg, val);
+ }
+
+ return ret;
+}
+
+/*
+ * Modify @arg which should be of the form key=value to make @arg just
+ * contain key. Return a pointer to the start of value.
+ */
+char *
+_ostree_sysroot_split_keyeq (char *arg)
+{
+ char *eq;
+
+ eq = strchr (arg, '=');
+ if (eq)
+ {
+ /* Note key/val are in one malloc block,
+ * so we don't free val...
+ */
+ *eq = '\0';
+ return eq+1;
+ }
+ else
+ {
+ /* ...and this allows us to insert a constant
+ * string.
+ */
+ return "";
+ }
+}
+
+char *
+_ostree_sysroot_kernel_arg_string_serialize (OstreeOrderedHash *ohash)
+{
+ guint i;
+ GString *buf = g_string_new ("");
+ gboolean first = TRUE;
+
+ for (i = 0; i < ohash->order->len; i++)
+ {
+ const char *key = ohash->order->pdata[i];
+ const char *val = g_hash_table_lookup (ohash->table, key);
+
+ g_assert (val != NULL);
+
+ if (first)
+ first = FALSE;
+ else
+ g_string_append_c (buf, ' ');
+
+ if (*val)
+ g_string_append_printf (buf, "%s=%s", key, val);
+ else
+ g_string_append (buf, key);
+ }
+
+ return g_string_free (buf, FALSE);
+}
+
+OstreeDeployment *
+ostree_sysroot_get_merge_deployment (GPtrArray *deployments,
+ const char *osname,
+ OstreeDeployment *booted_deployment)
+{
+ g_return_val_if_fail (osname != NULL || booted_deployment != NULL, NULL);
+
+ if (osname == NULL)
+ osname = ostree_deployment_get_osname (booted_deployment);
+
+ if (booted_deployment &&
+ g_strcmp0 (ostree_deployment_get_osname (booted_deployment), osname) == 0)
+ {
+ return g_object_ref (booted_deployment);
+ }
+ else
+ {
+ guint i;
+ for (i = 0; i < deployments->len; i++)
+ {
+ OstreeDeployment *deployment = deployments->pdata[i];
+
+ if (strcmp (ostree_deployment_get_osname (deployment), osname) != 0)
+ continue;
+
+ return g_object_ref (deployment);
+ }
+ }
+ return NULL;
+}
+
diff --git a/src/libostree/ostree-sysroot.h b/src/libostree/ostree-sysroot.h
index 5df0ae7..2227a63 100644
--- a/src/libostree/ostree-sysroot.h
+++ b/src/libostree/ostree-sysroot.h
@@ -73,5 +73,46 @@ gboolean ostree_sysroot_get_repo (OstreeSysroot *self,
OstreeBootloader *ostree_sysroot_query_bootloader (OstreeSysroot *sysroot);
+gboolean ostree_sysroot_find_booted_deployment (OstreeSysroot *sysroot,
+ GPtrArray *deployments,
+ OstreeDeployment **out_deployment,
+ GCancellable *cancellable,
+ GError **error);
+
+gboolean ostree_sysroot_require_deployment_or_osname (OstreeSysroot *sysroot,
+ GPtrArray *deployment_list,
+ const char *osname,
+ OstreeDeployment **out_deployment,
+ GCancellable *cancellable,
+ GError **error);
+
+gboolean ostree_sysroot_write_deployments (OstreeSysroot *sysroot,
+ int current_bootversion,
+ int new_bootversion,
+ GPtrArray *new_deployments,
+ GCancellable *cancellable,
+ GError **error);
+
+gboolean ostree_sysroot_deploy (OstreeSysroot *sysroot,
+ int current_bootversion,
+ GPtrArray *current_deployments,
+ const char *osname,
+ const char *revision,
+ GKeyFile *origin,
+ char **add_kernel_argv,
+ gboolean retain,
+ OstreeDeployment *booted_deployment,
+ OstreeDeployment *merge_deployment,
+ OstreeDeployment **out_new_deployment,
+ int *out_new_bootversion,
+ GPtrArray **out_new_deployments,
+ GCancellable *cancellable,
+ GError **error);
+
+
+OstreeDeployment *ostree_sysroot_get_merge_deployment (GPtrArray *deployment_list,
+ const char *osname,
+ OstreeDeployment *booted_deployment);
+
G_END_DECLS
diff --git a/src/ostree/ot-admin-builtin-deploy.c b/src/ostree/ot-admin-builtin-deploy.c
index 883f77a..6e5cc60 100644
--- a/src/ostree/ot-admin-builtin-deploy.c
+++ b/src/ostree/ot-admin-builtin-deploy.c
@@ -24,8 +24,6 @@
#include "ot-admin-builtins.h"
#include "ot-admin-functions.h"
-#include "ot-admin-deploy.h"
-#include "ot-ordered-hash.h"
#include "ostree.h"
#include "otutil.h"
@@ -90,10 +88,10 @@ ot_admin_builtin_deploy (int argc, char **argv, OstreeSysroot *sysroot, GCancell
/* Find the currently booted deployment, if any; we will ensure it
* is present in the new deployment list.
*/
- if (!ot_admin_require_deployment_or_osname (ostree_sysroot_get_path (sysroot), current_deployments,
- opt_osname,
- &booted_deployment,
- cancellable, error))
+ if (!ostree_sysroot_require_deployment_or_osname (sysroot, current_deployments,
+ opt_osname,
+ &booted_deployment,
+ cancellable, error))
{
g_prefix_error (error, "Looking for booted deployment: ");
goto out;
@@ -114,12 +112,12 @@ ot_admin_builtin_deploy (int argc, char **argv, OstreeSysroot *sysroot, GCancell
if (!ostree_repo_resolve_rev (repo, refspec, FALSE, &revision, error))
goto out;
- if (!ot_admin_deploy (ostree_sysroot_get_path (sysroot), current_bootversion, current_deployments,
- opt_osname, revision, origin,
- opt_kernel_argv, opt_retain,
- booted_deployment, NULL,
- &new_deployment, &new_bootversion, &new_deployments,
- cancellable, error))
+ if (!ostree_sysroot_deploy (sysroot, current_bootversion, current_deployments,
+ opt_osname, revision, origin,
+ opt_kernel_argv, opt_retain,
+ booted_deployment, NULL,
+ &new_deployment, &new_bootversion, &new_deployments,
+ cancellable, error))
goto out;
ret = TRUE;
diff --git a/src/ostree/ot-admin-builtin-diff.c b/src/ostree/ot-admin-builtin-diff.c
index 802fb17..88e3717 100644
--- a/src/ostree/ot-admin-builtin-diff.c
+++ b/src/ostree/ot-admin-builtin-diff.c
@@ -68,14 +68,14 @@ ot_admin_builtin_diff (int argc, char **argv, OstreeSysroot *sysroot, GCancellab
goto out;
}
- if (!ot_admin_require_deployment_or_osname (ostree_sysroot_get_path (sysroot), deployments,
- opt_osname, &deployment,
- cancellable, error))
+ if (!ostree_sysroot_require_deployment_or_osname (sysroot, deployments,
+ opt_osname, &deployment,
+ cancellable, error))
goto out;
if (deployment != NULL)
opt_osname = (char*)ostree_deployment_get_osname (deployment);
if (deployment == NULL)
- deployment = ot_admin_get_merge_deployment (deployments, opt_osname, deployment);
+ deployment = ostree_sysroot_get_merge_deployment (deployments, opt_osname, deployment);
if (deployment == NULL)
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND,
diff --git a/src/ostree/ot-admin-builtin-status.c b/src/ostree/ot-admin-builtin-status.c
index cdddf11..c561eaf 100644
--- a/src/ostree/ot-admin-builtin-status.c
+++ b/src/ostree/ot-admin-builtin-status.c
@@ -57,9 +57,9 @@ ot_admin_builtin_status (int argc, char **argv, OstreeSysroot *sysroot, GCancell
goto out;
}
- if (!ot_admin_find_booted_deployment (ostree_sysroot_get_path (sysroot), deployments,
- &booted_deployment,
- cancellable, error))
+ if (!ostree_sysroot_find_booted_deployment (sysroot, deployments,
+ &booted_deployment,
+ cancellable, error))
goto out;
if (deployments->len == 0)
diff --git a/src/ostree/ot-admin-builtin-undeploy.c b/src/ostree/ot-admin-builtin-undeploy.c
index e1535a5..1de2a6c 100644
--- a/src/ostree/ot-admin-builtin-undeploy.c
+++ b/src/ostree/ot-admin-builtin-undeploy.c
@@ -24,8 +24,6 @@
#include "ot-admin-builtins.h"
#include "ot-admin-functions.h"
-#include "ot-admin-deploy.h"
-#include "ot-ordered-hash.h"
#include "ostree.h"
#include "otutil.h"
@@ -68,8 +66,8 @@ ot_admin_builtin_undeploy (int argc, char **argv, OstreeSysroot *sysroot, GCance
goto out;
}
- if (!ot_admin_find_booted_deployment (ostree_sysroot_get_path (sysroot), current_deployments,
&booted_deployment,
- cancellable, error))
+ if (!ostree_sysroot_find_booted_deployment (sysroot, current_deployments, &booted_deployment,
+ cancellable, error))
goto out;
if (deploy_index < 0)
@@ -95,9 +93,9 @@ ot_admin_builtin_undeploy (int argc, char **argv, OstreeSysroot *sysroot, GCance
g_ptr_array_remove_index (current_deployments, deploy_index);
- if (!ot_admin_write_deployments (ostree_sysroot_get_path (sysroot), current_bootversion,
- current_bootversion ? 0 : 1, current_deployments,
- cancellable, error))
+ if (!ostree_sysroot_write_deployments (sysroot, current_bootversion,
+ current_bootversion ? 0 : 1, current_deployments,
+ cancellable, error))
goto out;
g_print ("Deleted deployment %s.%d\n", ostree_deployment_get_csum (target_deployment),
diff --git a/src/ostree/ot-admin-builtin-upgrade.c b/src/ostree/ot-admin-builtin-upgrade.c
index 063703d..7020400 100644
--- a/src/ostree/ot-admin-builtin-upgrade.c
+++ b/src/ostree/ot-admin-builtin-upgrade.c
@@ -24,7 +24,6 @@
#include "ot-admin-builtins.h"
#include "ot-admin-functions.h"
-#include "ot-admin-deploy.h"
#include "ostree.h"
#include "otutil.h"
#include "libgsystem.h"
@@ -78,15 +77,15 @@ ot_admin_builtin_upgrade (int argc, char **argv, OstreeSysroot *sysroot, GCancel
goto out;
}
- if (!ot_admin_require_deployment_or_osname (ostree_sysroot_get_path (sysroot), current_deployments,
- opt_osname,
- &booted_deployment,
- cancellable, error))
+ if (!ostree_sysroot_require_deployment_or_osname (sysroot, current_deployments,
+ opt_osname,
+ &booted_deployment,
+ cancellable, error))
goto out;
if (!opt_osname)
opt_osname = (char*)ostree_deployment_get_osname (booted_deployment);
- merge_deployment = ot_admin_get_merge_deployment (current_deployments, opt_osname,
- booted_deployment);
+ merge_deployment = ostree_sysroot_get_merge_deployment (current_deployments, opt_osname,
+ booted_deployment);
deployment_path = ostree_sysroot_get_deployment_directory (sysroot, merge_deployment);
deployment_origin_path = ostree_sysroot_get_deployment_origin_path (deployment_path);
@@ -135,13 +134,13 @@ ot_admin_builtin_upgrade (int argc, char **argv, OstreeSysroot *sysroot, GCancel
else
{
gs_unref_object GFile *real_sysroot = g_file_new_for_path ("/");
- if (!ot_admin_deploy (ostree_sysroot_get_path (sysroot),
- current_bootversion, current_deployments,
- opt_osname, new_revision, origin,
- NULL, FALSE,
- booted_deployment, merge_deployment,
- &new_deployment, &new_bootversion, &new_deployments,
- cancellable, error))
+ if (!ostree_sysroot_deploy (sysroot,
+ current_bootversion, current_deployments,
+ opt_osname, new_revision, origin,
+ NULL, FALSE,
+ booted_deployment, merge_deployment,
+ &new_deployment, &new_bootversion, &new_deployments,
+ cancellable, error))
goto out;
if (opt_reboot && g_file_equal (ostree_sysroot_get_path (sysroot), real_sysroot))
diff --git a/src/ostree/ot-admin-functions.c b/src/ostree/ot-admin-functions.c
index f497fcb..c72c15b 100644
--- a/src/ostree/ot-admin-functions.c
+++ b/src/ostree/ot-admin-functions.c
@@ -27,240 +27,6 @@
#include "ostree.h"
#include "libgsystem.h"
-OtOrderedHash *
-ot_admin_parse_kernel_args (const char *options)
-{
- OtOrderedHash *ret;
- char **args;
- char **iter;
-
- ret = ot_ordered_hash_new ();
-
- if (!options)
- return ret;
-
- args = g_strsplit (options, " ", -1);
- for (iter = args; *iter; iter++)
- {
- char *arg = *iter;
- char *val;
-
- val = ot_admin_util_split_keyeq (arg);
-
- g_ptr_array_add (ret->order, arg);
- g_hash_table_insert (ret->table, arg, val);
- }
-
- return ret;
-}
-
-char *
-ot_admin_kernel_arg_string_serialize (OtOrderedHash *ohash)
-{
- guint i;
- GString *buf = g_string_new ("");
- gboolean first = TRUE;
-
- for (i = 0; i < ohash->order->len; i++)
- {
- const char *key = ohash->order->pdata[i];
- const char *val = g_hash_table_lookup (ohash->table, key);
-
- g_assert (val != NULL);
-
- if (first)
- first = FALSE;
- else
- g_string_append_c (buf, ' ');
-
- if (*val)
- g_string_append_printf (buf, "%s=%s", key, val);
- else
- g_string_append (buf, key);
- }
-
- return g_string_free (buf, FALSE);
-}
-
-gboolean
-ot_admin_check_os (GFile *sysroot,
- const char *osname,
- GCancellable *cancellable,
- GError **error)
-{
- gboolean ret = FALSE;
- gs_unref_object GFile *osdir = NULL;
-
- osdir = ot_gfile_resolve_path_printf (sysroot, "ostree/deploy/%s/var", osname);
- if (!g_file_query_exists (osdir, NULL))
- {
- g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- "No such OS '%s', use os-init to create it", osname);
- goto out;
- }
-
- ret = TRUE;
- out:
- return ret;
-}
-
-static gboolean
-parse_kernel_commandline (OtOrderedHash **out_args,
- GCancellable *cancellable,
- GError **error)
-{
- gboolean ret = FALSE;
- gs_unref_object GFile *proc_cmdline = g_file_new_for_path ("/proc/cmdline");
- gs_free char *contents = NULL;
- gsize len;
-
- if (!g_file_load_contents (proc_cmdline, cancellable, &contents, &len, NULL,
- error))
- goto out;
-
- ret = TRUE;
- *out_args = ot_admin_parse_kernel_args (contents);;
- out:
- return ret;
-}
-
-/**
- * ot_admin_find_booted_deployment:
- * @target_sysroot: Root directory
- * @deployments: (element-type OstreeDeployment): Loaded deployments
- * @out_deployment: (out): The currently booted deployment
- * @cancellable:
- * @error:
- *
- * If the system is currently booted into a deployment in
- * @deployments, set @out_deployment. Note that if @target_sysroot is
- * not equal to "/", @out_deployment will always be set to %NULL.
- */
-gboolean
-ot_admin_find_booted_deployment (GFile *target_sysroot,
- GPtrArray *deployments,
- OstreeDeployment **out_deployment,
- GCancellable *cancellable,
- GError **error)
-{
- gboolean ret = FALSE;
- gs_unref_object GFile *active_root = g_file_new_for_path ("/");
- gs_unref_object OstreeSysroot *active_deployment_root = ostree_sysroot_new_default ();
- gs_unref_object OstreeDeployment *ret_deployment = NULL;
-
- if (g_file_equal (active_root, target_sysroot))
- {
- guint i;
- const char *bootlink_arg;
- __attribute__((cleanup(ot_ordered_hash_cleanup))) OtOrderedHash *kernel_args = NULL;
- guint32 root_device;
- guint64 root_inode;
-
- if (!ot_admin_util_get_devino (active_root, &root_device, &root_inode,
- cancellable, error))
- goto out;
-
- if (!parse_kernel_commandline (&kernel_args, cancellable, error))
- goto out;
-
- bootlink_arg = g_hash_table_lookup (kernel_args->table, "ostree");
- if (bootlink_arg)
- {
- for (i = 0; i < deployments->len; i++)
- {
- OstreeDeployment *deployment = deployments->pdata[i];
- gs_unref_object GFile *deployment_path = ostree_sysroot_get_deployment_directory
(active_deployment_root, deployment);
- guint32 device;
- guint64 inode;
-
- if (!ot_admin_util_get_devino (deployment_path, &device, &inode,
- cancellable, error))
- goto out;
-
- if (device == root_device && inode == root_inode)
- {
- ret_deployment = g_object_ref (deployment);
- break;
- }
- }
- if (ret_deployment == NULL)
- {
- g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- "Unexpected state: ostree= kernel argument found, but / is not a deployment
root");
- goto out;
- }
- }
- else
- {
- /* Not an ostree system */
- }
- }
-
- ret = TRUE;
- ot_transfer_out_value (out_deployment, &ret_deployment);
- out:
- return ret;
-}
-
-gboolean
-ot_admin_require_deployment_or_osname (GFile *sysroot,
- GPtrArray *deployments,
- const char *osname,
- OstreeDeployment **out_deployment,
- GCancellable *cancellable,
- GError **error)
-{
- gboolean ret = FALSE;
- gs_unref_object OstreeDeployment *ret_deployment = NULL;
-
- if (!ot_admin_find_booted_deployment (sysroot, deployments, &ret_deployment,
- cancellable, error))
- goto out;
-
- if (ret_deployment == NULL && osname == NULL)
- {
- g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- "Not currently booted into an OSTree system and no --os= argument given");
- goto out;
- }
-
- ret = TRUE;
- ot_transfer_out_value (out_deployment, &ret_deployment);
- out:
- return ret;
-}
-
-OstreeDeployment *
-ot_admin_get_merge_deployment (GPtrArray *deployments,
- const char *osname,
- OstreeDeployment *booted_deployment)
-{
- g_return_val_if_fail (osname != NULL || booted_deployment != NULL, NULL);
-
- if (osname == NULL)
- osname = ostree_deployment_get_osname (booted_deployment);
-
- if (booted_deployment &&
- g_strcmp0 (ostree_deployment_get_osname (booted_deployment), osname) == 0)
- {
- return g_object_ref (booted_deployment);
- }
- else
- {
- guint i;
- for (i = 0; i < deployments->len; i++)
- {
- OstreeDeployment *deployment = deployments->pdata[i];
-
- if (strcmp (ostree_deployment_get_osname (deployment), osname) != 0)
- continue;
-
- return g_object_ref (deployment);
- }
- }
- return NULL;
-}
-
GKeyFile *
ot_origin_new_from_refspec (const char *refspec)
{
diff --git a/src/ostree/ot-admin-functions.h b/src/ostree/ot-admin-functions.h
index 4b7a6a6..189974f 100644
--- a/src/ostree/ot-admin-functions.h
+++ b/src/ostree/ot-admin-functions.h
@@ -24,56 +24,9 @@
#include <gio/gio.h>
#include <ostree.h>
-#include "ot-ordered-hash.h"
G_BEGIN_DECLS
-char *ot_admin_util_split_keyeq (char *str);
-
-gboolean ot_admin_util_get_devino (GFile *path,
- guint32 *out_device,
- guint64 *out_inode,
- GCancellable *cancellable,
- GError **error);
-
-gboolean ot_admin_ensure_initialized (GFile *ostree_dir,
- GCancellable *cancellable,
- GError **error);
-
-gboolean ot_admin_check_os (GFile *sysroot,
- const char *osname,
- GCancellable *cancellable,
- GError **error);
-
-OtOrderedHash *ot_admin_parse_kernel_args (const char *options);
-char * ot_admin_kernel_arg_string_serialize (OtOrderedHash *ohash);
-
-gboolean ot_admin_find_booted_deployment (GFile *sysroot,
- GPtrArray *deployments,
- OstreeDeployment **out_deployment,
- GCancellable *cancellable,
- GError **error);
-
-gboolean ot_admin_require_booted_deployment (GFile *sysroot,
- OstreeDeployment **out_deployment,
- GCancellable *cancellable,
- GError **error);
-
-gboolean ot_admin_require_deployment_or_osname (GFile *sysroot,
- GPtrArray *deployment_list,
- const char *osname,
- OstreeDeployment **out_deployment,
- GCancellable *cancellable,
- GError **error);
-
-OstreeDeployment *ot_admin_get_merge_deployment (GPtrArray *deployment_list,
- const char *osname,
- OstreeDeployment *booted_deployment);
-
-gboolean ot_admin_get_default_ostree_dir (GFile **out_ostree_dir,
- GCancellable *cancellable,
- GError **error);
-
GKeyFile *ot_origin_new_from_refspec (const char *refspec);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]