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-mingw.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-mingw.c')
-rw-r--r-- | gdb/ser-mingw.c | 23 |
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); |