diff options
author | Pedro Alves <palves@redhat.com> | 2010-08-20 18:49:20 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2010-08-20 18:49:20 +0000 |
commit | 58f07bae9540e81791b2ed039ba4c630fadf0af1 (patch) | |
tree | be72b87d23fb9547d1de77725065b5d6dc06fff2 /gdb/ser-mingw.c | |
parent | 3da10d80f8da9ea96493eda226136221a9209c10 (diff) | |
download | gdb-58f07bae9540e81791b2ed039ba4c630fadf0af1.zip gdb-58f07bae9540e81791b2ed039ba4c630fadf0af1.tar.gz gdb-58f07bae9540e81791b2ed039ba4c630fadf0af1.tar.bz2 |
* serial.h (gdb_pipe, serial_pipe): Declare.
* serial.c (serial_interface_lookup): Take a const char pointer.
(serial_fdopen): Rename to ...
(serial_fdopen_ops): ... this. Add an OPS parameter and use it.
Call the OPS' fdopen function if there is one.
(serial_fdopen): Rewrite as wrapper to serial_fdopen_ops.
(serial_pipe): New.
(struct serial_ops) <fdopen>: New field.
* ser-mingw.c (free_pipe_state):
(free_pipe_state): Close output on non-pex pipes.
(pipe_windows_fdopen): New.
(gdb_pipe): New.
(_initialize_ser_windows): Register pipe_windows_fdopen.
* ser-go32.c (gdb_pipe): New.
* ser-pipe.c (pipe_close): Close file descriptor even if there's
no state pointer.
(pipe_ops): Delete.
(gdb_pipe): New.
Diffstat (limited to 'gdb/ser-mingw.c')
-rw-r--r-- | gdb/ser-mingw.c | 41 |
1 files changed, 39 insertions, 2 deletions
diff --git a/gdb/ser-mingw.c b/gdb/ser-mingw.c index 877657b..7839739 100644 --- a/gdb/ser-mingw.c +++ b/gdb/ser-mingw.c @@ -802,8 +802,12 @@ free_pipe_state (struct pipe_state *ps) if (ps->input) fclose (ps->input); if (ps->pex) - pex_free (ps->pex); - /* pex_free closes ps->output. */ + { + pex_free (ps->pex); + /* pex_free closes ps->output. */ + } + else if (ps->output) + fclose (ps->output); xfree (ps); @@ -888,6 +892,30 @@ pipe_windows_open (struct serial *scb, const char *name) return -1; } +static int +pipe_windows_fdopen (struct serial *scb, int fd) +{ + struct pipe_state *ps; + + ps = make_pipe_state (); + + ps->input = fdopen (fd, "r+"); + if (! ps->input) + goto fail; + + ps->output = fdopen (fd, "r+"); + if (! ps->output) + goto fail; + + scb->fd = fd; + scb->state = (void *) ps; + + return 0; + + fail: + free_pipe_state (ps); + return -1; +} static void pipe_windows_close (struct serial *scb) @@ -992,6 +1020,14 @@ pipe_avail (struct serial *scb, int fd) return numBytes; } +int +gdb_pipe (int pdes[2]) +{ + if (_pipe (pdes, 512, _O_BINARY | _O_NOINHERIT) == -1) + return -1; + return 0; +} + struct net_windows_state { struct ser_console_state base; @@ -1230,6 +1266,7 @@ _initialize_ser_windows (void) ops->next = 0; ops->open = pipe_windows_open; ops->close = pipe_windows_close; + ops->fdopen = pipe_windows_fdopen; ops->readchar = ser_base_readchar; ops->write = ser_base_write; ops->flush_output = ser_base_flush_output; |