]> diplodocus.org Git - nmh/blobdiff - uip/slocal.c
fdcompare.c: Move interface to own file.
[nmh] / uip / slocal.c
index 60b222d7940aa7057d3386ac45188fa70c90043c..9f784f8dac5144592195412a2023841cdd4da001 100644 (file)
  * Ruud de Rooij <ruud@ruud.org>  Sun, 28 May 2000 17:28:55 +0200
  */
 
-#include <h/mh.h>
-#include <h/dropsbr.h>
-#include <h/rcvmail.h>
-#include <h/signals.h>
+#include "h/mh.h"
+#include "sbr/ambigsw.h"
+#include "sbr/pidstatus.h"
+#include "sbr/print_version.h"
+#include "sbr/print_help.h"
+#include "sbr/error.h"
+#include "h/dropsbr.h"
+#include "h/rcvmail.h"
+#include "h/signals.h"
 #include <setjmp.h>
-#include <h/tws.h>
-#include <h/mts.h>
-#include <h/utils.h>
-#include "../sbr/m_mktemp.h"
+#include "h/tws.h"
+#include "h/mts.h"
+#include "h/done.h"
+#include "h/utils.h"
+#include "sbr/lock_file.h"
+#include "sbr/m_mktemp.h"
 
 #include <pwd.h>
 #include <sys/ioctl.h>
@@ -81,10 +88,10 @@ DEFINE_SWITCH_ARRAY(SLOCAL, switches);
 static int globbed = 0;                /* have we built "vars" table yet?        */
 static int parsed = 0;         /* have we built header field table yet   */
 static int utmped = 0;         /* have we scanned umtp(x) file yet       */
-static int suppressdup = 0;    /* are we suppressing duplicate messages? */
+static bool suppressdup;       /* are we suppressing duplicate messages? */
 
-static int verbose = 0;
-static int debug = 0;
+static bool verbose;
+static bool debug;
 
 static char *addr = NULL;
 static char *user = NULL;
@@ -162,7 +169,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);
@@ -171,9 +178,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 *);
 
@@ -187,7 +194,7 @@ main (int argc, char **argv)
     char mailbox[BUFSIZ], tmpfil[BUFSIZ];
     char **argp, **arguments;
 
-    if (nmh_init(argv[0], 0 /* use context_foil() */)) { return 1; }
+    if (nmh_init(argv[0], false, false)) { return 1; }
 
     mts_init ();
     arguments = getarguments (invo_name, argc, argv, 0);
@@ -201,7 +208,7 @@ main (int argc, char **argv)
                    ambigsw (cp, switches);
                    done (1);
                case UNKWNSW: 
-                   adios (NULL, "-%s unknown", cp);
+                   die("-%s unknown", cp);
 
                case HELPSW: 
                    snprintf (buf, sizeof(buf), "%s [switches]", invo_name);
@@ -213,60 +220,60 @@ main (int argc, char **argv)
 
                case ADDRSW: 
                    if (!(addr = *argp++))/* allow -xyz arguments */
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                       die("missing argument to %s", argp[-2]);
                    continue;
                case INFOSW: 
                    if (!(info = *argp++))/* allow -xyz arguments */
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                       die("missing argument to %s", argp[-2]);
                    continue;
                case USERSW: 
                    if (!(user = *argp++))/* allow -xyz arguments */
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                       die("missing argument to %s", argp[-2]);
                    continue;
                case FILESW: 
                    if (!(file = *argp++) || *file == '-')
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                       die("missing argument to %s", argp[-2]);
                    continue;
                case SENDERSW: 
                    if (!(sender = *argp++))/* allow -xyz arguments */
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                       die("missing argument to %s", argp[-2]);
                    continue;
                case MAILBOXSW: 
                    if (!(mbox = *argp++) || *mbox == '-')
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                       die("missing argument to %s", argp[-2]);
                    continue;
                case HOMESW: 
                    if (!(home = *argp++) || *home == '-')
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                       die("missing argument to %s", argp[-2]);
                    continue;
 
                case MAILSW: 
                    if (!(cp = *argp++) || *cp == '-')
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                       die("missing argument to %s", argp[-2]);
                    if (mdlvr)
