core: Rework argument parsing

Default to /sysroot/ostree/repo when run as root.  Also better
handle the requires-repo flag.
This commit is contained in:
Colin Walters 2011-11-19 14:02:21 -05:00
parent 79eb682cda
commit 1dbf134946
1 changed files with 44 additions and 50 deletions

View File

@ -93,11 +93,10 @@ prep_builtin_argv (const char *builtin,
} }
static void 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); usage (argv, TRUE);
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"Unknown command");
} }
int int
@ -108,66 +107,61 @@ main (int argc,
GError *error = NULL; GError *error = NULL;
int cmd_argc; int cmd_argc;
char **cmd_argv = NULL; char **cmd_argv = NULL;
gboolean am_root;
gboolean have_repo_arg;
const char *cmd = NULL;
const char *repo = NULL;
g_type_init (); g_type_init ();
g_set_prgname (argv[0]); g_set_prgname (argv[0]);
builtin = builtins;
if (argc < 2) if (argc < 2)
return usage (argv, 1); return usage (argv, 1);
if (!g_str_has_prefix (argv[1], "--repo="))
{
const char *cmd = argv[1];
gboolean found = FALSE;
prep_builtin_argv (cmd, argc-2, argv+2, &cmd_argc, &cmd_argv); am_root = getuid () == 0;
while (builtin->name) have_repo_arg = g_str_has_prefix (argv[1], "--repo=");
{
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) if (!have_repo_arg && am_root)
set_unknown_command (argv, &error); repo = "/sysroot/ostree/repo";
} else if (have_repo_arg)
repo = argv[1] + strlen ("--repo=");
else else
repo = NULL;
if (!have_repo_arg)
cmd = argv[1];
else
cmd = argv[2];
builtin = builtins;
while (builtin->name)
{ {
const char *repo = argv[1] + strlen ("--repo="); if (strcmp (cmd, builtin->name) == 0)
const char *cmd = argv[2]; break;
gboolean found = FALSE; builtin++;
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);
} }
if (!builtin)
{
set_error_print_usage (&error, "Unknown command", argv);
goto out;
}
if (repo == NULL && !(builtin->flags & OSTREE_BUILTIN_FLAG_NO_REPO))
{
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: out:
g_free (cmd_argv); g_free (cmd_argv);
if (error) if (error)