/*
* 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 **
SIGNAL_HANDLER istat = NULL;
char *cp, **cpp;
- if (!(setjmp (sigenv))) {
+ if (!(sigsetjmp(sigenv, 1))) {
istat = SIGNAL (SIGINT, intrser);
} else {
SIGNAL (SIGINT, istat);
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;
}
}
-static RETSIGTYPE
+static void
intrser (int i)
{
+ NMH_UNUSED (i);
+
/*
* should this be siglongjmp?
*/
- longjmp (sigenv, 1);
+ siglongjmp (sigenv, 1);
}