X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fslocal.c;h=cf9a9b0f160c2abeb67181e22a06fde4b132b6d0;hp=837f038d71ab2c55ca5b126c1f9c455bbfc6a0af;hb=62b0c6727235a0bc560179dbf6b13d252716c02c;hpb=d854cd83e7b14f3bc686688ef7099b5d75157647 diff --git a/uip/slocal.c b/uip/slocal.c index 837f038..cf9a9b0 100644 --- a/uip/slocal.c +++ b/uip/slocal.c @@ -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); }