X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fslocal.c;h=eac77e4973d505e9621ef8b2ca2528fcdb6219a9;hp=837f038d71ab2c55ca5b126c1f9c455bbfc6a0af;hb=cf1205b5cbea2f0cd6ea710ec16c637df85b647c;hpb=d854cd83e7b14f3bc686688ef7099b5d75157647 diff --git a/uip/slocal.c b/uip/slocal.c index 837f038..eac77e4 100644 --- a/uip/slocal.c +++ b/uip/slocal.c @@ -15,17 +15,20 @@ ** */ - #include #include #include #include #include - #include #include #include #include +#include +#include +#include +#include +#include #ifdef INITGROUPS_HEADER #include INITGROUPS_HEADER @@ -90,7 +93,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 volatile pid_t child_id; /* flags for pair->p_flags */ #define P_NIL 0x00 @@ -186,72 +190,72 @@ main(int argc, char **argv) switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); - done(1); + exit(EX_USAGE); case UNKWNSW: - adios(NULL, "-%s unknown", cp); + adios(EX_USAGE, 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(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); - done(1); + exit(argc == 2 ? EX_OK : EX_USAGE); case ADDRSW: if (!(addr = *argp++)) { /* allow -xyz arguments */ - adios(NULL, "missing argument to %s", + adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } continue; case INFOSW: if (!(info = *argp++)) { /* allow -xyz arguments */ - adios(NULL, "missing argument to %s", + adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } continue; case USERSW: if (!(user = *argp++)) { /* allow -xyz arguments */ - adios(NULL, "missing argument to %s", + adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } continue; case FILESW: if (!(file = *argp++) || *file == '-') { - adios(NULL, "missing argument to %s", + adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } continue; case SENDERSW: if (!(sender = *argp++)) { /* allow -xyz arguments */ - adios(NULL, "missing argument to %s", + adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } continue; case MAILBOXSW: if (!(mbox = *argp++) || *mbox == '-') { - adios(NULL, "missing argument to %s", + adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } continue; case HOMESW: if (!(home = *argp++) || *home == '-') { - adios(NULL, "missing argument to %s", + adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } continue; case MAILSW: if (!(cp = *argp++) || *cp == '-') { - adios(NULL, "missing argument to %s", + adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } if (mdlvr) { - adios(NULL, "only one maildelivery file at a time!"); + adios(EX_USAGE, NULL, "only one maildelivery file at a time!"); } mdlvr = cp; continue; @@ -289,7 +293,7 @@ main(int argc, char **argv) user = (cp = strchr(addr, '.')) ? ++cp : addr; } if (!(pw = getpwnam(user))) { - adios(NULL, "no such local user as %s", user); + adios(EX_NOUSER, NULL, "no such local user as %s", user); } if (chdir(pw->pw_dir) == -1) { @@ -311,7 +315,7 @@ main(int argc, char **argv) /* Record the delivery time */ if (!(now = dlocaltimenow())) { - adios(NULL, "unable to ascertain local time"); + adios(EX_OSERR, NULL, "unable to ascertain local time"); } snprintf(ddate, sizeof(ddate), "Delivery-Date: %s\n", dtimenow()); @@ -323,14 +327,14 @@ main(int argc, char **argv) /* getting message from file */ if ((tempfd = open(file, O_RDONLY)) == -1) { - adios(file, "unable to open"); + adios(EX_IOERR, file, "unable to open"); } if (debug) { debug_printf("retrieving message from file \"%s\"\n", file); } if ((fd = copy_message(tempfd, tmpfil, 1)) == -1) { - adios(NULL, "unable to create temporary file"); + adios(EX_CANTCREAT, NULL, "unable to create temporary file"); } close(tempfd); } else { @@ -339,7 +343,7 @@ main(int argc, char **argv) debug_printf("retrieving message from stdin\n"); } if ((fd = copy_message(fileno(stdin), tmpfil, 1)) == -1) { - adios(NULL, "unable to create temporary file"); + adios(EX_CANTCREAT, NULL, "unable to create temporary file"); } } @@ -365,7 +369,7 @@ main(int argc, char **argv) unlink(tmpfil); if (!(fp = fdopen(fd, "r+"))) { - adios(NULL, "unable to access temporary file"); + adios(EX_IOERR, NULL, "unable to access temporary file"); } /* If no sender given, extract it from envelope information. */ @@ -397,8 +401,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); } @@ -981,7 +984,6 @@ usr_folder(int fd, char *string) static int usr_pipe(int fd, char *cmd, char *pgm, char **vec, int suppress) { - pid_t child_id; int bytes, seconds, status, n; struct stat st; char *path; @@ -1031,20 +1033,10 @@ usr_pipe(int fd, char *cmd, char *pgm, char **vec, int suppress) m_putenv("PATH", path); execvp(pgm, vec); - _exit(-1); + _exit(EX_OSERR); 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 +1054,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 +1078,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); }