remove longjmp in signalhandler of slocal
[mmh] / uip / slocal.c
index 837f038..cf9a9b0 100644 (file)
@@ -90,7 +90,8 @@ static struct passwd *pw;  /* passwd file entry */
 static char ddate[BUFSIZ];  /* record the delivery date */
 struct tws *now;
 
-static jmp_buf myctx;
+volatile sig_atomic_t eflag = 0; /* flag to indecate interrupt */
+static pid_t child_id;
 
 /* flags for pair->p_flags */
 #define P_NIL  0x00
@@ -186,17 +187,17 @@ 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);
 
                        case HELPSW:
                                snprintf(buf, sizeof(buf), "%s [switches] [address info sender]", invo_name);
                                print_help(buf, switches, 0);
-                               done(1);
+                               exit(0);
                        case VERSIONSW:
                                print_version(invo_name);
-                               done(1);
+                               exit(0);
 
                        case ADDRSW:
                                if (!(addr = *argp++)) {
@@ -397,8 +398,7 @@ main(int argc, char **argv)
        /* deliver the message */
        status = localmail(fd, mdlvr);
 
-       done(status != -1 ? RCV_MOK : RCV_MBX);
-       return 1;
+       return (status != -1 ? RCV_MOK : RCV_MBX);
 }
 
 
@@ -1035,16 +1035,6 @@ usr_pipe(int fd, char *cmd, char *pgm, char **vec, int suppress)
 
        default:
                /* parent process */
-               if (setjmp(myctx)) {
-                       /*
-                       ** Ruthlessly kill the child and anything
-                       ** else in its process group.
-                       */
-                       kill(-child_id, SIGKILL);
-                       if (verbose)
-                               verbose_printf(", timed-out; terminated\n");
-                       return -1;
-               }
                SIGNAL(SIGALRM, alrmser);
                bytes = fstat(fd, &st) != -1 ? (int) st.st_size : 100;
 
@@ -1062,6 +1052,13 @@ usr_pipe(int fd, char *cmd, char *pgm, char **vec, int suppress)
                status = pidwait(child_id, 0);
                alarm(0);
 
+               if (eflag) {
+                       if (verbose) {
+                               verbose_printf(", timed-out; terminated\n");
+                       }
+                       return -1;
+               }
+
                if (verbose) {
                        if (!status) {
                                verbose_printf(", success.\n");
@@ -1079,7 +1076,8 @@ usr_pipe(int fd, char *cmd, char *pgm, char **vec, int suppress)
 static void
 alrmser(int i)
 {
-       longjmp(myctx, DONE);
+       eflag = 1;
+       kill(-child_id, SIGKILL);
 }