]> diplodocus.org Git - nmh/blobdiff - uip/slocal.c
Changed failure exit status of mkstemp(1) from 255 to 1.
[nmh] / uip / slocal.c
index 772c4e2bb0fc55dd88abdf60021c4cf0dc5f0b16..b249dc4b7ede3819bda2a99dd2c813003c40a206 100644 (file)
@@ -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
  *
  * 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 <h/tws.h>
 #include <h/mts.h>
 #include <h/utils.h>
 #include <h/tws.h>
 #include <h/mts.h>
 #include <h/utils.h>
+#include "../sbr/lock_file.h"
+#include "../sbr/m_mktemp.h"
 
 #include <pwd.h>
 #include <sys/ioctl.h>
 
 #include <pwd.h>
 #include <sys/ioctl.h>
@@ -452,7 +452,7 @@ usr_delivery (int fd, char *delivery, int su)
        if (*buffer == '#' || *buffer == '\n')
            continue;
 
        if (*buffer == '#' || *buffer == '\n')
            continue;
 
-        TrimSuffixC(buffer, '\n');
+        trim_suffix_c(buffer, '\n');
 
        /* split buffer into fields */
        vecp = split (buffer, vec);
 
        /* 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)
                 * do this - else fall through
                 */
                if (!next)
-                   continue;   /* else fall */
+                   continue;
+               /* FALLTHRU */
 
            case '?': 
                /*
 
            case '?': 
                /*
@@ -492,7 +493,8 @@ usr_delivery (int fd, char *delivery, int su)
                 * consider delivered if action is successful.
                 */
                if (won)
                 * consider delivered if action is successful.
                 */
                if (won)
-                   continue;   /* else fall */
+                   continue;
+               /* FALLTHRU */
 
            case 'A': 
            case 'a': 
 
            case 'A': 
            case 'a': 
@@ -538,7 +540,8 @@ usr_delivery (int fd, char *delivery, int su)
                    if (won)
                        continue;
                    break;
                    if (won)
                        continue;
                    break;
-               }               /* else fall */
+               }
+               /* FALLTHRU */
 
            default: 
                /* parse message and build lookup table */
 
            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"))
            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)
            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"))
            case 'p': 
                /* deliver to pipe */
                if (strcasecmp (action, "pipe"))
-                   continue;   /* else fall */
+                   continue;
+               /* FALLTHRU */
            case '|': 
                vec[2] = "sh";
                vec[3] = "-c";
            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"))
                }
                /* deliver to nmh folder */
                else if (strcasecmp (action, "folder"))
-                   continue;   /* else fall */
+                   continue;
+               /* FALLTHRU */
            case '+':
                status = usr_folder (fd, string);
                break;
            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"))
                }
                /* mbox format */
                else if (strcasecmp (action, "mbox"))
-                   continue;   /* else fall */
+                   continue;
+               /* FALLTHRU */
 
            case '>': 
                /* mbox format */
 
            case '>': 
                /* mbox format */
@@ -703,10 +710,10 @@ parse (int fd)
     int i, state;
     int fd1;
     char *cp, *dp, *lp;
     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;
     struct pair *p, *q;
     FILE  *in;
-    m_getfld_state_t gstate = 0;
+    m_getfld_state_t gstate;
 
     if (parsed++)
        return 0;
 
     if (parsed++)
        return 0;
@@ -730,15 +737,16 @@ parse (int fd)
      * Scan the headers of the message and build
      * a lookup table.
      */
      * Scan the headers of the message and build
      * a lookup table.
      */
+    gstate = m_getfld_state_init(in);
     for (i = 0;;) {
        int fieldsz = sizeof field;
     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: 
            case FLD: 
            case FLDPLUS: 
-               lp = add (field, NULL);
+               lp = mh_xstrdup(field);
                while (state == FLDPLUS) {
                    fieldsz = sizeof 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++) {
                    lp = add (field, lp);
                }
                for (p = hdrs; p->p_name; p++) {
@@ -775,11 +783,11 @@ parse (int fd)
 
            case LENERR: 
            case FMTERR: 
 
            case LENERR: 
            case FMTERR: 
-               advise (NULL, "format error in message");
+               inform("format error in message");
                break;
 
            default: 
                break;
 
            default: 
-               advise (NULL, "internal error in m_getfld");
+               inform("internal error in m_getfld2");
                fclose (in);
                return -1;
        }
                fclose (in);
                return -1;
        }
@@ -964,19 +972,11 @@ timely (char *t1, char *t2)
 static int
 usr_file (int fd, char *mailbox, int mbx_style)
 {
 static int
 usr_file (int fd, char *mailbox, int mbx_style)
 {
-    int        md, mapping;
-
-    if (verbose)
-       verbose_printf ("delivering to file \"%s\"", mailbox);
+    int        md;
 
 
-    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 */
     }
 
     /* open and lock the file */
@@ -986,10 +986,10 @@ usr_file (int fd, char *mailbox, int mbx_style)
        return -1;
     }
 
        return -1;
     }
 