-                       adios (NULL, "only one maildelivery file at a time!");
+                       die("only one maildelivery file at a time!");
                    mdlvr = cp;
                    continue;
 
                case VERBSW: 
-                   verbose++;
+                   verbose = true;
                    continue;
                case NVERBSW: 
-                   verbose = 0;
+                   verbose = false;
                    continue;
 
                case SUPPRESSDUP:
-                   suppressdup++;
+                   suppressdup = true;
                    continue;
                case NSUPPRESSDUP:
-                   suppressdup = 0;
+                   suppressdup = false;
                    continue;
                case DEBUGSW: 
-                   debug++;
+                   debug = true;
                    continue;
            }
        } else {
-               adios (NULL, "only switch arguments are supported");
+               die("only switch arguments are supported");
        }
     }
 
@@ -276,7 +283,7 @@ main (int argc, char **argv)
        user = getusername ();
     }
     if ((pw = getpwnam (user)) == NULL)
-       adios (NULL, "no such local user as %s", user);
+       die("no such local user as %s", user);
 
     if (chdir (pw->pw_dir) == -1)
        if (chdir ("/") < 0) {
@@ -301,7 +308,7 @@ main (int argc, char **argv)
 
     /* Record the delivery time */
     if ((now = dlocaltimenow ()) == NULL)
-       adios (NULL, "unable to ascertain local time");
+       die("unable to ascertain local time");
     snprintf (ddate, sizeof(ddate), "Delivery-Date: %s\n", dtimenow (0));
 
     /*
@@ -316,7 +323,7 @@ main (int argc, char **argv)
        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 in %s",
+           die("unable to create temporary file in %s",
                   get_temp_dir());
        close (tempfd);
     } else {
@@ -324,7 +331,7 @@ main (int argc, char **argv)
        if (debug)
            debug_printf ("retrieving message from stdin\n");
        if ((fd = copy_message (fileno (stdin), tmpfil, 1)) == -1)
-           adios(NULL, "unable to create temporary file in %s",
+           die("unable to create temporary file in %s",
                   get_temp_dir());
     }
 
@@ -345,7 +352,7 @@ main (int argc, char **argv)
     (void) m_unlink (tmpfil);
 
     if (!(fp = fdopen (fd, "r+")))
-       adios (NULL, "unable to access temporary file");
+       die("unable to access temporary file");
 
     /*
      * If no sender given, extract it
@@ -419,7 +426,12 @@ localmail (int fd, char *mdlvr)
 static int
 usr_delivery (int fd, char *delivery, int su)
 {
-    int i, accept, status=1, won, vecp, next;
+    int i;
+    bool accept;
+    int status=1;
+    bool won;
+    int vecp;
+    bool next;
     char *field, *pattern, *action, *result, *string;
     char buffer[BUFSIZ], tmpbuf[BUFSIZ];
     char *vec[NVEC];
@@ -442,8 +454,8 @@ usr_delivery (int fd, char *delivery, int su)
        return -1;
     }
 
-    won = 0;
-    next = 1;
+    won = false;
+    next = true;
 
     /* read and process delivery file */
     while (fgets (buffer, sizeof(buffer), fp)) {
@@ -501,7 +513,7 @@ usr_delivery (int fd, char *delivery, int su)
                 * Take action, and consider delivered if
                 * action is successful.
                 */
-               accept = 1;
+               accept = true;
                break;
 
            case 'R': 
@@ -511,7 +523,7 @@ usr_delivery (int fd, char *delivery, int su)
                 * Take action, but don't consider delivered, even
                 * if action is successful
                 */
-               accept = 0;
+               accept = false;
                break;
        }
 
@@ -554,9 +566,9 @@ usr_delivery (int fd, char *delivery, int su)
                 */
                if ((p = lookup (hdrs, field)) && (p->p_value != NULL)
                        && matches (p->p_value, pattern)) {
-                   next = 1;
+                   next = true;
                } else {
-                   next = 0;
+                   next = false;
                    continue;
                }
                break;
@@ -628,14 +640,14 @@ usr_delivery (int fd, char *delivery, int su)
                break;
        }
 
