gboolean ostree_builtin_admin (int argc, char **argv, GFile *repo_path, GError **error) { GOptionContext *context; gboolean ret = FALSE; __attribute__((unused)) GCancellable *cancellable = NULL; const char *subcommand_name; OstreeAdminCommand *subcommand; int subcmd_argc; char **subcmd_argv = NULL; ot_lobj GFile *ostree_dir = NULL; context = g_option_context_new ("[OPTIONS] SUBCOMMAND - Run an administrative subcommand"); { GString *s = g_string_new ("Subcommands:\n"); subcommand = admin_subcommands; while (subcommand->name) { g_string_append_printf (s, " %s\n", subcommand->name); subcommand++; } g_option_context_set_description (context, s->str); g_string_free (s, TRUE); } g_option_context_add_main_entries (context, options, NULL); /* Skip subcommand options */ g_option_context_set_ignore_unknown_options (context, TRUE); if (!g_option_context_parse (context, &argc, &argv, error)) goto out; if (argc <= 1) { ot_util_usage_error (context, "A valid SUBCOMMAND is required", error); goto out; } subcommand_name = argv[1]; subcommand = admin_subcommands; while (subcommand->name) { if (g_strcmp0 (subcommand_name, subcommand->name) == 0) break; subcommand++; } if (!subcommand->name) { g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, "Unknown command '%s'", subcommand_name); goto out; } ostree_dir = g_file_new_for_path (opt_ostree_dir); ostree_prep_builtin_argv (subcommand_name, argc-2, argv+2, &subcmd_argc, &subcmd_argv); if (!subcommand->fn (subcmd_argc, subcmd_argv, ostree_dir, error)) goto out; ret = TRUE; out: if (context) g_option_context_free (context); return ret; }
gboolean ostree_builtin_admin (int argc, char **argv, GCancellable *cancellable, GError **error) { gboolean ret = FALSE; const char *subcommand_name = NULL; OstreeAdminCommand *subcommand; gs_free char *prgname = NULL; int in, out; /* * Parse the global options. We rearrange the options as * necessary, in order to pass relevant options through * to the commands, but also have them take effect globally. */ for (in = 1, out = 1; in < argc; in++, out++) { /* The non-option is the command, take it out of the arguments */ if (argv[in][0] != '-') { if (subcommand_name == NULL) { subcommand_name = argv[in]; out--; continue; } } else if (g_str_equal (argv[in], "--")) { break; } argv[out] = argv[in]; } argc = out; subcommand = admin_subcommands; while (subcommand->name) { if (g_strcmp0 (subcommand_name, subcommand->name) == 0) break; subcommand++; } if (!subcommand->name) { GOptionContext *context; gs_free char *help; context = ostree_admin_option_context_new_with_commands (); /* This will not return for some options (e.g. --version). */ if (ostree_admin_option_context_parse (context, NULL, &argc, &argv, NULL, cancellable, error)) { if (subcommand_name == NULL) { g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, "No \"admin\" subcommand specified"); } else { g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, "Unknown \"admin\" subcommand '%s'", subcommand_name); } } help = g_option_context_get_help (context, FALSE, NULL); g_printerr ("%s", help); g_option_context_free (context); goto out; } prgname = g_strdup_printf ("%s %s", g_get_prgname (), subcommand_name); g_set_prgname (prgname); if (!subcommand->fn (argc, argv, cancellable, error)) goto out; ret = TRUE; out: return ret; }