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-pipe.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-pipe.c')
-rw-r--r-- | gdb/ser-pipe.c | 33 |
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) { |