diff options
author | Karel Klic <kklic@redhat.com> | 2009-12-02 14:24:51 +0100 |
---|---|---|
committer | Karel Klic <kklic@redhat.com> | 2009-12-02 14:24:51 +0100 |
commit | e880db3a999abeac8fb8448cde2f6a46feaad69e (patch) | |
tree | dd20a8c9ac556faef2f68384bf77075cb2f6c760 /src | |
parent | ecd9577f2f006e95070b8f6b15419a33a1d8711c (diff) | |
download | abrt-e880db3a999abeac8fb8448cde2f6a46feaad69e.tar.gz abrt-e880db3a999abeac8fb8448cde2f6a46feaad69e.tar.xz abrt-e880db3a999abeac8fb8448cde2f6a46feaad69e.zip |
Get input from stdin if no filename is provided
Diffstat (limited to 'src')
-rw-r--r-- | src/Backtrace/main.c | 76 |
1 files changed, 44 insertions, 32 deletions
diff --git a/src/Backtrace/main.c b/src/Backtrace/main.c index 0761d31a..162cd59f 100644 --- a/src/Backtrace/main.c +++ b/src/Backtrace/main.c @@ -1,4 +1,4 @@ -/* +/* -*-mode:c++;c-file-style:"bsd";c-basic-offset:2;indent-tabs-mode:nil-*- main.cpp - parses command line arguments Copyright (C) 2009 RedHat inc. @@ -97,12 +97,6 @@ parse_opt (int key, char *arg, struct argp_state *state) break; case ARGP_KEY_END: - if (!arguments->filename) - { - /* Not enough arguments. */ - argp_usage(state); - exit(EX_USAGE); /* is there a better errno? */ - } break; default: @@ -131,37 +125,55 @@ int main(int argc, char **argv) arguments.filename = 0; argp_parse(&argp, argc, argv, 0, 0, &arguments); - /* Open input file, and parse it. */ - FILE *fp = fopen(arguments.filename, "r"); - if (!fp) + char *bttext = NULL; + + /* If a filename was provided, read input from file. + Otherwise read from stdin. */ + if (arguments.filename) { - fprintf(stderr, "Unable to open '%s'.\n", arguments.filename); - exit(EX_NOINPUT); /* No such file or directory */ - } + /* Open input file, and parse it. */ + FILE *fp = fopen(arguments.filename, "r"); + if (!fp) + { + fprintf(stderr, "Unable to open '%s'.\n", arguments.filename); + exit(EX_NOINPUT); /* No such file or directory */ + } - /* Header and footer of the backtrace is stripped to simplify the parser. - * A drawback is that the backtrace must be loaded to memory. - */ - fseek(fp, 0, SEEK_END); - size_t size = ftell(fp); - fseek(fp, 0, SEEK_SET); + /* Header and footer of the backtrace is stripped to simplify the parser. + * A drawback is that the backtrace must be loaded to memory. + */ + fseek(fp, 0, SEEK_END); + size_t size = ftell(fp); + fseek(fp, 0, SEEK_SET); - if (size > FILE_SIZE_LIMIT) - { - fprintf(stderr, "Input file too big (%zd). Maximum size is %zd", - size, FILE_SIZE_LIMIT); - exit(EX_IOERR); - } + if (size > FILE_SIZE_LIMIT) + { + fprintf(stderr, "Input file too big (%zd). Maximum size is %zd", + size, FILE_SIZE_LIMIT); + exit(EX_IOERR); + } - char *bttext = malloc(size + 1); - if (1 != fread(bttext, size, 1, fp)) + char *bttext = malloc(size + 1); + if (1 != fread(bttext, size, 1, fp)) + { + fprintf(stderr, "Unable to read from '%s'.\n", arguments.filename); + exit(EX_IOERR); /* IO Error */ + } + + bttext[size] = '\0'; + fclose(fp); + } + else { - fprintf(stderr, "Unable to read from '%s'.\n", arguments.filename); - exit(EX_IOERR); /* IO Error */ + struct strbuf *btin = strbuf_new(); + int c; + while ((c = getchar()) != EOF && c != '\0') + strbuf_append_char(btin, (char)c); + + strbuf_append_char(btin, '\0'); + bttext = btin->buf; + strbuf_free_nobuf(btin); /* free btin, but not its internal buffer */ } - - bttext[size] = '\0'; - fclose(fp); /* Detect Python backtraces. If it is a Python backtrace, * silently exit for now. |