diff options
author | Colin Walters <walters@verbum.org> | 2017-09-01 14:57:53 -0400 |
---|---|---|
committer | Atomic Bot <atomic-devel@projectatomic.io> | 2017-09-01 21:34:33 +0000 |
commit | 517dd9c9648f6d1508343429086ac5a471bea7ec (patch) | |
tree | 199dfa66ba7df7de5b03a74877ccc0e091c74d71 /src | |
parent | aef5a7331e112f4d8c3ce7ccc4abcc4b6c2a2c76 (diff) | |
download | ostree-517dd9c9648f6d1508343429086ac5a471bea7ec.tar.gz |
bin/admin: Change init-fs to stop loading a sysroot to init one
This is exactly analogous to the `ostree init` case where
we have `OSTREE_BUILTIN_FLAG_NO_REPO` to avoid trying to load
a repo when we're creating one.
Let's avoid the pointless sysroot for `init-fs`; among other
things this will then let us do `ostree_sysroot_load()` inside
the argument parsing, and drop it from every other user.
Closes: #1123
Approved by: jlebon
Diffstat (limited to 'src')
-rw-r--r-- | src/ostree/ot-admin-builtin-init-fs.c | 54 | ||||
-rw-r--r-- | src/ostree/ot-main.c | 7 | ||||
-rw-r--r-- | src/ostree/ot-main.h | 5 |
3 files changed, 34 insertions, 32 deletions
diff --git a/src/ostree/ot-admin-builtin-init-fs.c b/src/ostree/ot-admin-builtin-init-fs.c index c1fa16b0..a92d67dc 100644 --- a/src/ostree/ot-admin-builtin-init-fs.c +++ b/src/ostree/ot-admin-builtin-init-fs.c @@ -41,57 +41,51 @@ static GOptionEntry options[] = { gboolean ot_admin_builtin_init_fs (int argc, char **argv, GCancellable *cancellable, GError **error) { - g_autoptr(GOptionContext) context = NULL; - g_autoptr(OstreeSysroot) sysroot = NULL; - gboolean ret = FALSE; - glnx_fd_close int root_dfd = -1; - g_autoptr(OstreeSysroot) target_sysroot = NULL; - guint i; - const char *normal_toplevels[] = {"boot", "dev", "home", "proc", "run", "sys"}; - - context = g_option_context_new ("PATH - Initialize a root filesystem"); + g_autoptr(GOptionContext) context = g_option_context_new ("PATH - Initialize a root filesystem"); if (!ostree_admin_option_context_parse (context, options, &argc, &argv, - OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER | OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED, - &sysroot, cancellable, error)) - goto out; + OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER | + OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED | + OSTREE_ADMIN_BUILTIN_FLAG_NO_SYSROOT, + NULL, cancellable, error)) + return FALSE; if (argc < 2) { ot_util_usage_error (context, "PATH must be specified", error); - goto out; + return FALSE; } - if (!glnx_opendirat (AT_FDCWD, argv[1], TRUE, &root_dfd, error)) - goto out; - { g_autoptr(GFile) dir = g_file_new_for_path (argv[1]); - target_sysroot = ostree_sysroot_new (dir); - } + const char *sysroot_path = argv[1]; + + glnx_fd_close int root_dfd = -1; + if (!glnx_opendirat (AT_FDCWD, sysroot_path, TRUE, &root_dfd, error)) + return FALSE; - for (i = 0; i < G_N_ELEMENTS(normal_toplevels); i++) + const char *normal_toplevels[] = {"boot", "dev", "home", "proc", "run", "sys"}; + for (guint i = 0; i < G_N_ELEMENTS (normal_toplevels); i++) { if (!glnx_shutil_mkdir_p_at (root_dfd, normal_toplevels[i], 0755, cancellable, error)) - goto out; + return FALSE; } - + if (!glnx_shutil_mkdir_p_at (root_dfd, "root", 0700, cancellable, error)) - goto out; + return FALSE; if (!glnx_shutil_mkdir_p_at (root_dfd, "tmp", 01777, cancellable, error)) - goto out; + return FALSE; if (fchmodat (root_dfd, "tmp", 01777, 0) == -1) { glnx_set_prefix_error_from_errno (error, "chmod: %s", "tmp"); - goto out; + return FALSE; } + g_autoptr(GFile) dir = g_file_new_for_path (sysroot_path); + g_autoptr(OstreeSysroot) sysroot = ostree_sysroot_new (dir); + if (!ostree_sysroot_ensure_initialized (sysroot, cancellable, error)) + return FALSE; - if (!ostree_sysroot_ensure_initialized (target_sysroot, cancellable, error)) - goto out; - - ret = TRUE; - out: - return ret; + return TRUE; } diff --git a/src/ostree/ot-main.c b/src/ostree/ot-main.c index c8c3490e..48281c26 100644 --- a/src/ostree/ot-main.c +++ b/src/ostree/ot-main.c @@ -377,6 +377,13 @@ ostree_admin_option_context_parse (GOptionContext *context, if (!ostree_option_context_parse (context, main_entries, argc, argv, OSTREE_BUILTIN_FLAG_NO_REPO, NULL, cancellable, error)) return FALSE; + if (flags & OSTREE_ADMIN_BUILTIN_FLAG_NO_SYSROOT) + { + g_assert_null (out_sysroot); + /* Early return if no sysroot is requested */ + return TRUE; + } + g_autoptr(GFile) sysroot_path = NULL; if (opt_sysroot != NULL) sysroot_path = g_file_new_for_path (opt_sysroot); diff --git a/src/ostree/ot-main.h b/src/ostree/ot-main.h index c7db4a07..ddf52959 100644 --- a/src/ostree/ot-main.h +++ b/src/ostree/ot-main.h @@ -33,8 +33,9 @@ typedef enum { typedef enum { OSTREE_ADMIN_BUILTIN_FLAG_NONE = 0, - OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER = 1 << 0, - OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED = 1 << 1 + OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER = (1 << 0), + OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED = (1 << 1), + OSTREE_ADMIN_BUILTIN_FLAG_NO_SYSROOT = (1 << 2), } OstreeAdminBuiltinFlags; typedef struct { |