]> diplodocus.org Git - nmh/blobdiff - uip/inc.c
Display the command when reporting timing.
[nmh] / uip / inc.c
index 0df0a4de8879d7dc715599b3691809db283bcf3b..d65c46fbad8eb54f56428614005d8cea2750d061 100644 (file)
--- a/uip/inc.c
+++ b/uip/inc.c
 #include <h/signals.h>
 #include <h/tws.h>
 #include <h/mts.h>
 #include <h/signals.h>
 #include <h/tws.h>
 #include <h/mts.h>
-#include "../sbr/lock_file.h"
-#include "../sbr/m_maildir.h"
-#include "../sbr/m_mktemp.h"
+#include "h/done.h"
+#include "sbr/lock_file.h"
+#include "sbr/m_maildir.h"
+#include "sbr/m_mktemp.h"
 
 #ifndef TLS_SUPPORT
 # define TLSminc(a) (a)
 
 #ifndef TLS_SUPPORT
 # define TLSminc(a) (a)
@@ -100,12 +101,12 @@ static struct Maildir_entry {
 static int num_maildir_entries = 0;
 static int snoop = 0;
 
 static int num_maildir_entries = 0;
 static int snoop = 0;
 
-extern char response[];
-
-static long start;
-static long stop;
+typedef struct {
+    FILE *mailout;
+    long written;
+} pop_closure;
 
 
-static FILE *pf = NULL;
+extern char response[];
 
 /* This is an attempt to simplify things by putting all the
  * privilege ops into macros.
 
 /* This is an attempt to simplify things by putting all the
  * privilege ops into macros.
@@ -149,17 +150,18 @@ static gid_t return_gid;
 #endif /* not MAILGROUP */
 
 /* these variables have to be globals so that done() can correctly clean up the lockfile */
 #endif /* not MAILGROUP */
 
 /* these variables have to be globals so that done() can correctly clean up the lockfile */
-static int locked = 0;
+static bool locked;
 static char *newmail;
 static FILE *in;
 
 /*
  * prototypes
  */
 static char *newmail;
 static FILE *in;
 
 /*
  * prototypes
  */
+static int maildir_srt(const void *va, const void *vb) PURE;
 static void inc_done(int) NORETURN;
 static void inc_done(int) NORETURN;
-static int pop_action(char *);
+static int pop_action(void *closure, char *);
 
 
-int
+static int
 maildir_srt(const void *va, const void *vb)
 {
     const struct Maildir_entry *a = va, *b = vb;
 maildir_srt(const void *va, const void *vb)
 {
     const struct Maildir_entry *a = va, *b = vb;
@@ -179,6 +181,7 @@ main (int argc, char **argv)
     bool noisy;
     int width = -1;
     int hghnum = 0, msgnum = 0;
     bool noisy;
     int width = -1;
     int hghnum = 0, msgnum = 0;
+    FILE *pf = NULL;
     bool sasl, tls, noverify;
     int incerr = 0; /* <0 if inc hits an error which means it should not truncate mailspool */
     char *cp, *maildir = NULL, *folder = NULL;
     bool sasl, tls, noverify;
     int incerr = 0; /* <0 if inc hits an error which means it should not truncate mailspool */
     char *cp, *maildir = NULL, *folder = NULL;
@@ -194,7 +197,7 @@ main (int argc, char **argv)
 
     int nmsgs, nbytes;
     char *MAILHOST_env_variable;
 
     int nmsgs, nbytes;
     char *MAILHOST_env_variable;
-    done=inc_done;
+    set_done(inc_done);
 
 /* absolutely the first thing we do is save our privileges,
  * and drop them if we can.
 
 /* absolutely the first thing we do is save our privileges,
  * and drop them if we can.
@@ -202,7 +205,7 @@ main (int argc, char **argv)
     SAVEGROUPPRIVS();
     TRYDROPGROUPPRIVS();
 
     SAVEGROUPPRIVS();
     TRYDROPGROUPPRIVS();
 
-    if (nmh_init(argv[0], 1)) { return 1; }
+    if (nmh_init(argv[0], true, true)) { return 1; }
 
     mts_init ();
     arguments = getarguments (invo_name, argc, argv, 1);
 
     mts_init ();
     arguments = getarguments (invo_name, argc, argv, 1);
@@ -233,7 +236,7 @@ main (int argc, char **argv)
                ambigsw (cp, switches);
                done (1);
            case UNKWNSW:
                ambigsw (cp, switches);
                done (1);
            case UNKWNSW:
-               adios (NULL, "-%s unknown", cp);
+               die("-%s unknown", cp);
 
            case HELPSW:
                snprintf (buf, sizeof(buf), "%s [+folder] [switches]", invo_name);
 
            case HELPSW:
                snprintf (buf, sizeof(buf), "%s [+folder] [switches]", invo_name);
@@ -245,8 +248,8 @@ main (int argc, char **argv)
 
            case AUDSW:
                if (!(cp = *argp++) || *cp == '-')
 
            case AUDSW:
                if (!(cp = *argp++) || *cp == '-')
-                   adios (NULL, "missing argument to %s", argp[-2]);
-               audfile = getcpy (m_maildir (cp));
+                   die("missing argument to %s", argp[-2]);
+               audfile = mh_xstrdup(m_maildir(cp));
                continue;
            case NAUDSW:
                audfile = NULL;
                continue;
            case NAUDSW:
                audfile = NULL;
@@ -275,7 +278,7 @@ main (int argc, char **argv)
 
            case FILESW:
                if (!(cp = *argp++) || *cp == '-')
 
            case FILESW:
                if (!(cp = *argp++) || *cp == '-')
-                   adios (NULL, "missing argument to %s", argp[-2]);
+                   die("missing argument to %s", argp[-2]);
                from = path (cp, TFILE);
 
                /*
                from = path (cp, TFILE);
 
                /*
@@ -295,34 +298,34 @@ main (int argc, char **argv)
 
            case FORMSW:
                if (!(form = *argp++) || *form == '-')
 
            case FORMSW:
                if (!(form = *argp++) || *form == '-')
-                   adios (NULL, "missing argument to %s", argp[-2]);
+                   die("missing argument to %s", argp[-2]);
                format = NULL;
                continue;
            case FMTSW:
                if (!(format = *argp++) || *format == '-')
                format = NULL;
                continue;
            case FMTSW:
                if (!(format = *argp++) || *format == '-')
-                   adios (NULL, "missing argument to %s", argp[-2]);
+                   die("missing argument to %s", argp[-2]);
                form = NULL;
                continue;
 
            case WIDTHSW:
                if (!(cp = *argp++) || *cp == '-')
                form = NULL;
                continue;
 
            case WIDTHSW:
                if (!(cp = *argp++) || *cp == '-')
-                   adios (NULL, "missing argument to %s", argp[-2]);
+                   die("missing argument to %s", argp[-2]);
                width = atoi (cp);
                continue;
 
            case HOSTSW:
                if (!(host = *argp++) || *host == '-')
                width = atoi (cp);
                continue;
 
            case HOSTSW:
                if (!(host = *argp++) || *host == '-')
-                   adios (NULL, "missing argument to %s", argp[-2]);
+                   die("missing argument to %s", argp[-2]);
                continue;
 
            case PORTSW:
                if (!(port = *argp++) || *port == '-')
                continue;
 
            case PORTSW:
                if (!(port = *argp++) || *port == '-')
-                   adios (NULL, "missing argument to %s", argp[-2]);
+                   die("missing argument to %s", argp[-2]);
                continue;
 
            case USERSW:
                if (!(user = *argp++) || *user == '-')
                continue;
 
            case USERSW:
                if (!(user = *argp++) || *user == '-')
-                   adios (NULL, "missing argument to %s", argp[-2]);
+                   die("missing argument to %s", argp[-2]);
                continue;
 
            case SNOOPSW:
                continue;
 
            case SNOOPSW:
@@ -338,7 +341,7 @@ main (int argc, char **argv)
        
            case SASLMECHSW:
                if (!(saslmech = *argp++) || *saslmech == '-')
        
            case SASLMECHSW:
                if (!(saslmech = *argp++) || *saslmech == '-')
-                   adios (NULL, "missing argument to %s", argp[-2]);
+                   die("missing argument to %s", argp[-2]);
                continue;
 
            case INITTLSSW:
                continue;
 
            case INITTLSSW:
@@ -360,25 +363,24 @@ main (int argc, char **argv)
            case AUTHSERVICESW:
 #ifdef OAUTH_SUPPORT
                 if (!(auth_svc = *argp++) || *auth_svc == '-')
            case AUTHSERVICESW:
 #ifdef OAUTH_SUPPORT
                 if (!(auth_svc = *argp++) || *auth_svc == '-')
-                    adios (NULL, "missing argument to %s", argp[-2]);
+                    die("missing argument to %s", argp[-2]);
 #else
 #else
-                adios (NULL, "not built with OAuth support");
+                die("not built with OAuth support");
 #endif
                 continue;
 
            case PROXYSW:
                if (!(proxy = *argp++) || *proxy == '-')
 #endif
                 continue;
 
            case PROXYSW:
                if (!(proxy = *argp++) || *proxy == '-')
-                   adios (NULL, "missing argument to %s", argp[-2]);
+                   die("missing argument to %s", argp[-2]);
                continue;
            }
        }
        if (*cp == '+' || *cp == '@') {
            if (folder)
                continue;
            }
        }
        if (*cp == '+' || *cp == '@') {
            if (folder)
-               adios (NULL, "only one folder at a time!");
-           else
-               folder = pluspath (cp);
+               die("only one folder at a time!");
+            folder = pluspath (cp);
        } else {
        } else {
-           adios (NULL, "usage: %s [+folder] [switches]", invo_name);
+           die("usage: %s [+folder] [switches]", invo_name);
        }
     }
 
        }
     }
 
@@ -400,11 +402,11 @@ main (int argc, char **argv)
 
        if (auth_svc == NULL) {
            if (saslmech  &&  ! strcasecmp(saslmech, "xoauth2")) {
 
        if (auth_svc == NULL) {
            if (saslmech  &&  ! strcasecmp(saslmech, "xoauth2")) {
-               adios (NULL, "must specify -authservice with -saslmech xoauth2");
+               die("must specify -authservice with -saslmech xoauth2");
            }
        } else {
            if (user == NULL) {
            }
        } else {
            if (user == NULL) {
-               adios (NULL, "must specify -user with -saslmech xoauth2");
+               die("must specify -user with -saslmech xoauth2");
            }
        }
 
            }
        }
 
@@ -419,15 +421,15 @@ main (int argc, char **argv)
         */
        if (pop_init (host, port, user, proxy, snoop, sasl, saslmech,
                      tlsflag, auth_svc) == NOTOK)
         */
        if (pop_init (host, port, user, proxy, snoop, sasl, saslmech,
                      tlsflag, auth_svc) == NOTOK)
-           adios (NULL, "%s", response);
+           die("%s", response);
 
        /* Check if there are any messages */
        if (pop_stat (&nmsgs, &nbytes) == NOTOK)
 
        /* Check if there are any messages */
        if (pop_stat (&nmsgs, &nbytes) == NOTOK)
-           adios (NULL, "%s", response);
+           die("%s", response);
 
        if (nmsgs == 0) {
            pop_quit();
 
        if (nmsgs == 0) {
            pop_quit();
-           adios (NULL, "no mail to incorporate");
+           die("no mail to incorporate");
        }
 
     } else if (inc_type == INC_FILE) {
        }
 
     } else if (inc_type == INC_FILE) {
@@ -442,7 +444,7 @@ main (int argc, char **argv)
            newmail = concat (MAILDIR, "/", MAILFIL, NULL);
        }
        if (stat (newmail, &s1) == NOTOK || s1.st_size == 0)
            newmail = concat (MAILDIR, "/", MAILFIL, NULL);
        }
        if (stat (newmail, &s1) == NOTOK || s1.st_size == 0)
-           adios (NULL, "no mail to incorporate");
+           die("no mail to incorporate");
        if (s1.st_mode & S_IFDIR) {
            DIR *md;
            struct dirent *de;
        if (s1.st_mode & S_IFDIR) {
            DIR *md;
            struct dirent *de;
@@ -451,13 +453,13 @@ main (int argc, char **argv)
            i = 0;
            cp = concat (newmail, "/new", NULL);
            if ((md = opendir(cp)) == NULL)
            i = 0;
            cp = concat (newmail, "/new", NULL);
            if ((md = opendir(cp)) == NULL)
-               adios (NULL, "unable to open %s", cp);
+               die("unable to open %s", cp);
            while ((de = readdir (md)) != NULL) {
                if (de->d_name[0] == '.')
                    continue;
                if (i >= num_maildir_entries) {
                    if ((Maildir = realloc(Maildir, sizeof(*Maildir) * (2*i+16))) == NULL)
            while ((de = readdir (md)) != NULL) {
                if (de->d_name[0] == '.')
                    continue;
                if (i >= num_maildir_entries) {
                    if ((Maildir = realloc(Maildir, sizeof(*Maildir) * (2*i+16))) == NULL)
-                       adios(NULL, "not enough memory for %d messages", 2*i+16);
+                       die("not enough memory for %d messages", 2*i+16);
                    num_maildir_entries = 2*i+16;
                }
                Maildir[i].filename = concat (cp, "/", de->d_name, NULL);
                    num_maildir_entries = 2*i+16;
                }
                Maildir[i].filename = concat (cp, "/", de->d_name, NULL);
@@ -470,13 +472,13 @@ main (int argc, char **argv)
            closedir (md);
            cp = concat (newmail, "/cur", NULL);
            if ((md = opendir(cp)) == NULL)
            closedir (md);
            cp = concat (newmail, "/cur", NULL);
            if ((md = opendir(cp)) == NULL)
-               adios (NULL, "unable to open %s", cp);
+               die("unable to open %s", cp);
            while ((de = readdir (md)) != NULL) {
                if (de->d_name[0] == '.')
                    continue;
                if (i >= num_maildir_entries) {
                    if ((Maildir = realloc(Maildir, sizeof(*Maildir) * (2*i+16))) == NULL)
            while ((de = readdir (md)) != NULL) {
                if (de->d_name[0] == '.')
                    continue;
                if (i >= num_maildir_entries) {
                    if ((Maildir = realloc(Maildir, sizeof(*Maildir) * (2*i+16))) == NULL)
-                       adios(NULL, "not enough memory for %d messages", 2*i+16);
+                       die("not enough memory for %d messages", 2*i+16);
                    num_maildir_entries = 2*i+16;
                }
                Maildir[i].filename = concat (cp, "/", de->d_name, NULL);
                    num_maildir_entries = 2*i+16;
                }
                Maildir[i].filename = concat (cp, "/", de->d_name, NULL);
@@ -488,7 +490,7 @@ main (int argc, char **argv)
            free (cp);
            closedir (md);
            if (i == 0)
            free (cp);
            closedir (md);
            if (i == 0)
-               adios (NULL, "no mail to incorporate");
+               die("no mail to incorporate");
            num_maildir_entries = i;
            qsort (Maildir, num_maildir_entries, sizeof(*Maildir), maildir_srt);
        }
            num_maildir_entries = i;
            qsort (Maildir, num_maildir_entries, sizeof(*Maildir), maildir_srt);
        }
@@ -519,13 +521,13 @@ main (int argc, char **argv)
 
     /* read folder and create message structure */
     if (!(mp = folder_read (folder, 0)))
 
     /* read folder and create message structure */
     if (!(mp = folder_read (folder, 0)))
-       adios (NULL, "unable to read folder %s", folder);
+       die("unable to read folder %s", folder);
 
     if (inc_type == INC_FILE && Maildir == NULL) {
         /* Mail from a spool file. */
 
        if (access (newmail, W_OK) != NOTOK) {
 
     if (inc_type == INC_FILE && Maildir == NULL) {
         /* Mail from a spool file. */
 
        if (access (newmail, W_OK) != NOTOK) {
-           locked++;
+           locked = true;
            if (trnflag) {
                SIGNAL (SIGHUP, SIG_IGN);
                SIGNAL (SIGINT, SIG_IGN);
            if (trnflag) {
                SIGNAL (SIGHUP, SIG_IGN);
                SIGNAL (SIGINT, SIG_IGN);
@@ -537,7 +539,7 @@ main (int argc, char **argv)
             in = lkfopenspool (newmail, "r");
             DROPGROUPPRIVS();
             if (in == NULL)
             in = lkfopenspool (newmail, "r");
             DROPGROUPPRIVS();
             if (in == NULL)
-               adios (NULL, "unable to lock and fopen %s", newmail);
+               die("unable to lock and fopen %s", newmail);
            fstat (fileno(in), &s1);
        } else {
            trnflag = 0;
            fstat (fileno(in), &s1);
        } else {
            trnflag = 0;
@@ -555,7 +557,7 @@ main (int argc, char **argv)
            inform("Creating Receive-Audit: %s", audfile);
        if ((aud = fopen (audfile, "a")) == NULL)
            adios (audfile, "unable to append to");
            inform("Creating Receive-Audit: %s", audfile);
        if ((aud = fopen (audfile, "a")) == NULL)
            adios (audfile, "unable to append to");
-       else if (i == NOTOK)
+       if (i == NOTOK)
            chmod (audfile, m_gmprot ());
 
        if (from)
            chmod (audfile, m_gmprot ());
 
        if (from)
@@ -584,6 +586,7 @@ main (int argc, char **argv)
     if (inc_type == INC_POP) {
         /* Mail from a POP server. */
        int i;
     if (inc_type == INC_POP) {
         /* Mail from a POP server. */
        int i;
+        pop_closure pc;
 
         hghnum = msgnum = mp->hghmsg;
        for (i = 1; i <= nmsgs; i++) {
 
         hghnum = msgnum = mp->hghmsg;
        for (i = 1; i <= nmsgs; i++) {
@@ -594,17 +597,18 @@ main (int argc, char **argv)
             if ((pf = fopen (cp, "w+")) == NULL)
                 adios (cp, "unable to write");
             chmod (cp, m_gmprot ());
             if ((pf = fopen (cp, "w+")) == NULL)
                 adios (cp, "unable to write");
             chmod (cp, m_gmprot ());
-            start = stop = 0L;
 
 
-            if (pop_retr (i, pop_action) == NOTOK)
-                adios (NULL, "%s", response);
+            pc.written = 0;
+            pc.mailout = pf;
+            if (pop_retr(i, pop_action, &pc) == NOTOK)
+                die("%s", response);
 
             if (fflush (pf))
                 adios (cp, "write error on");
             fseek (pf, 0L, SEEK_SET);
            switch (incerr = scan (pf, msgnum, 0, nfs, width,
                              msgnum == mp->hghmsg + 1 && chgflag,
 
             if (fflush (pf))
                 adios (cp, "write error on");
             fseek (pf, 0L, SEEK_SET);
            switch (incerr = scan (pf, msgnum, 0, nfs, width,
                              msgnum == mp->hghmsg + 1 && chgflag,
-                             1, NULL, stop - start, noisy, &scanl)) {
+                             1, NULL, pc.written, noisy, &scanl)) {
            case SCNEOF:
                printf ("%*d  empty\n", DMAXFOLDER, msgnum);
                break;
            case SCNEOF:
                printf ("%*d  empty\n", DMAXFOLDER, msgnum);
                break;
@@ -640,13 +644,13 @@ main (int argc, char **argv)
             free (cp);
 
            if (trnflag && pop_dele (i) == NOTOK)
             free (cp);
 
            if (trnflag && pop_dele (i) == NOTOK)
-               adios (NULL, "%s", response);
+               die("%s", response);
 
            scan_finished();
        }
 
        if (pop_quit () == NOTOK)
 
            scan_finished();
        }
 
        if (pop_quit () == NOTOK)
-           adios (NULL, "%s", response);
+           die("%s", response);
 
     } else if (inc_type == INC_FILE && Maildir == NULL) {
         /* Mail from a spool file. */
 
     } else if (inc_type == INC_FILE && Maildir == NULL) {
         /* Mail from a spool file. */
@@ -745,7 +749,7 @@ main (int argc, char **argv)
            fseek (pf, 0L, SEEK_SET);
            switch (incerr = scan (pf, msgnum, 0, nfs, width,
                              msgnum == mp->hghmsg + 1 && chgflag,
            fseek (pf, 0L, SEEK_SET);
            switch (incerr = scan (pf, msgnum, 0, nfs, width,
                              msgnum == mp->hghmsg + 1 && chgflag,
-                             1, NULL, stop - start, noisy, &scanl)) {
+                             1, NULL, 0, noisy, &scanl)) {
            case SCNEOF:
                printf ("%*d  empty\n", DMAXFOLDER, msgnum);
                break;
            case SCNEOF:
                printf ("%*d  empty\n", DMAXFOLDER, msgnum);
                break;
@@ -806,7 +810,7 @@ main (int argc, char **argv)
        } else {
            fclose (in); in = NULL;
        }
        } else {
            fclose (in); in = NULL;
        }
-       adios (NULL, "failed");
+       die("failed");
     }
 
     if (aud)
     }
 
     if (aud)
@@ -904,7 +908,7 @@ skip:
 static void NORETURN
 inc_done (int status)
 {
 static void NORETURN
 inc_done (int status)
 {
-    done = exit;
+    set_done(exit);
     if (locked)
     {
         GETGROUPPRIVS();
     if (locked)
     {
         GETGROUPPRIVS();
@@ -915,9 +919,16 @@ inc_done (int status)
 }
 
 static int
 }
 
 static int
-pop_action (char *s)
+pop_action(void *closure, char *s)
 {
 {
-    fprintf (pf, "%s\n", s);
-    stop += strlen (s) + 1;
-    return 0;  /* Is return value used?  This was missing before 1999-07-15. */
+    pop_closure *pc;
+    int n;
+
+    pc = closure;
+    n = fprintf(pc->mailout, "%s\n", s);
+    if (n < 0)
+        return NOTOK;
+    pc->written += n; /* Count linefeed too. */
+
+    return OK;
 }
 }