summaryrefslogtreecommitdiff
path: root/gdb/ser-pipe.c
diff options
context:
space:
mode:
authorPedro Alves <pedro@codesourcery.com>2010-08-20 18:49:18 +0000
committerPedro Alves <pedro@codesourcery.com>2010-08-20 18:49:18 +0000
commit76a171988636eddd5f3b8f742abcd76cd0b6a646 (patch)
tree1b3feadd5f100e74f47c362fa81d9a45fc90356b /gdb/ser-pipe.c
parent68dcd8ee59a320f57f03300c6312e18430fc9a8e (diff)
downloadgdb-76a171988636eddd5f3b8f742abcd76cd0b6a646.tar.gz
* 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-pipe.c')
-rw-r--r--gdb/ser-pipe.c33
1 files changed, 26 insertions, 7 deletions
diff --git a/gdb/ser-pipe.c b/gdb/ser-pipe.c
index 07fe65b14e9..d26dc4fa497 100644
--- a/gdb/ser-pipe.c
+++ b/gdb/ser-pipe.c
@@ -157,23 +157,42 @@ pipe_close (struct serial *scb)
{
struct pipe_state *state = scb->state;
+ close (scb->fd);
+ scb->fd = -1;
+
if (state != NULL)
{
- int pid = state->pid;
- close (scb->fd);
- scb->fd = -1;
+ kill (state->pid, SIGTERM);
+ /* Might be useful to check that the child does die,
+ and while we're waiting for it to die print any remaining
+ stderr output. */
+
if (scb->error_fd != -1)
close (scb->error_fd);
scb->error_fd = -1;
xfree (state);
scb->state = NULL;
- kill (pid, SIGTERM);
- /* Might be useful to check that the child does die,
- and while we're waiting for it to die print any remaining
- stderr output. */
}
}
+int
+gdb_pipe (int pdes[2])
+{
+#if !HAVE_SOCKETPAIR
+ errno = ENOSYS;
+ return -1;
+#else
+
+ if (socketpair (AF_UNIX, SOCK_STREAM, 0, pdes) < 0)
+ return -1;
+
+ /* If we don't do this, GDB simply exits when the remote side
+ dies. */
+ signal (SIGPIPE, SIG_IGN);
+ return 0;
+#endif
+}
+
void
_initialize_ser_pipe (void)
{