* utils.c: Add include of gdb_usleep.h.
authorJoel Brobecker <brobecker@gnat.com>
Wed, 6 May 2009 22:54:58 +0000 (22:54 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Wed, 6 May 2009 22:54:58 +0000 (22:54 +0000)
        (defaulted_query): Detect false EOF conditions that happen
        on terminals opened with the O_NONBLOCK flag when there is
        nothing to read.

gdb/ChangeLog
gdb/utils.c

index 21bf55d857a3a5c0578252385493674bcdc2b677..e219552a8a6a1cc76567a1206fc1d9dfe7d8d044 100644 (file)
@@ -1,3 +1,10 @@
+2009-05-06  Joel Brobecker   <brobecker@adacore.com>
+
+       * utils.c: Add include of gdb_usleep.h.
+       (defaulted_query): Detect false EOF conditions that happen
+       on terminals opened with the O_NONBLOCK flag when there is
+       nothing to read.
+
 2009-05-06  Pedro Alves  <pedro@codesourcery.com>
 
        * inferior.c (add_inferior): Move observer_notify_new_inferior
index 99b0e7693c9f089b37caff314912cdd9e74436a4..4396d145df7326b71cf3b49183ef8620eebfcc8b 100644 (file)
@@ -67,6 +67,8 @@
 #include <sys/time.h>
 #include <time.h>
 
+#include "gdb_usleep.h"
+
 #if !HAVE_DECL_MALLOC
 extern PTR malloc ();          /* ARI: PTR */
 #endif
@@ -1477,6 +1479,25 @@ defaulted_query (const char *ctlstr, const char defchar, va_list args)
       gdb_flush (gdb_stdout);
 
       answer = fgetc (stdin);
+
+      /* We expect fgetc to block until a character is read.  But
+         this may not be the case if the terminal was opened with
+         the NONBLOCK flag.  In that case, if there is nothing to
+         read on stdin, fgetc returns EOF, but also sets the error
+         condition flag on stdin and errno to EAGAIN.  With a true
+         EOF, stdin's error condition flag is not set.
+
+         A situation where this behavior was observed is a pseudo
+         terminal on AIX.  */
+      while (answer == EOF && ferror (stdin) && errno == EAGAIN)
+        {
+          /* Not a real EOF.  Wait a little while and try again until
+             we read something.  */
+          clearerr (stdin);
+          gdb_usleep (10000);
+          answer = fgetc (stdin);
+        }
+
       clearerr (stdin);                /* in case of C-d */
       if (answer == EOF)       /* C-d */
        {