-       if (status) next = 0;   /* action failed, mark for 'N' result */
+       if (status) next = false; /* action failed, mark for 'N' result */
 
        if (accept && status == 0)
-           won++;
+           won = true;
     }
 
     fclose (fp);
-    return (won ? 0 : -1);
+    return won ? 0 : -1;
 }
 
 
@@ -712,7 +724,7 @@ parse (int fd)
     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;
@@ -736,15 +748,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 = 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++) {
@@ -785,7 +798,7 @@ parse (int fd)
                break;
 
            default: 
-               inform("internal error in m_getfld");
+               inform("internal error in m_getfld2");
                fclose (in);
                return -1;
        }
@@ -800,12 +813,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",
-                   p - vars, p->p_name, trim(p->p_value));
+            debug_printf ("vars[%td]: 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[%td]: name=\"%s\" value=\"%s\"\n",
                p - hdrs, p->p_name, p->p_value ? trim(p->p_value) : "");
     }
 
@@ -885,7 +898,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[%td]: name=\"%s\" value=\"%s\"\n",
                    p - vars, p->p_name, trim(p->p_value));
     }
 }
@@ -929,13 +942,13 @@ logged_in (void)
             if (debug)
                 continue;
             endutxent();
-            return (utmped = DONE);
+            return utmped = DONE;
         }
     }
 
     endutxent();
 #endif /* HAVE_GETUTXENT */
-    return (utmped = NOTOK);
+    return utmped = NOTOK;
 }
 
 #define        check(t,a,b)            if (t < a || t > b) return -1
@@ -970,19 +983,11 @@ timely (char *t1, char *t2)
 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 */
@@ -992,10 +997,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;
@@ -1052,17 +1057,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 */
@@ -1091,7 +1094,7 @@ 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;
            setenv("USER", pw->pw_name, 1);
@@ -1099,7 +1102,7 @@ usr_pipe (int fd_arg, char *cmd, char *pgm, char **vec, int suppress)
            setenv("SHELL", pw->pw_shell, 1);
 
            execvp (pgm, vec);
-           _exit (-1);
+           _exit(1);
 
        default: 
            /* parent process */
@@ -1124,13 +1127,12 @@ 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);
+               return status == 0 ? 0 : -1;
            }
             /*
              * Ruthlessly kill the child and anything
@@ -1219,7 +1221,7 @@ you_lose:
            }
        if (i == -1)
            goto you_lose;
-       lseek (fd1, (off_t) 0, SEEK_SET);
+       lseek(fd1, 0, SEEK_SET);
        return fd1;
     }
 
@@ -1284,7 +1286,7 @@ you_lose:
        return -1;
     }
     fclose (qfp);
-    lseek (fd1, (off_t) 0, SEEK_SET);
+    lseek(fd1, 0, SEEK_SET);
     return fd1;
 
 
@@ -1302,7 +1304,7 @@ fputs_error:
 static char *
 trim (char *cp)
 {
-    char buffer[BUFSIZ*4];
+    static char buffer[BUFSIZ * 4];
     char *bp, *sp;
 
     if (cp == NULL)
@@ -1329,8 +1331,7 @@ trim (char *cp)
        if (isspace((unsigned char) *sp))
            *sp = ' ';
 
-    /* now return a copy */
-    return mh_xstrdup(bp);
+    return bp;
 }
 
 /*
@@ -1363,7 +1364,7 @@ adorn (char *what, char *fmt, ...)
     char *s;
 
     eindex = errno;    /* save the errno */
-    printf(", ");
+    fputs(", ", stdout);
 
     va_start(ap, fmt);
     vprintf(fmt, ap);
@@ -1412,7 +1413,7 @@ suppress_duplicates (int fd, char *file)
     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;
@@ -1422,10 +1423,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:
@@ -1433,7 +1435,7 @@ 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;
                }
@@ -1441,7 +1443,7 @@ suppress_duplicates (int fd, char *file)
                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);