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