Fix FTBFS bug introduced by 600379c
[mmh] / uip / prompter.c
index 823760e..e42e8df 100644 (file)
@@ -12,6 +12,7 @@
 #include <errno.h>
 #include <signal.h>
 #include <setjmp.h>
+#include <unistd.h>
 
 static struct swit switches[] = {
 #define PREPSW  0
@@ -34,8 +35,8 @@ static struct swit switches[] = {
 };
 
 
-static int wtuser = 0;
-static int sigint = 0;
+volatile sig_atomic_t wtuser = 0;
+volatile sig_atomic_t sigint = 0;
 static jmp_buf sigenv;
 
 /*
@@ -71,7 +72,7 @@ main(int argc, char **argv)
                        switch (smatch(++cp, switches)) {
                        case AMBIGSW:
                                ambigsw(cp, switches);
-                               done(1);
+                               exit(1);
                        case UNKWNSW:
                                adios(NULL, "-%s unknown", cp);
 
@@ -80,10 +81,10 @@ main(int argc, char **argv)
                                                "%s [switches] file",
                                                invo_name);
                                print_help(buffer, switches, 1);
-                               done(1);
+                               exit(0);
                        case VERSIONSW:
                                print_version(invo_name);
-                               done(1);
+                               exit(0);
 
                        case PREPSW:
                                prepend++;
@@ -160,7 +161,8 @@ main(int argc, char **argv)
                                if (i == -1) {
 abort:
                                        unlink(tmpfil);
-                                       done(1);
+                                       /* sysexits.h EX_DATAERR */
+                                       exit(1);
                                }
                                if (i || (field[0]!='\n' && field[0]!='\0')) {
                                        fprintf(out, "%s:", name);
@@ -254,8 +256,7 @@ has_no_body:
        unlink(tmpfil);
 
        context_save();  /* save the context file */
-       done(0);
-       return 1;
+       return 0;
 }
 
 
@@ -263,23 +264,26 @@ int
 getln(char *buffer, int n)
 {
        int c;
+       sig_atomic_t psigint;
        char *cp;
 
        cp = buffer;
        *cp = '\0';
 
        switch (setjmp(sigenv)) {
-       case OK:
+       case 0:
                wtuser = 1;
+               psigint = sigint;
                break;
 
-       case DONE:
-               wtuser = 0;
-               return 0;
-
        default:
                wtuser = 0;
-               return NOTOK;
+               if (sigint == psigint) {
+                       return 0;
+               } else {
+                       sigint = psigint;
+                       return NOTOK;
+               }
        }
 
        for (;;) {
@@ -311,7 +315,8 @@ getln(char *buffer, int n)
 static void
 intrser(int i)
 {
-       if (wtuser)
-               longjmp(sigenv, NOTOK);
+       if (wtuser) {
+               close(STDIN_FILENO);
+       }
        sigint++;
 }