[ostree] core: Rework argument parsing



commit 1dbf134946392e671f478cecf04d31e1c5aaa4db
Author: Colin Walters <walters verbum org>
Date:   Sat Nov 19 14:02:21 2011 -0500

    core: Rework argument parsing
    
    Default to /sysroot/ostree/repo when run as root.  Also better
    handle the requires-repo flag.

 src/ostree/main.c |   96 +++++++++++++++++++++++++----------------------------
 1 files changed, 45 insertions(+), 51 deletions(-)
---
diff --git a/src/ostree/main.c b/src/ostree/main.c
index 83b85a2..16a661e 100644
--- a/src/ostree/main.c
+++ b/src/ostree/main.c
@@ -93,11 +93,10 @@ prep_builtin_argv (const char *builtin,
 }
 
 static void
-set_unknown_command (char **argv, GError **error)
+set_error_print_usage (GError **error, const char *msg, char **argv)
 {
+  g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, msg);
   usage (argv, TRUE);
-  g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
-               "Unknown command");
 }
 
 int
@@ -108,65 +107,60 @@ main (int    argc,
   GError *error = NULL;
   int cmd_argc;
   char **cmd_argv = NULL;
+  gboolean am_root;
+  gboolean have_repo_arg;
+  const char *cmd = NULL;
+  const char *repo = NULL;
 
   g_type_init ();
 
   g_set_prgname (argv[0]);
 
-  builtin = builtins;
-
   if (argc < 2)
     return usage (argv, 1);
-  
-  if (!g_str_has_prefix (argv[1], "--repo="))
+
+  am_root = getuid () == 0;
+  have_repo_arg = g_str_has_prefix (argv[1], "--repo=");
+
+  if (!have_repo_arg && am_root)
+    repo = "/sysroot/ostree/repo";
+  else if (have_repo_arg)
+    repo = argv[1] + strlen ("--repo=");
+  else
+    repo = NULL;
+
+  if (!have_repo_arg)
+    cmd = argv[1];
+  else
+    cmd = argv[2];
+
+  builtin = builtins;
+  while (builtin->name)
     {
-      const char *cmd = argv[1];
-      gboolean found = FALSE;
-
-      prep_builtin_argv (cmd, argc-2, argv+2, &cmd_argc, &cmd_argv);
-      while (builtin->name)
-        {
-          if (builtin->flags & OSTREE_BUILTIN_FLAG_NO_REPO
-              && strcmp (cmd, builtin->name) == 0)
-            {
-              found = TRUE;
-              if (!builtin->fn (cmd_argc, cmd_argv, NULL, &error))
-                goto out;
-              break;
-            }
-          builtin++;
-        }
-
-      if (!found)
-        set_unknown_command (argv, &error);
+      if (strcmp (cmd, builtin->name) == 0)
+        break;
+      builtin++;
     }
-  else
+
+  if (!builtin)
+    {
+      set_error_print_usage (&error, "Unknown command", argv);
+      goto out;
+    }
+
+  if (repo == NULL && !(builtin->flags & OSTREE_BUILTIN_FLAG_NO_REPO))
     {
-      const char *repo = argv[1] + strlen ("--repo=");
-      const char *cmd = argv[2];
-      gboolean found = FALSE;
-
-      if (argc < 3)
-        return usage (argv, 1);
-
-      prep_builtin_argv (cmd, argc-3, argv+3, &cmd_argc, &cmd_argv);
-
-      while (builtin->name)
-        {
-          if (!(builtin->flags & OSTREE_BUILTIN_FLAG_NO_REPO)
-              && strcmp (cmd, builtin->name) == 0)
-            {
-              found = TRUE;
-              if (!builtin->fn (cmd_argc, cmd_argv, repo, &error))
-                goto out;
-              break;
-            }
-          builtin++;
-        }
-      
-      if (!found)
-        set_unknown_command (argv, &error);
+      set_error_print_usage (&error, "Command requires a --repo argument", argv);
+      goto out;
     }
+  
+  if (!have_repo_arg)
+    prep_builtin_argv (cmd, argc-2, argv+2, &cmd_argc, &cmd_argv);
+  else
+    prep_builtin_argv (cmd, argc-3, argv+3, &cmd_argc, &cmd_argv);
+
+  if (!builtin->fn (cmd_argc, cmd_argv, repo, &error))
+    goto out;
 
  out:
   g_free (cmd_argv);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]