aboutsummaryrefslogtreecommitdiff
path: root/gdb/ser-mingw.c
diff options
context:
space:
mode:
authorVladimir Prus <vladimir@codesourcery.com>2007-04-08 15:20:07 +0000
committerVladimir Prus <vladimir@codesourcery.com>2007-04-08 15:20:07 +0000
commit65cc4390f1aea99f342f461aa6cbd7236d09552b (patch)
tree64b20483dd682fe8219f738d6e4b7d23df50747e /gdb/ser-mingw.c
parent1edf24da1a27e3c20350e37d3be8516b3a37f1e5 (diff)
downloadgdb-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-mingw.c')
-rw-r--r--gdb/ser-mingw.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/gdb/ser-mingw.c b/gdb/ser-mingw.c
index fcbef3a..074687d 100644
--- a/gdb/ser-mingw.c
+++ b/gdb/ser-mingw.c
@@ -697,6 +697,7 @@ static int
pipe_windows_open (struct serial *scb, const char *name)
{
struct pipe_state *ps;
+ FILE *pex_stderr;
char **argv = buildargv (name);
struct cleanup *back_to = make_cleanup_freeargv (argv);
@@ -717,7 +718,8 @@ pipe_windows_open (struct serial *scb, const char *name)
{
int err;
const char *err_msg
- = pex_run (ps->pex, PEX_SEARCH | PEX_BINARY_INPUT | PEX_BINARY_OUTPUT,
+ = pex_run (ps->pex, PEX_SEARCH | PEX_BINARY_INPUT | PEX_BINARY_OUTPUT
+ | PEX_STDERR_TO_PIPE,
argv[0], argv, NULL, NULL,
&err);
@@ -739,8 +741,13 @@ pipe_windows_open (struct serial *scb, const char *name)
ps->output = pex_read_output (ps->pex, 1);
if (! ps->output)
goto fail;
-
scb->fd = fileno (ps->output);
+
+ pex_stderr = pex_read_err (ps->pex, 1);
+ if (! pex_stderr)
+ goto fail;
+ scb->error_fd = fileno (pex_stderr);
+
scb->state = (void *) ps;
discard_cleanups (back_to);
@@ -865,6 +872,17 @@ pipe_done_wait_handle (struct serial *scb)
WaitForSingleObject (ps->wait.have_stopped, INFINITE);
}
+static int
+pipe_avail (struct serial *scb, int fd)
+{
+ HANDLE h = (HANDLE) _get_osfhandle (fd);
+ DWORD numBytes;
+ BOOL r = PeekNamedPipe (h, NULL, 0, NULL, &numBytes, NULL);
+ if (r == FALSE)
+ numBytes = 0;
+ return numBytes;
+}
+
struct net_windows_state
{
HANDLE read_event;
@@ -1164,6 +1182,7 @@ _initialize_ser_windows (void)
ops->write_prim = pipe_windows_write;
ops->wait_handle = pipe_wait_handle;
ops->done_wait_handle = pipe_done_wait_handle;
+ ops->avail = pipe_avail;
serial_add_interface (ops);