libostree: Nearly complete move of API into OstreeSysroot
Move the deployment code too.
This commit is contained in:
parent
95f07d486a
commit
c6292942ff
|
|
@ -46,6 +46,7 @@ libostree_1_la_SOURCES = \
|
||||||
src/libostree/ostree-sysroot-private.h \
|
src/libostree/ostree-sysroot-private.h \
|
||||||
src/libostree/ostree-sysroot.c \
|
src/libostree/ostree-sysroot.c \
|
||||||
src/libostree/ostree-sysroot-cleanup.c \
|
src/libostree/ostree-sysroot-cleanup.c \
|
||||||
|
src/libostree/ostree-sysroot-deploy.c \
|
||||||
src/libostree/ostree-bootconfig-parser.c \
|
src/libostree/ostree-bootconfig-parser.c \
|
||||||
src/libostree/ostree-deployment.c \
|
src/libostree/ostree-deployment.c \
|
||||||
src/libostree/ostree-bootloader.c \
|
src/libostree/ostree-bootloader.c \
|
||||||
|
|
@ -53,6 +54,8 @@ libostree_1_la_SOURCES = \
|
||||||
src/libostree/ostree-bootloader-syslinux.c \
|
src/libostree/ostree-bootloader-syslinux.c \
|
||||||
src/libostree/ostree-bootloader-uboot.h \
|
src/libostree/ostree-bootloader-uboot.h \
|
||||||
src/libostree/ostree-bootloader-uboot.c \
|
src/libostree/ostree-bootloader-uboot.c \
|
||||||
|
src/libostree/ostree-ordered-hash.h \
|
||||||
|
src/libostree/ostree-ordered-hash.c \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
if USE_LIBARCHIVE
|
if USE_LIBARCHIVE
|
||||||
libostree_1_la_SOURCES += src/libostree/ostree-libarchive-input-stream.h \
|
libostree_1_la_SOURCES += src/libostree/ostree-libarchive-input-stream.h \
|
||||||
|
|
|
||||||
|
|
@ -59,13 +59,8 @@ ostree_SOURCES += \
|
||||||
src/ostree/ot-admin-builtin-status.c \
|
src/ostree/ot-admin-builtin-status.c \
|
||||||
src/ostree/ot-admin-builtin-upgrade.c \
|
src/ostree/ot-admin-builtin-upgrade.c \
|
||||||
src/ostree/ot-admin-builtins.h \
|
src/ostree/ot-admin-builtins.h \
|
||||||
src/ostree/ot-admin-util.c \
|
|
||||||
src/ostree/ot-admin-functions.h \
|
src/ostree/ot-admin-functions.h \
|
||||||
src/ostree/ot-admin-functions.c \
|
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)
|
$(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\"
|
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\"
|
||||||
|
|
|
||||||
|
|
@ -20,21 +20,21 @@
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "ot-ordered-hash.h"
|
#include "ostree-ordered-hash.h"
|
||||||
#include "libgsystem.h"
|
#include "libgsystem.h"
|
||||||
|
|
||||||
OtOrderedHash *
|
OstreeOrderedHash *
|
||||||
ot_ordered_hash_new (void)
|
_ostree_ordered_hash_new (void)
|
||||||
{
|
{
|
||||||
OtOrderedHash *ret;
|
OstreeOrderedHash *ret;
|
||||||
ret = g_new0 (OtOrderedHash, 1);
|
ret = g_new0 (OstreeOrderedHash, 1);
|
||||||
ret->order = g_ptr_array_new_with_free_func (g_free);
|
ret->order = g_ptr_array_new_with_free_func (g_free);
|
||||||
ret->table = g_hash_table_new (g_str_hash, g_str_equal);
|
ret->table = g_hash_table_new (g_str_hash, g_str_equal);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ot_ordered_hash_free (OtOrderedHash *ohash)
|
_ostree_ordered_hash_free (OstreeOrderedHash *ohash)
|
||||||
{
|
{
|
||||||
if (!ohash)
|
if (!ohash)
|
||||||
return;
|
return;
|
||||||
|
|
@ -44,13 +44,13 @@ ot_ordered_hash_free (OtOrderedHash *ohash)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
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
|
void
|
||||||
ot_ordered_hash_replace_key_take (OtOrderedHash *ohash,
|
_ostree_ordered_hash_replace_key_take (OstreeOrderedHash *ohash,
|
||||||
char *key,
|
char *key,
|
||||||
const char *value)
|
const char *value)
|
||||||
{
|
{
|
||||||
|
|
@ -63,7 +63,7 @@ ot_ordered_hash_replace_key_take (OtOrderedHash *ohash,
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ot_ordered_hash_replace_key (OtOrderedHash *ohash,
|
_ostree_ordered_hash_replace_key (OstreeOrderedHash *ohash,
|
||||||
const char *key,
|
const char *key,
|
||||||
const char *val)
|
const char *val)
|
||||||
{
|
{
|
||||||
|
|
@ -79,5 +79,5 @@ ot_ordered_hash_replace_key (OtOrderedHash *ohash,
|
||||||
valblock = g_string_free (buf, FALSE);
|
valblock = g_string_free (buf, FALSE);
|
||||||
valp = valblock + keylen + 1;
|
valp = valblock + keylen + 1;
|
||||||
|
|
||||||
ot_ordered_hash_replace_key_take (ohash, valblock, valp);
|
_ostree_ordered_hash_replace_key_take (ohash, valblock, valp);
|
||||||
}
|
}
|
||||||
|
|
@ -27,17 +27,17 @@ G_BEGIN_DECLS
|
||||||
typedef struct {
|
typedef struct {
|
||||||
GPtrArray *order;
|
GPtrArray *order;
|
||||||
GHashTable *table;
|
GHashTable *table;
|
||||||
} OtOrderedHash;
|
} OstreeOrderedHash;
|
||||||
|
|
||||||
OtOrderedHash *ot_ordered_hash_new (void);
|
OstreeOrderedHash *_ostree_ordered_hash_new (void);
|
||||||
void ot_ordered_hash_free (OtOrderedHash *ohash);
|
void _ostree_ordered_hash_free (OstreeOrderedHash *ohash);
|
||||||
void ot_ordered_hash_cleanup (void *loc);
|
void _ostree_ordered_hash_cleanup (void *loc);
|
||||||
void ot_ordered_hash_replace_key_take (OtOrderedHash *ohash,
|
void _ostree_ordered_hash_replace_key_take (OstreeOrderedHash *ohash,
|
||||||
char *key,
|
char *key,
|
||||||
const char *value);
|
const char *value);
|
||||||
void ot_ordered_hash_replace_key (OtOrderedHash *ohash,
|
void _ostree_ordered_hash_replace_key (OstreeOrderedHash *ohash,
|
||||||
const char *key,
|
const char *key,
|
||||||
const char *val);
|
const char *val);
|
||||||
|
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
@ -22,13 +22,10 @@
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "ot-admin-functions.h"
|
#include "ostree-sysroot-private.h"
|
||||||
#include "ot-admin-deploy.h"
|
|
||||||
#include "otutil.h"
|
#include "otutil.h"
|
||||||
#include "ostree-core.h"
|
|
||||||
#include "libgsystem.h"
|
#include "libgsystem.h"
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* copy_one_config_file:
|
* copy_one_config_file:
|
||||||
*
|
*
|
||||||
|
|
@ -197,7 +194,7 @@ merge_etc_changes (GFile *orig_etc,
|
||||||
* /ostree/deploy/OS/deploy/${treecsum}.${deployserial}.
|
* /ostree/deploy/OS/deploy/${treecsum}.${deployserial}.
|
||||||
*/
|
*/
|
||||||
static gboolean
|
static gboolean
|
||||||
checkout_deployment_tree (GFile *sysroot,
|
checkout_deployment_tree (OstreeSysroot *sysroot,
|
||||||
OstreeRepo *repo,
|
OstreeRepo *repo,
|
||||||
OstreeDeployment *deployment,
|
OstreeDeployment *deployment,
|
||||||
GFile **out_deployment_path,
|
GFile **out_deployment_path,
|
||||||
|
|
@ -222,7 +219,7 @@ checkout_deployment_tree (GFile *sysroot,
|
||||||
if (!file_info)
|
if (!file_info)
|
||||||
goto out;
|
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),
|
ostree_deployment_get_osname (deployment),
|
||||||
"deploy", NULL);
|
"deploy", NULL);
|
||||||
checkout_target_name = g_strdup_printf ("%s.%d", csum, ostree_deployment_get_deployserial (deployment));
|
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
|
static gboolean
|
||||||
merge_configuration (OstreeSysroot *sysroot_obj,
|
merge_configuration (OstreeSysroot *sysroot,
|
||||||
OstreeDeployment *previous_deployment,
|
OstreeDeployment *previous_deployment,
|
||||||
OstreeDeployment *deployment,
|
OstreeDeployment *deployment,
|
||||||
GFile *deployment_path,
|
GFile *deployment_path,
|
||||||
|
|
@ -266,7 +263,7 @@ merge_configuration (OstreeSysroot *sysroot_obj,
|
||||||
gs_unref_object GFile *previous_path = NULL;
|
gs_unref_object GFile *previous_path = NULL;
|
||||||
OstreeBootconfigParser *previous_bootconfig;
|
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_path = g_file_resolve_relative_path (previous_path, "etc");
|
||||||
source_etc_pristine_path = g_file_resolve_relative_path (previous_path, "usr/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
|
static gboolean
|
||||||
write_origin_file (GFile *sysroot,
|
write_origin_file (OstreeSysroot *sysroot,
|
||||||
OstreeDeployment *deployment,
|
OstreeDeployment *deployment,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
gboolean ret = FALSE;
|
||||||
gs_unref_object OstreeSysroot *sysroot_obj = NULL;
|
|
||||||
GKeyFile *origin = ostree_deployment_get_origin (deployment);
|
GKeyFile *origin = ostree_deployment_get_origin (deployment);
|
||||||
|
|
||||||
sysroot_obj = ostree_sysroot_new (sysroot);
|
|
||||||
|
|
||||||
if (origin)
|
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_unref_object GFile *origin_path = ostree_sysroot_get_deployment_origin_path (deployment_path);
|
||||||
gs_free char *contents = NULL;
|
gs_free char *contents = NULL;
|
||||||
gsize len;
|
gsize len;
|
||||||
|
|
@ -852,7 +846,7 @@ install_deployment_kernel (OstreeSysroot *sysroot,
|
||||||
gs_free char *version_key = NULL;
|
gs_free char *version_key = NULL;
|
||||||
gs_free char *ostree_kernel_arg = NULL;
|
gs_free char *ostree_kernel_arg = NULL;
|
||||||
gs_free char *options_key = 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;
|
const char *val;
|
||||||
OstreeBootconfigParser *bootconfig;
|
OstreeBootconfigParser *bootconfig;
|
||||||
gsize len;
|
gsize len;
|
||||||
|
|
@ -948,9 +942,9 @@ install_deployment_kernel (OstreeSysroot *sysroot,
|
||||||
ostree_kernel_arg = g_strdup_printf ("/ostree/boot.%d/%s/%s/%d",
|
ostree_kernel_arg = g_strdup_printf ("/ostree/boot.%d/%s/%s/%d",
|
||||||
new_bootversion, osname, bootcsum,
|
new_bootversion, osname, bootcsum,
|
||||||
ostree_deployment_get_bootserial (deployment));
|
ostree_deployment_get_bootserial (deployment));
|
||||||
ohash = ot_admin_parse_kernel_args (val);
|
ohash = _ostree_sysroot_parse_kernel_args (val);
|
||||||
ot_ordered_hash_replace_key (ohash, "ostree", ostree_kernel_arg);
|
_ostree_ordered_hash_replace_key (ohash, "ostree", ostree_kernel_arg);
|
||||||
options_key = ot_admin_kernel_arg_string_serialize (ohash);
|
options_key = _ostree_sysroot_kernel_arg_string_serialize (ohash);
|
||||||
ostree_bootconfig_parser_set (bootconfig, "options", options_key);
|
ostree_bootconfig_parser_set (bootconfig, "options", options_key);
|
||||||
|
|
||||||
if (!ostree_bootconfig_parser_write (ostree_deployment_get_bootconfig (deployment), bootconfpath,
|
if (!ostree_bootconfig_parser_write (ostree_deployment_get_bootconfig (deployment), bootconfpath,
|
||||||
|
|
@ -963,7 +957,7 @@ install_deployment_kernel (OstreeSysroot *sysroot,
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
swap_bootloader (GFile *sysroot,
|
swap_bootloader (OstreeSysroot *sysroot,
|
||||||
int current_bootversion,
|
int current_bootversion,
|
||||||
int new_bootversion,
|
int new_bootversion,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
|
|
@ -976,7 +970,7 @@ swap_bootloader (GFile *sysroot,
|
||||||
g_assert ((current_bootversion == 0 && new_bootversion == 1) ||
|
g_assert ((current_bootversion == 0 && new_bootversion == 1) ||
|
||||||
(current_bootversion == 1 && new_bootversion == 0));
|
(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);
|
new_target = g_strdup_printf ("loader.%d", new_bootversion);
|
||||||
|
|
||||||
if (!ot_gfile_atomic_symlink_swap (boot_loader_link, new_target,
|
if (!ot_gfile_atomic_symlink_swap (boot_loader_link, new_target,
|
||||||
|
|
@ -989,17 +983,16 @@ swap_bootloader (GFile *sysroot,
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
ot_admin_write_deployments (GFile *sysroot,
|
ostree_sysroot_write_deployments (OstreeSysroot *sysroot,
|
||||||
int current_bootversion,
|
int current_bootversion,
|
||||||
int new_bootversion,
|
int new_bootversion,
|
||||||
GPtrArray *new_deployments,
|
GPtrArray *new_deployments,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
gboolean ret = FALSE;
|
||||||
guint i;
|
guint i;
|
||||||
gs_unref_object OstreeSysroot *sysroot_obj = ostree_sysroot_new (sysroot);
|
gs_unref_object OstreeBootloader *bootloader = ostree_sysroot_query_bootloader (sysroot);
|
||||||
gs_unref_object OstreeBootloader *bootloader = ostree_sysroot_query_bootloader (sysroot_obj);
|
|
||||||
|
|
||||||
if (bootloader)
|
if (bootloader)
|
||||||
g_print ("Detected bootloader: %s\n", ostree_bootloader_get_name (bootloader));
|
g_print ("Detected bootloader: %s\n", ostree_bootloader_get_name (bootloader));
|
||||||
|
|
@ -1014,7 +1007,7 @@ ot_admin_write_deployments (GFile *sysroot,
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!swap_bootlinks (sysroot_obj, current_bootversion,
|
if (!swap_bootlinks (sysroot, current_bootversion,
|
||||||
new_deployments,
|
new_deployments,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
{
|
{
|
||||||
|
|
@ -1027,7 +1020,7 @@ ot_admin_write_deployments (GFile *sysroot,
|
||||||
for (i = 0; i < new_deployments->len; i++)
|
for (i = 0; i < new_deployments->len; i++)
|
||||||
{
|
{
|
||||||
OstreeDeployment *deployment = new_deployments->pdata[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,
|
deployment, new_deployments->len,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
{
|
{
|
||||||
|
|
@ -1037,7 +1030,7 @@ ot_admin_write_deployments (GFile *sysroot,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Swap bootlinks for *new* version */
|
/* Swap bootlinks for *new* version */
|
||||||
if (!swap_bootlinks (sysroot_obj, new_bootversion, new_deployments,
|
if (!swap_bootlinks (sysroot, new_bootversion, new_deployments,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
{
|
{
|
||||||
g_prefix_error (error, "Generating new bootlinks: ");
|
g_prefix_error (error, "Generating new bootlinks: ");
|
||||||
|
|
@ -1071,25 +1064,24 @@ ot_admin_write_deployments (GFile *sysroot,
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
ot_admin_deploy (GFile *sysroot,
|
ostree_sysroot_deploy (OstreeSysroot *sysroot,
|
||||||
int current_bootversion,
|
int current_bootversion,
|
||||||
GPtrArray *current_deployments,
|
GPtrArray *current_deployments,
|
||||||
const char *osname,
|
const char *osname,
|
||||||
const char *revision,
|
const char *revision,
|
||||||
GKeyFile *origin,
|
GKeyFile *origin,
|
||||||
char **add_kernel_argv,
|
char **add_kernel_argv,
|
||||||
gboolean retain,
|
gboolean retain,
|
||||||
OstreeDeployment *booted_deployment,
|
OstreeDeployment *booted_deployment,
|
||||||
OstreeDeployment *provided_merge_deployment,
|
OstreeDeployment *provided_merge_deployment,
|
||||||
OstreeDeployment **out_new_deployment,
|
OstreeDeployment **out_new_deployment,
|
||||||
int *out_new_bootversion,
|
int *out_new_bootversion,
|
||||||
GPtrArray **out_new_deployments,
|
GPtrArray **out_new_deployments,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
gboolean ret = FALSE;
|
||||||
OstreeDeployment *new_deployment;
|
OstreeDeployment *new_deployment;
|
||||||
gs_unref_object OstreeSysroot *sysroot_obj = NULL;
|
|
||||||
gs_unref_object OstreeDeployment *merge_deployment = NULL;
|
gs_unref_object OstreeDeployment *merge_deployment = NULL;
|
||||||
gs_unref_object OstreeRepo *repo = NULL;
|
gs_unref_object OstreeRepo *repo = NULL;
|
||||||
gs_unref_object GFile *commit_root = NULL;
|
gs_unref_object GFile *commit_root = NULL;
|
||||||
|
|
@ -1101,9 +1093,7 @@ ot_admin_deploy (GFile *sysroot,
|
||||||
gs_unref_ptrarray GPtrArray *new_deployments = NULL;
|
gs_unref_ptrarray GPtrArray *new_deployments = NULL;
|
||||||
int new_bootversion;
|
int new_bootversion;
|
||||||
|
|
||||||
sysroot_obj = ostree_sysroot_new (sysroot);
|
if (!ostree_sysroot_get_repo (sysroot, &repo, cancellable, error))
|
||||||
|
|
||||||
if (!ostree_sysroot_get_repo (sysroot_obj, &repo, cancellable, error))
|
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/* Here we perform cleanup of any leftover data from previous
|
/* 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
|
* TODO: Add /ostree/transaction file, and only do this cleanup if
|
||||||
* we find it.
|
* 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: ");
|
g_prefix_error (error, "Performing initial cleanup: ");
|
||||||
goto out;
|
goto out;
|
||||||
|
|
@ -1144,8 +1134,8 @@ ot_admin_deploy (GFile *sysroot,
|
||||||
if (provided_merge_deployment != NULL)
|
if (provided_merge_deployment != NULL)
|
||||||
merge_deployment = g_object_ref (provided_merge_deployment);
|
merge_deployment = g_object_ref (provided_merge_deployment);
|
||||||
else
|
else
|
||||||
merge_deployment = ot_admin_get_merge_deployment (current_deployments, osname,
|
merge_deployment = ostree_sysroot_get_merge_deployment (current_deployments, osname,
|
||||||
booted_deployment);
|
booted_deployment);
|
||||||
|
|
||||||
compute_new_deployment_list (current_bootversion,
|
compute_new_deployment_list (current_bootversion,
|
||||||
current_deployments, osname,
|
current_deployments, osname,
|
||||||
|
|
@ -1179,7 +1169,7 @@ ot_admin_deploy (GFile *sysroot,
|
||||||
bootconfig = ostree_bootconfig_parser_new ();
|
bootconfig = ostree_bootconfig_parser_new ();
|
||||||
ostree_deployment_set_bootconfig (new_deployment, bootconfig);
|
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,
|
new_deployment_path,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
{
|
{
|
||||||
|
|
@ -1197,25 +1187,25 @@ ot_admin_deploy (GFile *sysroot,
|
||||||
if (add_kernel_argv)
|
if (add_kernel_argv)
|
||||||
{
|
{
|
||||||
char **strviter;
|
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;
|
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++)
|
for (strviter = add_kernel_argv; *strviter; strviter++)
|
||||||
{
|
{
|
||||||
char *karg = g_strdup (*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);
|
ostree_bootconfig_parser_set (bootconfig, "options", new_options);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ot_admin_write_deployments (sysroot, current_bootversion, new_bootversion,
|
if (!ostree_sysroot_write_deployments (sysroot, current_bootversion, new_bootversion,
|
||||||
new_deployments, cancellable, error))
|
new_deployments, cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
g_print ("Transaction complete, performing cleanup\n");
|
g_print ("Transaction complete, performing cleanup\n");
|
||||||
|
|
@ -1226,7 +1216,7 @@ ot_admin_deploy (GFile *sysroot,
|
||||||
* done from the host.
|
* 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_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);
|
gs_free char *target = g_file_get_relative_path (osdir, new_deployment_path);
|
||||||
g_assert (target != NULL);
|
g_assert (target != NULL);
|
||||||
|
|
@ -1237,7 +1227,7 @@ ot_admin_deploy (GFile *sysroot,
|
||||||
|
|
||||||
/* And finally, cleanup of any leftover data.
|
/* 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: ");
|
g_prefix_error (error, "Performing final cleanup: ");
|
||||||
goto out;
|
goto out;
|
||||||
|
|
@ -21,6 +21,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "ostree.h"
|
#include "ostree.h"
|
||||||
|
#include "ostree-ordered-hash.h"
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
|
@ -53,5 +54,11 @@ _ostree_sysroot_get_devino (GFile *path,
|
||||||
|
|
||||||
char *_ostree_sysroot_join_lines (GPtrArray *lines);
|
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
|
G_END_DECLS
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -839,3 +839,243 @@ _ostree_sysroot_join_lines (GPtrArray *lines)
|
||||||
}
|
}
|
||||||
return g_string_free (buf, FALSE);
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -73,5 +73,46 @@ gboolean ostree_sysroot_get_repo (OstreeSysroot *self,
|
||||||
OstreeBootloader *ostree_sysroot_query_bootloader (OstreeSysroot *sysroot);
|
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
|
G_END_DECLS
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,8 +24,6 @@
|
||||||
|
|
||||||
#include "ot-admin-builtins.h"
|
#include "ot-admin-builtins.h"
|
||||||
#include "ot-admin-functions.h"
|
#include "ot-admin-functions.h"
|
||||||
#include "ot-admin-deploy.h"
|
|
||||||
#include "ot-ordered-hash.h"
|
|
||||||
#include "ostree.h"
|
#include "ostree.h"
|
||||||
#include "otutil.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
|
/* Find the currently booted deployment, if any; we will ensure it
|
||||||
* is present in the new deployment list.
|
* is present in the new deployment list.
|
||||||
*/
|
*/
|
||||||
if (!ot_admin_require_deployment_or_osname (ostree_sysroot_get_path (sysroot), current_deployments,
|
if (!ostree_sysroot_require_deployment_or_osname (sysroot, current_deployments,
|
||||||
opt_osname,
|
opt_osname,
|
||||||
&booted_deployment,
|
&booted_deployment,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
{
|
{
|
||||||
g_prefix_error (error, "Looking for booted deployment: ");
|
g_prefix_error (error, "Looking for booted deployment: ");
|
||||||
goto out;
|
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))
|
if (!ostree_repo_resolve_rev (repo, refspec, FALSE, &revision, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (!ot_admin_deploy (ostree_sysroot_get_path (sysroot), current_bootversion, current_deployments,
|
if (!ostree_sysroot_deploy (sysroot, current_bootversion, current_deployments,
|
||||||
opt_osname, revision, origin,
|
opt_osname, revision, origin,
|
||||||
opt_kernel_argv, opt_retain,
|
opt_kernel_argv, opt_retain,
|
||||||
booted_deployment, NULL,
|
booted_deployment, NULL,
|
||||||
&new_deployment, &new_bootversion, &new_deployments,
|
&new_deployment, &new_bootversion, &new_deployments,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
|
|
|
||||||
|
|
@ -68,14 +68,14 @@ ot_admin_builtin_diff (int argc, char **argv, OstreeSysroot *sysroot, GCancellab
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ot_admin_require_deployment_or_osname (ostree_sysroot_get_path (sysroot), deployments,
|
if (!ostree_sysroot_require_deployment_or_osname (sysroot, deployments,
|
||||||
opt_osname, &deployment,
|
opt_osname, &deployment,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
if (deployment != NULL)
|
if (deployment != NULL)
|
||||||
opt_osname = (char*)ostree_deployment_get_osname (deployment);
|
opt_osname = (char*)ostree_deployment_get_osname (deployment);
|
||||||
if (deployment == NULL)
|
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)
|
if (deployment == NULL)
|
||||||
{
|
{
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND,
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND,
|
||||||
|
|
|
||||||
|
|
@ -57,9 +57,9 @@ ot_admin_builtin_status (int argc, char **argv, OstreeSysroot *sysroot, GCancell
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ot_admin_find_booted_deployment (ostree_sysroot_get_path (sysroot), deployments,
|
if (!ostree_sysroot_find_booted_deployment (sysroot, deployments,
|
||||||
&booted_deployment,
|
&booted_deployment,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (deployments->len == 0)
|
if (deployments->len == 0)
|
||||||
|
|
|
||||||
|
|
@ -24,8 +24,6 @@
|
||||||
|
|
||||||
#include "ot-admin-builtins.h"
|
#include "ot-admin-builtins.h"
|
||||||
#include "ot-admin-functions.h"
|
#include "ot-admin-functions.h"
|
||||||
#include "ot-admin-deploy.h"
|
|
||||||
#include "ot-ordered-hash.h"
|
|
||||||
#include "ostree.h"
|
#include "ostree.h"
|
||||||
#include "otutil.h"
|
#include "otutil.h"
|
||||||
|
|
||||||
|
|
@ -68,8 +66,8 @@ ot_admin_builtin_undeploy (int argc, char **argv, OstreeSysroot *sysroot, GCance
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ot_admin_find_booted_deployment (ostree_sysroot_get_path (sysroot), current_deployments, &booted_deployment,
|
if (!ostree_sysroot_find_booted_deployment (sysroot, current_deployments, &booted_deployment,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (deploy_index < 0)
|
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);
|
g_ptr_array_remove_index (current_deployments, deploy_index);
|
||||||
|
|
||||||
if (!ot_admin_write_deployments (ostree_sysroot_get_path (sysroot), current_bootversion,
|
if (!ostree_sysroot_write_deployments (sysroot, current_bootversion,
|
||||||
current_bootversion ? 0 : 1, current_deployments,
|
current_bootversion ? 0 : 1, current_deployments,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
g_print ("Deleted deployment %s.%d\n", ostree_deployment_get_csum (target_deployment),
|
g_print ("Deleted deployment %s.%d\n", ostree_deployment_get_csum (target_deployment),
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,6 @@
|
||||||
|
|
||||||
#include "ot-admin-builtins.h"
|
#include "ot-admin-builtins.h"
|
||||||
#include "ot-admin-functions.h"
|
#include "ot-admin-functions.h"
|
||||||
#include "ot-admin-deploy.h"
|
|
||||||
#include "ostree.h"
|
#include "ostree.h"
|
||||||
#include "otutil.h"
|
#include "otutil.h"
|
||||||
#include "libgsystem.h"
|
#include "libgsystem.h"
|
||||||
|
|
@ -78,15 +77,15 @@ ot_admin_builtin_upgrade (int argc, char **argv, OstreeSysroot *sysroot, GCancel
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ot_admin_require_deployment_or_osname (ostree_sysroot_get_path (sysroot), current_deployments,
|
if (!ostree_sysroot_require_deployment_or_osname (sysroot, current_deployments,
|
||||||
opt_osname,
|
opt_osname,
|
||||||
&booted_deployment,
|
&booted_deployment,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
if (!opt_osname)
|
if (!opt_osname)
|
||||||
opt_osname = (char*)ostree_deployment_get_osname (booted_deployment);
|
opt_osname = (char*)ostree_deployment_get_osname (booted_deployment);
|
||||||
merge_deployment = ot_admin_get_merge_deployment (current_deployments, opt_osname,
|
merge_deployment = ostree_sysroot_get_merge_deployment (current_deployments, opt_osname,
|
||||||
booted_deployment);
|
booted_deployment);
|
||||||
|
|
||||||
deployment_path = ostree_sysroot_get_deployment_directory (sysroot, merge_deployment);
|
deployment_path = ostree_sysroot_get_deployment_directory (sysroot, merge_deployment);
|
||||||
deployment_origin_path = ostree_sysroot_get_deployment_origin_path (deployment_path);
|
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
|
else
|
||||||
{
|
{
|
||||||
gs_unref_object GFile *real_sysroot = g_file_new_for_path ("/");
|
gs_unref_object GFile *real_sysroot = g_file_new_for_path ("/");
|
||||||
if (!ot_admin_deploy (ostree_sysroot_get_path (sysroot),
|
if (!ostree_sysroot_deploy (sysroot,
|
||||||
current_bootversion, current_deployments,
|
current_bootversion, current_deployments,
|
||||||
opt_osname, new_revision, origin,
|
opt_osname, new_revision, origin,
|
||||||
NULL, FALSE,
|
NULL, FALSE,
|
||||||
booted_deployment, merge_deployment,
|
booted_deployment, merge_deployment,
|
||||||
&new_deployment, &new_bootversion, &new_deployments,
|
&new_deployment, &new_bootversion, &new_deployments,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (opt_reboot && g_file_equal (ostree_sysroot_get_path (sysroot), real_sysroot))
|
if (opt_reboot && g_file_equal (ostree_sysroot_get_path (sysroot), real_sysroot))
|
||||||
|
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
|
|
||||||
*
|
|
||||||
* Copyright (C) 2012 Colin Walters <walters@verbum.org>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; if not, write to the
|
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*
|
|
||||||
* Author: Colin Walters <walters@verbum.org>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <gio/gio.h>
|
|
||||||
#include <ostree.h>
|
|
||||||
#include "ot-ordered-hash.h"
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
gboolean ot_admin_write_deployments (GFile *sysroot,
|
|
||||||
int current_bootversion,
|
|
||||||
int new_bootversion,
|
|
||||||
GPtrArray *new_deployments,
|
|
||||||
GCancellable *cancellable,
|
|
||||||
GError **error);
|
|
||||||
|
|
||||||
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 *merge_deployment,
|
|
||||||
OstreeDeployment **out_new_deployment,
|
|
||||||
int *out_new_bootversion,
|
|
||||||
GPtrArray **out_new_deployments,
|
|
||||||
GCancellable *cancellable,
|
|
||||||
GError **error);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
|
|
@ -27,240 +27,6 @@
|
||||||
#include "ostree.h"
|
#include "ostree.h"
|
||||||
#include "libgsystem.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 *
|
GKeyFile *
|
||||||
ot_origin_new_from_refspec (const char *refspec)
|
ot_origin_new_from_refspec (const char *refspec)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -24,56 +24,9 @@
|
||||||
|
|
||||||
#include <gio/gio.h>
|
#include <gio/gio.h>
|
||||||
#include <ostree.h>
|
#include <ostree.h>
|
||||||
#include "ot-ordered-hash.h"
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
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);
|
GKeyFile *ot_origin_new_from_refspec (const char *refspec);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
|
||||||
|
|
@ -1,78 +0,0 @@
|
||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
|
|
||||||
*
|
|
||||||
* Copyright (C) 2012 Colin Walters <walters@verbum.org>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; if not, write to the
|
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*
|
|
||||||
* Author: Colin Walters <walters@verbum.org>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "ot-admin-functions.h"
|
|
||||||
#include "otutil.h"
|
|
||||||
#include "ostree-core.h"
|
|
||||||
#include "libgsystem.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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 *
|
|
||||||
ot_admin_util_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 "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
ot_admin_util_get_devino (GFile *path,
|
|
||||||
guint32 *out_device,
|
|
||||||
guint64 *out_inode,
|
|
||||||
GCancellable *cancellable,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
gboolean ret = FALSE;
|
|
||||||
gs_unref_object GFileInfo *finfo = g_file_query_info (path, "unix::device,unix::inode",
|
|
||||||
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
|
|
||||||
cancellable, error);
|
|
||||||
|
|
||||||
if (!finfo)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
ret = TRUE;
|
|
||||||
*out_device = g_file_info_get_attribute_uint32 (finfo, "unix::device");
|
|
||||||
*out_inode = g_file_info_get_attribute_uint64 (finfo, "unix::inode");
|
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
Loading…
Reference in New Issue