X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/b22a846ca4b5e21a3bc3b6d48cf3aa12f181ede0..63621a81d16ab743de6b57d47578a9a2c670ad22:/uip/slocal.c diff --git a/uip/slocal.c b/uip/slocal.c index 254744b2..fe027ee2 100644 --- a/uip/slocal.c +++ b/uip/slocal.c @@ -1,6 +1,4 @@ - -/* - * slocal.c -- asynchronously filter and deliver new mail +/* slocal.c -- asynchronously filter and deliver new mail * * This code is Copyright (c) 2002, by the authors of nmh. See the * COPYRIGHT file in the root directory of the nmh distribution for @@ -29,6 +27,8 @@ #include #include #include +#include "sbr/lock_file.h" +#include "sbr/m_mktemp.h" #include #include @@ -163,7 +163,7 @@ static int split (char *, char **); static int parse (int); static void expand (char *, char *, int); static void glob (int); -static struct pair *lookup (struct pair *, char *); +static struct pair *lookup (struct pair *, char *) PURE; static int logged_in (void); static int timely (char *, char *); static int usr_file (int, char *, int); @@ -172,9 +172,9 @@ static int usr_folder (int, char *); static void alrmser (int); static void get_sender (char *, char **); 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 void verbose_printf (char *fmt, ...) CHECK_PRINTF(1, 2); +static void adorn (char *, char *, ...) CHECK_PRINTF(2, 3); +static void debug_printf (char *fmt, ...) CHECK_PRINTF(1, 2); static int suppress_duplicates (int, char *); static char *trim (char *); @@ -452,7 +452,7 @@ usr_delivery (int fd, char *delivery, int su) if (*buffer == '#' || *buffer == '\n') continue; - TrimSuffixC(buffer, '\n'); + trim_suffix_c(buffer, '\n'); /* split buffer into fields */ vecp = split (buffer, vec); @@ -484,7 +484,8 @@ usr_delivery (int fd, char *delivery, int su) * do this - else fall through */ if (!next) - continue; /* else fall */ + continue; + /* FALLTHRU */ case '?': /* @@ -492,7 +493,8 @@ usr_delivery (int fd, char *delivery, int su) * consider delivered if action is successful. */ if (won) - continue; /* else fall */ + continue; + /* FALLTHRU */ case 'A': case 'a': @@ -538,7 +540,8 @@ usr_delivery (int fd, char *delivery, int su) if (won) continue; break; - } /* else fall */ + } + /* FALLTHRU */ default: /* parse message and build lookup table */ @@ -565,7 +568,8 @@ usr_delivery (int fd, char *delivery, int su) case 'q': /* deliver to quoted pipe */ if (strcasecmp (action, "qpipe")) - continue; /* else fall */ + continue; + /* FALLTHRU */ case '^': expand (tmpbuf, string, fd); if (split (tmpbuf, vec) < 1) @@ -576,7 +580,8 @@ usr_delivery (int fd, char *delivery, int su) case 'p': /* deliver to pipe */ if (strcasecmp (action, "pipe")) - continue; /* else fall */ + continue; + /* FALLTHRU */ case '|': vec[2] = "sh"; vec[3] = "-c"; @@ -594,7 +599,8 @@ usr_delivery (int fd, char *delivery, int su) } /* deliver to nmh folder */ else if (strcasecmp (action, "folder")) - continue; /* else fall */ + continue; + /* FALLTHRU */ case '+': status = usr_folder (fd, string); break; @@ -607,7 +613,8 @@ usr_delivery (int fd, char *delivery, int su) } /* mbox format */ else if (strcasecmp (action, "mbox")) - continue; /* else fall */ + continue; + /* FALLTHRU */ case '>': /* mbox format */ @@ -703,10 +710,10 @@ parse (int fd) int i, state; int fd1; char *cp, *dp, *lp; - char name[NAMESZ], field[BUFSIZ]; + char name[NAMESZ], field[NMH_BUFSIZ]; struct pair *p, *q; FILE *in; - m_getfld_state_t gstate = 0; + m_getfld_state_t gstate; if (parsed++) return 0; @@ -730,15 +737,16 @@ parse (int fd) * Scan the headers of the message and build * a lookup table. */ + gstate = m_getfld_state_init(in); for (i = 0;;) { int fieldsz = sizeof field; - switch (state = m_getfld (&gstate, name, field, &fieldsz, in)) { + switch (state = m_getfld2(&gstate, name, field, &fieldsz)) { case FLD: case FLDPLUS: - lp = add (field, NULL); + lp = mh_xstrdup(field); while (state == FLDPLUS) { fieldsz = sizeof field; - state = m_getfld (&gstate, name, field, &fieldsz, in); + state = m_getfld2(&gstate, name, field, &fieldsz); lp = add (field, lp); } for (p = hdrs; p->p_name; p++) { @@ -775,11 +783,11 @@ parse (int fd) case LENERR: case FMTERR: - advise (NULL, "format error in message"); + inform("format error in message"); break; default: - advise (NULL, "internal error in m_getfld"); + inform("internal error in m_getfld2"); fclose (in); return -1; } @@ -794,12 +802,12 @@ parse (int fd) p->p_value = getcpy (q ? q->p_value : ""); p->p_flags &= ~P_CHK; if (debug) - debug_printf ("vars[%d]: name=\"%s\" value=\"%s\"\n", + debug_printf ("vars[%ld]: name=\"%s\" value=\"%s\"\n", p - vars, p->p_name, trim(p->p_value)); } if (debug) { for (p = hdrs; p->p_name; p++) - debug_printf ("hdrs[%d]: name=\"%s\" value=\"%s\"\n", + debug_printf ("hdrs[%ld]: name=\"%s\" value=\"%s\"\n", p - hdrs, p->p_name, p->p_value ? trim(p->p_value) : ""); } @@ -879,7 +887,7 @@ glob (int fd) if (debug) { for (p = vars; p->p_name; p++) - debug_printf ("vars[%d]: name=\"%s\" value=\"%s\"\n", + debug_printf ("vars[%ld]: name=\"%s\" value=\"%s\"\n", p - vars, p->p_name, trim(p->p_value)); } } @@ -964,19 +972,11 @@ timely (char *t1, char *t2) static int usr_file (int fd, char *mailbox, int mbx_style) { - int md, mapping; + int md; - if (verbose) - verbose_printf ("delivering to file \"%s\"", mailbox); - - if (mbx_style == MBOX_FORMAT) { - if (verbose) - verbose_printf (" (mbox style)"); - mapping = 0; - } else { - if (verbose) - verbose_printf (" (mmdf style)"); - mapping = 1; + if (verbose) { + verbose_printf("delivering to file \"%s\" (%s style)", mailbox, + mbx_style == MBOX_FORMAT ? "mbox" : "mmdf"); } /* open and lock the file */ @@ -986,10 +986,10 @@ usr_file (int fd, char *mailbox, int mbx_style) return -1; } - lseek (fd, (off_t) 0, SEEK_SET); + lseek(fd, 0, SEEK_SET); /* append message to file */ - if (mbx_copy (mailbox, mbx_style, md, fd, mapping, NULL, verbose) == -1) { + if (mbx_copy (mailbox, mbx_style, md, fd, NULL) == -1) { if (verbose) adorn ("", "error writing to:"); return -1; @@ -1046,17 +1046,15 @@ usr_pipe (int fd_arg, char *cmd, char *pgm, char **vec, int suppress) { volatile int fd = fd_arg; pid_t child_id; - int i, bytes, seconds, status; + int bytes, seconds, status; struct stat st; if (verbose && !suppress) verbose_printf ("delivering to pipe \"%s\"", cmd); - lseek (fd, (off_t) 0, SEEK_SET); - - for (i = 0; (child_id = fork()) == -1 && i < 5; i++) - sleep (5); + lseek(fd, 0, SEEK_SET); + child_id = fork(); switch (child_id) { case -1: /* fork error */ @@ -1085,12 +1083,12 @@ usr_pipe (int fd_arg, char *cmd, char *pgm, char **vec, int suppress) } #endif /* TIOCNOTTY */ - setpgid ((pid_t) 0, getpid ()); /* put in own process group */ + setpgid(0, getpid()); /* put in own process group */ *environ = NULL; - m_putenv ("USER", pw->pw_name); - m_putenv ("HOME", pw->pw_dir); - m_putenv ("SHELL", pw->pw_shell); + setenv("USER", pw->pw_name, 1); + setenv("HOME", pw->pw_dir, 1); + setenv("SHELL", pw->pw_shell, 1); execvp (pgm, vec); _exit (-1); @@ -1118,23 +1116,21 @@ usr_pipe (int fd_arg, char *cmd, char *pgm, char **vec, int suppress) if (verbose) { if (status == 0) verbose_printf (", success.\n"); - else - if ((status & 0xff00) == 0xff00) - verbose_printf (", system error\n"); - else - pidstatus (status, stdout, ", failed"); + else if ((status & 0xff00) == 0xff00) + verbose_printf (", system error\n"); + else + pidstatus (status, stdout, ", failed"); } return (status == 0 ? 0 : -1); - } else { - /* - * Ruthlessly kill the child and anything - * else in its process group. - */ - killpg(child_id, SIGKILL); - if (verbose) - verbose_printf (", timed-out; terminated\n"); - return -1; } + /* + * Ruthlessly kill the child and anything + * else in its process group. + */ + killpg(child_id, SIGKILL); + if (verbose) + verbose_printf (", timed-out; terminated\n"); + return -1; } } @@ -1214,7 +1210,7 @@ you_lose: } if (i == -1) goto you_lose; - lseek (fd1, (off_t) 0, SEEK_SET); + lseek(fd1, 0, SEEK_SET); return fd1; } @@ -1251,11 +1247,10 @@ you_lose: * and massage the headers. Save * a copy of the "From " line for later. */ - i = LEN("From "); while (fgets (buffer, sizeof(buffer), qfp)) { if (first) { first = 0; - if (!strncmp (buffer, "From ", i)) { + if (has_prefix(buffer, "From ")) { /* get copy of envelope information ("From " line) */ envelope = mh_xstrdup(buffer); @@ -1280,7 +1275,7 @@ you_lose: return -1; } fclose (qfp); - lseek (fd1, (off_t) 0, SEEK_SET); + lseek(fd1, 0, SEEK_SET); return fd1; @@ -1298,7 +1293,7 @@ fputs_error: static char * trim (char *cp) { - char buffer[BUFSIZ*4]; + static char buffer[BUFSIZ * 4]; char *bp, *sp; if (cp == NULL) @@ -1325,8 +1320,7 @@ trim (char *cp) if (isspace((unsigned char) *sp)) *sp = ' '; - /* now return a copy */ - return mh_xstrdup(bp); + return bp; } /* @@ -1339,7 +1333,7 @@ verbose_printf (char *fmt, ...) va_list ap; va_start(ap, fmt); - vfprintf (stdout, fmt, ap); + vprintf(fmt, ap); va_end(ap); fflush (stdout); /* now flush output */ @@ -1359,22 +1353,22 @@ adorn (char *what, char *fmt, ...) char *s; eindex = errno; /* save the errno */ - fprintf (stdout, ", "); + printf(", "); va_start(ap, fmt); - vfprintf (stdout, fmt, ap); + vprintf(fmt, ap); va_end(ap); if (what) { if (*what) - fprintf (stdout, " %s: ", what); + printf(" %s: ", what); if ((s = strerror (eindex))) - fprintf (stdout, "%s", s); + fputs(s, stdout); else - fprintf (stdout, "Error %d", eindex); + printf("Error %d", eindex); } - fputc ('\n', stdout); + putchar('\n'); fflush (stdout); } @@ -1404,11 +1398,11 @@ static int suppress_duplicates (int fd, char *file) { int fd1, lockfd, state, result; - char *cp, buf[BUFSIZ], name[NAMESZ]; + char *cp, buf[NMH_BUFSIZ], name[NAMESZ]; datum key, value; DBM *db; FILE *in; - m_getfld_state_t gstate = 0; + m_getfld_state_t gstate; if ((fd1 = dup (fd)) == -1) return -1; @@ -1418,10 +1412,11 @@ suppress_duplicates (int fd, char *file) } rewind (in); + gstate = m_getfld_state_init(in); for (;;) { int failed_to_lock = 0; int bufsz = sizeof buf; - state = m_getfld (&gstate, name, buf, &bufsz, in); + state = m_getfld2(&gstate, name, buf, &bufsz); switch (state) { case FLD: case FLDPLUS: @@ -1429,15 +1424,15 @@ suppress_duplicates (int fd, char *file) if (strcasecmp (name, "Message-ID")) { while (state == FLDPLUS) { bufsz = sizeof buf; - state = m_getfld (&gstate, name, buf, &bufsz, in); + state = m_getfld2(&gstate, name, buf, &bufsz); } continue; } - cp = add (buf, NULL); + cp = mh_xstrdup(buf); while (state == FLDPLUS) { bufsz = sizeof buf; - state = m_getfld (&gstate, name, buf, &bufsz, in); + state = m_getfld2(&gstate, name, buf, &bufsz); cp = add (buf, cp); } key.dptr = trimcpy (cp);