diff options
Diffstat (limited to 'gdb/gdbserver/remote-utils.c')
-rw-r--r-- | gdb/gdbserver/remote-utils.c | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/gdb/gdbserver/remote-utils.c b/gdb/gdbserver/remote-utils.c index f486b10..19f6715 100644 --- a/gdb/gdbserver/remote-utils.c +++ b/gdb/gdbserver/remote-utils.c @@ -1,5 +1,5 @@ /* Remote utility routines for the remote server for GDB. - Copyright 1986, 1989, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 + Copyright 1986, 1989, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GDB. @@ -32,6 +32,8 @@ #include <sys/ioctl.h> #include <signal.h> #include <fcntl.h> +#include <sys/time.h> +#include <unistd.h> int remote_debug = 0; struct ui_file *gdb_stdlog; @@ -156,8 +158,11 @@ remote_open (char *name) #if defined(F_SETFL) && defined (FASYNC) save_fcntl_flags = fcntl (remote_desc, F_GETFL, 0); fcntl (remote_desc, F_SETFL, save_fcntl_flags | FASYNC); +#endif +#if defined (F_SETOWN) + fcntl (remote_desc, F_SETOWN, getpid ()); +#endif disable_async_io (); -#endif /* FASYNC */ fprintf (stderr, "Remote debugging using %s\n", name); } @@ -261,18 +266,29 @@ putpkt (char *buf) static void input_interrupt (void) { - int cc; - char c; + fd_set readset; + struct timeval immediate = { 0, 0 }; - cc = read (remote_desc, &c, 1); + /* Protect against spurious interrupts. This has been observed to + be a problem under NetBSD 1.4 and 1.5. */ - if (cc != 1 || c != '\003') + FD_ZERO (&readset); + FD_SET (remote_desc, &readset); + if (select (remote_desc + 1, &readset, 0, 0, &immediate) > 0) { - fprintf (stderr, "input_interrupt, cc = %d c = %d\n", cc, c); - return; - } + int cc; + char c; + + cc = read (remote_desc, &c, 1); - kill (inferior_pid, SIGINT); + if (cc != 1 || c != '\003') + { + fprintf (stderr, "input_interrupt, cc = %d c = %d\n", cc, c); + return; + } + + kill (inferior_pid, SIGINT); + } } void |