#include "ser-unix.h"
#include <sys/types.h>
-#ifdef HAVE_SYS_WAIT_H
-#include <sys/wait.h>
-#endif
+#include "gdb_wait.h"
#include <sys/socket.h>
#include <sys/time.h>
#include <fcntl.h>
+#include <string.h>
#include "signals.h"
static int
pipe_open (serial_t scb, const char *name)
{
-#if !defined(O_NONBLOCK) || !defined(F_GETFL) || !defined(F_SETFL) || !HAVE_SOCKETPAIR
+#if !HAVE_SOCKETPAIR
return -1;
#else
struct pipe_state *state;
if (socketpair (AF_UNIX, SOCK_STREAM, 0, pdes) < 0)
return -1;
+#ifdef HAVE_VFORK
pid = vfork ();
+#else
+ pid = fork ();
+#endif
/* Error. */
if (pid == -1)
scb->fd = pdes[0];
scb->state = state;
- /* Make it non-blocking */
- {
- int flags = fcntl (scb->fd, F_GETFL, 0);
- if (fcntl (scb->fd, F_SETFL, flags | O_NONBLOCK) < 0)
- {
- perror ("ser-pipe");
- pipe_close (scb);
- return -1;
- }
- }
-
/* If we don't do this, GDB simply exits when the remote side dies. */
signal (SIGPIPE, SIG_IGN);
return 0;
int pid = state->pid;
close (scb->fd);
scb->fd = -1;
- free (state);
+ xfree (state);
scb->state = NULL;
kill (pid, SIGTERM);
/* Might be useful to check that the child does die. */
ops->readchar = ser_unix_readchar;
ops->write = ser_unix_write;
ops->flush_output = ser_unix_nop_flush_output;
- ops->flush_input = ser_unix_nop_flush_input;
+ ops->flush_input = ser_unix_flush_input;
ops->send_break = ser_unix_nop_send_break;
ops->go_raw = ser_unix_nop_raw;
ops->get_tty_state = ser_unix_nop_get_tty_state;