-    lseek (fd, (off_t) 0, SEEK_SET);
+    lseek(fd, 0, SEEK_SET);
 
     /* append message to file */
 
     /* 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;
        if (verbose)
            adorn ("", "error writing to:");
        return -1;
@@ -1052,7 +1052,7 @@ usr_pipe (int fd_arg, char *cmd, char *pgm, char **vec, int suppress)
     if (verbose && !suppress)
        verbose_printf ("delivering to pipe \"%s\"", cmd);
 
     if (verbose && !suppress)
        verbose_printf ("delivering to pipe \"%s\"", cmd);
 
-    lseek (fd, (off_t) 0, SEEK_SET);
+    lseek(fd, 0, SEEK_SET);
 
     for (i = 0; (child_id = fork()) == -1 && i < 5; i++)
        sleep (5);
 
     for (i = 0; (child_id = fork()) == -1 && i < 5; i++)
        sleep (5);
@@ -1088,9 +1088,9 @@ usr_pipe (int fd_arg, char *cmd, char *pgm, char **vec, int suppress)
            setpgid ((pid_t) 0, getpid ());     /* put in own process group */
 
            *environ = NULL;
            setpgid ((pid_t) 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);
 
            execvp (pgm, vec);
            _exit (-1);
@@ -1118,11 +1118,10 @@ usr_pipe (int fd_arg, char *cmd, char *pgm, char **vec, int suppress)
                if (verbose) {
                    if (status == 0)
                        verbose_printf (", success.\n");
                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);
            }
                }
                return (status == 0 ? 0 : -1);
            }
@@ -1213,7 +1212,7 @@ you_lose:
            }
        if (i == -1)
            goto you_lose;
            }
        if (i == -1)
            goto you_lose;
-       lseek (fd1, (off_t) 0, SEEK_SET);
+       lseek(fd1, 0, SEEK_SET);
        return fd1;
     }
 
        return fd1;
     }
 
@@ -1250,11 +1249,10 @@ you_lose:
      * and massage the headers.  Save
      * a copy of the "From " line for later.
      */
      * 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;
     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);
 
                /* get copy of envelope information ("From " line) */
                envelope = mh_xstrdup(buffer);
 
@@ -1279,7 +1277,7 @@ you_lose:
        return -1;
     }
     fclose (qfp);
        return -1;
     }
     fclose (qfp);
-    lseek (fd1, (off_t) 0, SEEK_SET);
+    lseek(fd1, 0, SEEK_SET);
     return fd1;
 
 
     return fd1;
 
 
@@ -1338,7 +1336,7 @@ verbose_printf (char *fmt, ...)
     va_list ap;
 
     va_start(ap, fmt);
     va_list ap;
 
     va_start(ap, fmt);
-    vfprintf (stdout, fmt, ap);
+    vprintf(fmt, ap);
     va_end(ap);
 
     fflush (stdout);   /* now flush output */
     va_end(ap);
 
     fflush (stdout);   /* now flush output */
@@ -1358,22 +1356,22 @@ adorn (char *what, char *fmt, ...)
     char *s;
 
     eindex = errno;    /* save the errno */
     char *s;
 
     eindex = errno;    /* save the errno */
-    fprintf (stdout, ", ");
+    printf(", ");
 
     va_start(ap, fmt);
 
     va_start(ap, fmt);
-    vfprintf (stdout, fmt, ap);
+    vprintf(fmt, ap);
     va_end(ap);
 
     if (what) {
        if (*what)
     va_end(ap);
 
     if (what) {
        if (*what)
-           fprintf (stdout, " %s: ", what);
+           printf(" %s: ", what);
        if ((s = strerror (eindex)))
        if ((s = strerror (eindex)))
-           fprintf (stdout, "%s", s);
+           fputs(s, stdout);
        else
        else
-           fprintf (stdout, "Error %d", eindex);
+           printf("Error %d", eindex);
     }
 
     }
 
-    fputc ('\n', stdout);
+    putchar('\n');
     fflush (stdout);
 }
 
     fflush (stdout);
 }
 
@@ -1403,11 +1401,11 @@ static int
 suppress_duplicates (int fd, char *file)
 {
     int        fd1, lockfd, state, result;
 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;
     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;
 
     if ((fd1 = dup (fd)) == -1)
        return -1;
@@ -1417,10 +1415,11 @@ suppress_duplicates (int fd, char *file)
     }
     rewind (in);
 
     }
     rewind (in);
 
+    gstate = m_getfld_state_init(in);
     for (;;) {
         int failed_to_lock = 0;
        int bufsz = sizeof buf;
     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:
        switch (state) {
            case FLD:
            case FLDPLUS:
@@ -1428,15 +1427,15 @@ suppress_duplicates (int fd, char *file)
                if (strcasecmp (name, "Message-ID")) {
                    while (state == FLDPLUS) {
                        bufsz = sizeof buf;
                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;
                }
 
                    }
                    continue;
                }
 
-               cp = add (buf, NULL);
+               cp = mh_xstrdup(buf);
                while (state == FLDPLUS) {
                    bufsz = sizeof 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);
                    cp = add (buf, cp);
                }
                key.dptr = trimcpy (cp);