Blame src/cli/abrt-cli.c

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
}