From 2f3f3b34c5e70ea4b0cbea2e6703cfc5542e730b Mon Sep 17 00:00:00 2001 From: Vladimir Prus Date: Sun, 8 Apr 2007 15:20:07 +0000 Subject: 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. --- gdb/ser-base.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'gdb/ser-base.c') diff --git a/gdb/ser-base.c b/gdb/ser-base.c index a051157b316..fe5a83394db 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; } -- cgit v1.2.1