Reworked test-rcvdist so that it sees the output of post.
[mmh] / sbr / getans.c
index 80eeb71..3ef01ed 100644 (file)
@@ -2,8 +2,6 @@
 /*
  * getans.c -- get an answer from the user and return a string array
  *
- * $Id$
- *
  * This code is Copyright (c) 2002, by the authors of nmh.  See the
  * COPYRIGHT file in the root directory of the nmh distribution for
  * complete copyright information.
 #include <h/signals.h>
 #include <setjmp.h>
 #include <signal.h>
+#include <errno.h>
 
 static char ansbuf[BUFSIZ];
-static jmp_buf sigenv;
+static sigjmp_buf sigenv;
 
 /*
  * static prototypes
  */
-static RETSIGTYPE intrser (int);
+static void intrser (int);
 
 
 char **
 getans (char *prompt, struct swit *ansp)
 {
     int i;
-    SIGNAL_HANDLER istat;
+    SIGNAL_HANDLER istat = NULL;
     char *cp, **cpp;
 
-    if (!(setjmp (sigenv))) {
+    if (!(sigsetjmp(sigenv, 1))) {
        istat = SIGNAL (SIGINT, intrser);
     } else {
        SIGNAL (SIGINT, istat);
@@ -42,15 +41,43 @@ getans (char *prompt, struct swit *ansp)
        fflush (stdout);
        cp = ansbuf;
        while ((i = getchar ()) != '\n') {
-           if (i == EOF)
-               longjmp (sigenv, 1);
+           if (i == EOF) {
+               /*
+                * If we get an EOF, return
+                */
+               if (feof(stdin))
+                   siglongjmp (sigenv, 1);
+
+               /*
+                * For errors, if we get an EINTR that means that we got
+                * a signal and we should retry.  If we get another error,
+                * then just return.
+                */
+
+               else if (ferror(stdin)) {
+                   if (errno == EINTR) {
+                       clearerr(stdin);
+                       continue;
+                   }
+                   fprintf(stderr, "\nError %s during read\n",
+                           strerror(errno));
+                   siglongjmp (sigenv, 1);
+               } else {
+                   /*
+                    * Just for completeness's sake ...
+                    */
+
+                   fprintf(stderr, "\nUnknown problem in getchar()\n");
+                   siglongjmp (sigenv, 1);
+               }
+           }
            if (cp < &ansbuf[sizeof ansbuf - 1])
                *cp++ = i;
        }
        *cp = '\0';
        if (ansbuf[0] == '?' || cp == ansbuf) {
            printf ("Options are:\n");
-           print_sw (ALL, ansp, "");
+           print_sw (ALL, ansp, "", stdout);
            continue;
        }
        cpp = brkstring (ansbuf, " ", NULL);
@@ -69,11 +96,13 @@ getans (char *prompt, struct swit *ansp)
 }
 
 
-static RETSIGTYPE
+static void
 intrser (int i)
 {
+    NMH_UNUSED (i);
+
     /*
      * should this be siglongjmp?
      */
-    longjmp (sigenv, 1);
+    siglongjmp (sigenv, 1);
 }