X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fslocal.c;h=17be186bcd540625e84ad97f0b509698687452ff;hp=b83a2686ad08bf2c61d21d6692dcc77a331110cc;hb=77ce143a56ef8238d974fd7e1e893516ec58772f;hpb=2e5668919988fce4e523cbf2294698841b1106a0 diff --git a/uip/slocal.c b/uip/slocal.c index b83a268..17be186 100644 --- a/uip/slocal.c +++ b/uip/slocal.c @@ -59,11 +59,11 @@ static struct swit switches[] = { #define VERBSW 8 { "verbose", 0 }, #define NVERBSW 9 - { "noverbose", 0 }, + { "noverbose", 2 }, #define DEBUGSW 10 { "debug", 0 }, #define VERSIONSW 11 - { "version", 0 }, + { "Version", 0 }, #define HELPSW 12 { "help", 0 }, { NULL, 0 } @@ -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 volatile pid_t child_id; /* flags for pair->p_flags */ #define P_NIL 0x00 @@ -162,7 +163,7 @@ static int copy_message(int, char *, int); static void verbose_printf(char *fmt, ...); static void adorn(char *, char *, ...); static void debug_printf(char *fmt, ...); -static char *trim(char *); +static char *trimstr(char *); int @@ -174,15 +175,9 @@ main(int argc, char **argv) char mailbox[BUFSIZ], tmpfil[BUFSIZ]; char **argp, **arguments; -#ifdef LOCALE setlocale(LC_ALL, ""); -#endif invo_name = mhbasename(*argv); - /* foil search of user profile/context */ - if (context_foil(NULL) == -1) { - done(1); - } arguments = getarguments(invo_name, argc, argv, 0); argp = arguments; @@ -192,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++)) { @@ -388,23 +383,22 @@ main(int argc, char **argv) } if (debug) { - debug_printf("addr=\"%s\"\n", trim(addr)); - debug_printf("user=\"%s\"\n", trim(user)); - debug_printf("info=\"%s\"\n", trim(info)); - debug_printf("sender=\"%s\"\n", trim(sender)); + debug_printf("addr=\"%s\"\n", trimstr(addr)); + debug_printf("user=\"%s\"\n", trimstr(user)); + debug_printf("info=\"%s\"\n", trimstr(info)); + debug_printf("sender=\"%s\"\n", trimstr(sender)); debug_printf("envelope=\"%s\"\n", - envelope ? trim(envelope) : ""); - debug_printf("mbox=\"%s\"\n", trim(mbox)); - debug_printf("home=\"%s\"\n", trim(home)); - debug_printf("ddate=\"%s\"\n", trim(ddate)); + envelope ? trimstr(envelope) : ""); + debug_printf("mbox=\"%s\"\n", trimstr(mbox)); + debug_printf("home=\"%s\"\n", trimstr(home)); + debug_printf("ddate=\"%s\"\n", trimstr(ddate)); debug_printf("now=%02d:%02d\n\n", now->tw_hour, now->tw_min); } /* deliver the message */ status = localmail(fd, mdlvr); - done(status != -1 ? RCV_MOK : RCV_MBX); - return 1; + return (status != -1 ? RCV_MOK : RCV_MBX); } @@ -489,7 +483,7 @@ usr_delivery(int fd, char *delivery, int su) if (debug) { for (i = 0; vec[i]; i++) { debug_printf("vec[%d]: \"%s\"\n", - i, trim(vec[i])); + i, trimstr(vec[i])); } } @@ -830,14 +824,14 @@ parse(int fd) p->p_flags &= ~P_CHK; if (debug) { debug_printf("vars[%d]: name=\"%s\" value=\"%s\"\n", - p - vars, p->p_name, trim(p->p_value)); + p - vars, p->p_name, trimstr(p->p_value)); } } if (debug) { for (p = hdrs; p->p_name; p++) { debug_printf("hdrs[%d]: name=\"%s\" value=\"%s\"\n", p - hdrs, p->p_name, - p->p_value ? trim(p->p_value) : ""); + p->p_value ? trimstr(p->p_value) : ""); } } return 0; @@ -915,7 +909,7 @@ glob(int fd) if (debug) { for (p = vars; p->p_name; p++) { debug_printf("vars[%d]: name=\"%s\" value=\"%s\"\n", - p - vars, p->p_name, trim(p->p_value)); + p - vars, p->p_name, trimstr(p->p_value)); } } } @@ -987,7 +981,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; @@ -1041,16 +1034,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; @@ -1068,6 +1051,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"); @@ -1085,7 +1075,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); } @@ -1107,6 +1098,7 @@ get_sender(char *envelope, char **sender) i = strlen("From "); strncpy(buffer, envelope + i, sizeof(buffer)); + buffer[sizeof buffer -1] = '\0'; /* ensure termination */ if ((cp = strchr(buffer, '\n'))) { *cp = '\0'; cp -= 24; @@ -1242,7 +1234,7 @@ fputs_error: ** Trim strings for pretty printing of debugging output */ static char * -trim(char *cp) +trimstr(char *cp) { char buffer[BUFSIZ*4]; unsigned char *bp, *sp;