diff options
author | Vladimir Prus <vladimir@codesourcery.com> | 2007-04-08 15:20:07 +0000 |
---|---|---|
committer | Vladimir Prus <vladimir@codesourcery.com> | 2007-04-08 15:20:07 +0000 |
commit | 65cc4390f1aea99f342f461aa6cbd7236d09552b (patch) | |
tree | 64b20483dd682fe8219f738d6e4b7d23df50747e /gdb/ser-base.c | |
parent | 1edf24da1a27e3c20350e37d3be8516b3a37f1e5 (diff) | |
download | gdb-65cc4390f1aea99f342f461aa6cbd7236d09552b.zip gdb-65cc4390f1aea99f342f461aa6cbd7236d09552b.tar.gz gdb-65cc4390f1aea99f342f461aa6cbd7236d09552b.tar.bz2 |
Pass stderr of program run with "target remote |"
via gdb_stderr.
* serial.c (serial_open): Set error_fd to -1.
* serial.h (struct serial): New field error_fd.
(struct serial_opts): New field avail.
* ser-pipe.c (pipe_open): Create another pair
of sockets. Pass stderr to gdb.
* ser-mingw.c (pipe_windows_open): Pass
PEX_STDERR_TO_PIPE to pex_run. Initialize
sd->error_fd.
(pipe_avail): New.
(_initialize_ser_windows): Hook pipe_avail.
* ser-base.c (generic_readchar): Check if there's
anything in stderr channel and route that to gdb_stderr.
Diffstat (limited to 'gdb/ser-base.c')
-rw-r--r-- | gdb/ser-base.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/gdb/ser-base.c b/gdb/ser-base.c index a051157..fe5a833 100644 --- a/gdb/ser-base.c +++ b/gdb/ser-base.c @@ -343,6 +343,48 @@ generic_readchar (struct serial *scb, int timeout, } } } + /* Read any error output we might have. */ + if (scb->error_fd != -1) + { + ssize_t s; + char buf[81]; + + for (;;) + { + char *current; + char *newline; + int to_read = 80; + + int num_bytes = -1; + if (scb->ops->avail) + num_bytes = (scb->ops->avail)(scb, scb->error_fd); + if (num_bytes != -1) + to_read = (num_bytes < to_read) ? num_bytes : to_read; + + if (to_read == 0) + break; + + s = read (scb->error_fd, &buf, to_read); + if (s == -1) + break; + + /* In theory, embedded newlines are not a problem. + But for MI, we want each output line to have just + one newline for legibility. So output things + in newline chunks. */ + buf[s] = '\0'; + current = buf; + while ((newline = strstr (current, "\n")) != NULL) + { + *newline = '\0'; + fputs_unfiltered (current, gdb_stderr); + fputs_unfiltered ("\n", gdb_stderr); + current = newline + 1; + } + fputs_unfiltered (current, gdb_stderr); + } + } + reschedule (scb); return ch; } |