X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=sbr%2Fgetans.c;h=3ef01ed5305cb82947b8e5e6dfc55a644bb8a980;hb=a6f717992d5588898c37711aa1895dbb11016e1c;hp=4feb3b9065c656761dc83603b86c5c33cf236f9d;hpb=8f7c0596b0ad1adf74384f7a2b584835ede3aacc;p=mmh diff --git a/sbr/getans.c b/sbr/getans.c index 4feb3b9..3ef01ed 100644 --- a/sbr/getans.c +++ b/sbr/getans.c @@ -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. @@ -13,14 +11,15 @@ #include #include #include +#include static char ansbuf[BUFSIZ]; -static jmp_buf sigenv; +static sigjmp_buf sigenv; /* * static prototypes */ -static RETSIGTYPE intrser (int); +static void intrser (int); char ** @@ -30,7 +29,7 @@ getans (char *prompt, struct swit *ansp) 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); }