|
Packit |
8ea169 |
/*
|
|
Packit |
8ea169 |
Copyright (C) 2011 ABRT Team
|
|
Packit |
8ea169 |
Copyright (C) 2011 RedHat inc.
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
This program is free software; you can redistribute it and/or modify
|
|
Packit |
8ea169 |
it under the terms of the GNU General Public License as published by
|
|
Packit |
8ea169 |
the Free Software Foundation; either version 2 of the License, or
|
|
Packit |
8ea169 |
(at your option) any later version.
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
This program is distributed in the hope that it will be useful,
|
|
Packit |
8ea169 |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
8ea169 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
8ea169 |
GNU General Public License for more details.
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
You should have received a copy of the GNU General Public License along
|
|
Packit |
8ea169 |
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
Packit |
8ea169 |
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
Packit |
8ea169 |
*/
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
#include "libabrt.h"
|
|
Packit |
8ea169 |
#include "builtin-cmd.h"
|
|
Packit |
8ea169 |
#include "abrt-cli-core.h"
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
#define USAGE_OPTS_WIDTH 16
|
|
Packit |
8ea169 |
#define USAGE_GAP 2
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
/* TODO: add --pager(default) and --no-pager */
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
#define CMD(NAME, ABBREV, help) { #NAME, ABBREV, cmd_##NAME , (help) }
|
|
Packit |
8ea169 |
struct cmd_struct {
|
|
Packit |
8ea169 |
const char *cmd;
|
|
Packit |
8ea169 |
const char *abbrev;
|
|
Packit |
8ea169 |
int (*fn)(int, const char **);
|
|
Packit |
8ea169 |
const char *help;
|
|
Packit |
8ea169 |
};
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
static void list_cmds_help(const struct cmd_struct *commands)
|
|
Packit |
8ea169 |
{
|
|
Packit |
8ea169 |
for (const struct cmd_struct *p = commands; p->cmd; ++p)
|
|
Packit |
8ea169 |
{
|
|
Packit |
8ea169 |
size_t pos;
|
|
Packit |
8ea169 |
int pad;
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
pos = fprintf(stderr, " ");
|
|
Packit |
8ea169 |
pos += fprintf(stderr, "%s", p->cmd);
|
|
Packit |
8ea169 |
pos += fprintf(stderr, ", %s", p->abbrev);
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
if (pos <= USAGE_OPTS_WIDTH)
|
|
Packit |
8ea169 |
pad = USAGE_OPTS_WIDTH - pos;
|
|
Packit |
8ea169 |
else
|
|
Packit |
8ea169 |
{
|
|
Packit |
8ea169 |
fputc('\n', stderr);
|
|
Packit |
8ea169 |
pad = USAGE_OPTS_WIDTH;
|
|
Packit |
8ea169 |
}
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
fprintf(stderr, "%*s%s\n", pad + USAGE_GAP, "", p->help);
|
|
Packit |
8ea169 |
}
|
|
Packit |
8ea169 |
}
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
static unsigned handle_internal_options(int argc, const char **argv, const char *usage)
|
|
Packit |
8ea169 |
{
|
|
Packit |
8ea169 |
unsigned skip = 0;
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
while (*argv)
|
|
Packit |
8ea169 |
{
|
|
Packit |
8ea169 |
const char *cmd = *argv;
|
|
Packit |
8ea169 |
if (cmd[0] != '-')
|
|
Packit |
8ea169 |
break;
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
if (strcmp(cmd, "--version") == 0)
|
|
Packit |
8ea169 |
{
|
|
Packit |
8ea169 |
printf("%s version %s\n", g_progname, PACKAGE_VERSION);
|
|
Packit |
8ea169 |
exit(0);
|
|
Packit |
8ea169 |
}
|
|
Packit |
8ea169 |
if (strcmp(cmd, "--help") == 0)
|
|
Packit |
8ea169 |
{
|
|
Packit |
8ea169 |
return skip + argc;
|
|
Packit |
8ea169 |
}
|
|
Packit |
8ea169 |
else if (strcmp(cmd, "-a") == 0 || strcmp(cmd, "--authenticate") == 0)
|
|
Packit |
8ea169 |
{
|
|
Packit |
8ea169 |
g_cli_authenticate = 1;
|
|
Packit |
8ea169 |
}
|
|
Packit |
8ea169 |
else
|
|
Packit |
8ea169 |
error_msg_and_die("%s", usage);
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
argv++;
|
|
Packit |
8ea169 |
argc--;
|
|
Packit |
8ea169 |
skip++;
|
|
Packit |
8ea169 |
}
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
return skip;
|
|
Packit |
8ea169 |
}
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
static void handle_internal_command(int argc, const char **argv,
|
|
Packit |
8ea169 |
const struct cmd_struct *commands)
|
|
Packit |
8ea169 |
{
|
|
Packit |
8ea169 |
const char *cmd = argv[0];
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
for (const struct cmd_struct *p = commands; p->cmd; ++p)
|
|
Packit |
8ea169 |
{
|
|
Packit |
8ea169 |
if (strcmp(p->cmd, cmd) != 0 && strcmp(p->abbrev, cmd) != 0)
|
|
Packit |
8ea169 |
continue;
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
exit(p->fn(argc, argv));
|
|
Packit |
8ea169 |
}
|
|
Packit |
8ea169 |
}
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
int main(int argc, const char **argv)
|
|
Packit |
8ea169 |
{
|
|
Packit |
8ea169 |
setlocale(LC_ALL, "");
|
|
Packit |
8ea169 |
/* Hack:
|
|
Packit |
8ea169 |
* Right-to-left scripts don't work properly in many terminals.
|
|
Packit |
8ea169 |
* Hebrew speaking people say he_IL.utf8 looks so mangled
|
|
Packit |
8ea169 |
* they prefer en_US.utf8 instead.
|
|
Packit |
8ea169 |
*/
|
|
Packit |
8ea169 |
const char *msg_locale = setlocale(LC_MESSAGES, NULL);
|
|
Packit |
8ea169 |
if (msg_locale && strcmp(msg_locale, "he_IL.utf8") == 0)
|
|
Packit |
8ea169 |
setlocale(LC_MESSAGES, "en_US.utf8");
|
|
Packit |
8ea169 |
#if ENABLE_NLS
|
|
Packit |
8ea169 |
bindtextdomain(PACKAGE, LOCALEDIR);
|
|
Packit |
8ea169 |
textdomain(PACKAGE);
|
|
Packit |
8ea169 |
#endif
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
abrt_init((char **)argv);
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
argv++;
|
|
Packit |
8ea169 |
argc--;
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
const char *abrt_cli_usage_string = _(
|
|
Packit |
8ea169 |
"Usage: abrt-cli [--authenticate] [--version] COMMAND [DIR]..."
|
|
Packit |
8ea169 |
);
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
const struct cmd_struct commands[] = {
|
|
Packit |
8ea169 |
CMD(list, "ls", _("List problems [in DIRs]")),
|
|
Packit |
8ea169 |
CMD(remove, "rm", _("Remove problem directory DIR")),
|
|
Packit |
8ea169 |
CMD(report, "e",_("Analyze and report problem data in DIR")),
|
|
Packit |
8ea169 |
CMD(info, "i", _("Print information about DIR")),
|
|
Packit |
8ea169 |
CMD(status, "st",_("Print the count of the recent crashes")),
|
|
Packit |
8ea169 |
CMD(process, "p",_("Process multiple problems")),
|
|
Packit |
8ea169 |
{NULL, NULL, NULL, NULL}
|
|
Packit |
8ea169 |
};
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
migrate_to_xdg_dirs();
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
unsigned skip = handle_internal_options(argc, argv, abrt_cli_usage_string);
|
|
Packit |
8ea169 |
argc -= skip;
|
|
Packit |
8ea169 |
argv += skip;
|
|
Packit |
8ea169 |
if (argc > 0)
|
|
Packit |
8ea169 |
{
|
|
Packit |
8ea169 |
if (g_cli_authenticate)
|
|
Packit |
8ea169 |
initialize_polkit_agent();
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
handle_internal_command(argc, argv, commands);
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
if (g_cli_authenticate)
|
|
Packit |
8ea169 |
uninitialize_polkit_agent();
|
|
Packit |
8ea169 |
}
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
/* user didn't specify command; print out help */
|
|
Packit |
8ea169 |
printf("%s\n\n", abrt_cli_usage_string);
|
|
Packit |
8ea169 |
list_cmds_help(commands);
|
|
Packit |
8ea169 |
printf("\n%s\n", _("See 'abrt-cli COMMAND --help' for more information"));
|
|
Packit |
8ea169 |
|
|
Packit |
8ea169 |
return 0;
|
|
Packit |
8ea169 |
}
|