aboutsummaryrefslogtreecommitdiff
path: root/gdb/ser-pipe.c
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2010-08-20 18:49:20 +0000
committerPedro Alves <palves@redhat.com>2010-08-20 18:49:20 +0000
commit58f07bae9540e81791b2ed039ba4c630fadf0af1 (patch)
treebe72b87d23fb9547d1de77725065b5d6dc06fff2 /gdb/ser-pipe.c
parent3da10d80f8da9ea96493eda226136221a9209c10 (diff)
downloadgdb-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-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 07fe65b..d26dc4f 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)
{