bin/admin: Change init-fs to stop loading a sysroot to init one
authorColin Walters <walters@verbum.org>
Fri, 1 Sep 2017 18:57:53 +0000 (14:57 -0400)
committerAtomic Bot <atomic-devel@projectatomic.io>
Fri, 1 Sep 2017 21:34:33 +0000 (21:34 +0000)
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

src/ostree/ot-admin-builtin-init-fs.c
src/ostree/ot-main.c
src/ostree/ot-main.h

index c1fa16b0f7695c8835176f12fb04b6f4bb2775a4..a92d67dc35197915afffdd3dac3f84c995f58718 100644 (file)
@@ -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;
 }
index c8c3490ea1dd6303dba49f8c4c62470a58a6205b..48281c26c7703ee2e687dd15fec12d6e8e5bbda9 100644 (file)
@@ -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);
index c7db4a07d2f0b1b1c52aab7fe12f4b6fa5328d57..ddf52959c72fc2dc2241cde1bd1346d7bf136b05 100644 (file)
@@ -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 {