summaryrefslogtreecommitdiffstats
path: root/src/Backtrace
diff options
context:
space:
mode:
authorKarel Klic <kklic@redhat.com>2009-12-02 14:24:51 +0100
committerKarel Klic <kklic@redhat.com>2009-12-02 14:24:51 +0100
commite880db3a999abeac8fb8448cde2f6a46feaad69e (patch)
treedd20a8c9ac556faef2f68384bf77075cb2f6c760 /src/Backtrace
parentecd9577f2f006e95070b8f6b15419a33a1d8711c (diff)
downloadabrt-e880db3a999abeac8fb8448cde2f6a46feaad69e.tar.gz
abrt-e880db3a999abeac8fb8448cde2f6a46feaad69e.tar.xz
abrt-e880db3a999abeac8fb8448cde2f6a46feaad69e.zip
Get input from stdin if no filename is provided
Diffstat (limited to 'src/Backtrace')
-rw-r--r--src/Backtrace/main.c76
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.