X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/8e0f9bd3daae9d05dec58026d5a5924367e4e874..04ee0c3f6ad7e4177cc43a0c57f046013a4fbac9:/uip/inc.c diff --git a/uip/inc.c b/uip/inc.c index a47b3367..da3eb96d 100644 --- a/uip/inc.c +++ b/uip/inc.c @@ -1,6 +1,4 @@ - -/* - * inc.c -- incorporate messages from a maildrop into a folder +/* inc.c -- incorporate messages from a maildrop into a folder * * This code is Copyright (c) 2002, by the authors of nmh. See the * COPYRIGHT file in the root directory of the nmh distribution for @@ -32,21 +30,29 @@ */ #endif -#include -#include +#include "h/mh.h" +#include "sbr/path.h" +#include "sbr/print_version.h" +#include "sbr/print_help.h" +#include "sbr/error.h" +#include "h/utils.h" #include -#include -#include -#include -#include -#include -#include -#include - -#ifndef CYRUS_SASL -# define SASLminc(a) (a) +#include "h/dropsbr.h" +#include "h/popsbr.h" +#include "h/fmt_scan.h" +#include "h/scansbr.h" +#include "h/signals.h" +#include "h/tws.h" +#include "h/mts.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) #else -# define SASLminc(a) 0 +# define TLSminc(a) 0 #endif #define INC_SWITCHES \ @@ -59,8 +65,6 @@ X("format string", 5, FMTSW) \ X("host hostname", 0, HOSTSW) \ X("user username", 0, USERSW) \ - X("pack file", 0, PACKSW) \ - X("nopack", 0, NPACKSW) \ X("port name/number", 0, PORTSW) \ X("silent", 0, SILSW) \ X("nosilent", 0, NSILSW) \ @@ -69,11 +73,15 @@ X("width columns", 0, WIDTHSW) \ X("version", 0, VERSIONSW) \ X("help", 0, HELPSW) \ - X("snoop", -5, SNOOPSW) \ - X("sasl", SASLminc(-4), SASLSW) \ - X("nosasl", SASLminc(-6), NOSASLSW) \ - X("saslmech", SASLminc(-8), SASLMECHSW) \ - X("authservice", SASLminc(-11), AUTHSERVICESW) \ + X("snoop", 0, SNOOPSW) \ + X("sasl", 0, SASLSW) \ + X("nosasl", 0, NOSASLSW) \ + X("saslmech", 0, SASLMECHSW) \ + X("initialtls", TLSminc(-10), INITTLSSW) \ + X("notls", TLSminc(-5), NOTLSSW) \ + X("certverify", TLSminc(-10), CERTVERSW) \ + X("nocertverify", TLSminc(-12), NOCERTVERSW) \ + X("authservice", 0, AUTHSERVICESW) \ X("proxy command", 0, PROXYSW) \ #define X(sw, minchars, id) id, @@ -90,27 +98,19 @@ DEFINE_SWITCH_ARRAY(INC, switches); #define INC_FILE 0 #define INC_POP 1 -static int inc_type; static struct Maildir_entry { char *filename; time_t mtime; } *Maildir = NULL; static int num_maildir_entries = 0; -static int snoop = 0; - -extern char response[]; - -static int size; -static long pos; +static bool snoop; -static int mbx_style = MMDF_FORMAT; -static int pd = NOTOK; +typedef struct { + FILE *mailout; + long written; +} pop_closure; -static long start; -static long stop; - -static char *packfile = NULL; -static FILE *pf = NULL; +extern char response[]; /* This is an attempt to simplify things by putting all the * privilege ops into macros. @@ -154,39 +154,39 @@ static gid_t return_gid; #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 */ -char *map_name(char *); - +static int maildir_srt(const void *va, const void *vb) PURE; static void inc_done(int) NORETURN; -static int pop_action(char *); -static int pop_pack(char *); -static int map_count(void); +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; if (a->mtime > b->mtime) return 1; - else if (a->mtime < b->mtime) + if (a->mtime < b->mtime) return -1; - else - return 0; + return 0; } int main (int argc, char **argv) { - int chgflag = 1, trnflag = 1; - int noisy = 1, width = -1; + static int inc_type; + bool chgflag; + int trnflag = 1; + bool noisy; + int width = -1; int hghnum = 0, msgnum = 0; - int sasl = 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; char *format = NULL, *form = NULL; @@ -201,7 +201,7 @@ main (int argc, char **argv) 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. @@ -209,9 +209,9 @@ main (int argc, char **argv) SAVEGROUPPRIVS(); TRYDROPGROUPPRIVS(); - if (nmh_init(argv[0], 1)) { return 1; } + if (nmh_init(argv[0], true, true)) { return 1; } - mts_init (invo_name); + mts_init (); arguments = getarguments (invo_name, argc, argv, 1); argp = arguments; @@ -231,16 +231,18 @@ main (int argc, char **argv) if (pophost && *pophost) host = pophost; + sasl = tls = false; + chgflag = noisy = noverify = true; while ((cp = *argp++)) { if (*cp == '-') { switch (smatch (++cp, switches)) { - case AMBIGSW: + case AMBIGSW: ambigsw (cp, switches); done (1); - case UNKWNSW: - adios (NULL, "-%s unknown", cp); + case UNKWNSW: + die("-%s unknown", cp); - case HELPSW: + case HELPSW: snprintf (buf, sizeof(buf), "%s [+folder] [switches]", invo_name); print_help (buf, switches, 1); done (0); @@ -248,20 +250,20 @@ main (int argc, char **argv) print_version(invo_name); done (0); - case AUDSW: + 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: + case NAUDSW: audfile = NULL; continue; - case CHGSW: - chgflag++; + case CHGSW: + chgflag = true; continue; - case NCHGSW: - chgflag = 0; + case NCHGSW: + chgflag = false; continue; /* @@ -271,16 +273,16 @@ main (int argc, char **argv) * 1 by default (truncating is default) * 0 if -notruncate is given */ - case TRNCSW: + case TRNCSW: trnflag = 2; continue; - case NTRNCSW: + case NTRNCSW: trnflag = 0; continue; - case FILESW: + 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); /* @@ -291,91 +293,98 @@ main (int argc, char **argv) trnflag = 0; continue; - case SILSW: - noisy = 0; + case SILSW: + noisy = false; continue; - case NSILSW: - noisy++; + case NSILSW: + noisy = true; continue; - case FORMSW: + 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: + 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: + 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 == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); 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 == '-') - adios (NULL, "missing argument to %s", argp[-2]); - continue; - - case PACKSW: - if (!(packfile = *argp++) || *packfile == '-') - adios (NULL, "missing argument to %s", argp[-2]); - continue; - case NPACKSW: - packfile = NULL; + die("missing argument to %s", argp[-2]); continue; case SNOOPSW: - snoop++; + snoop = true; continue; case SASLSW: - sasl++; + sasl = true; continue; case NOSASLSW: - sasl = 0; + sasl = false; continue; case SASLMECHSW: if (!(saslmech = *argp++) || *saslmech == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); + continue; + + case INITTLSSW: + tls = true; + continue; + + case NOTLSSW: + tls = false; + continue; + + case CERTVERSW: + noverify = false; + continue; + + case NOCERTVERSW: + noverify = true; continue; 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 - adios (NULL, "not built with OAuth support"); + die("not built with OAuth support"); #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) - adios (NULL, "only one folder at a time!"); - else - folder = pluspath (cp); + die("only one folder at a time!"); + folder = pluspath (cp); } else { - adios (NULL, "usage: %s [+folder] [switches]", invo_name); + die("usage: %s [+folder] [switches]", invo_name); } } @@ -385,61 +394,50 @@ main (int argc, char **argv) if (host && !*host) host = NULL; - /* guarantee dropping group priveleges; we might not have done so earlier */ + /* guarantee dropping group privileges; we might not have done so earlier */ DROPGROUPPRIVS(); - /* - * Where are we getting the new mail? - */ - if (from) - inc_type = INC_FILE; - else if (host) - inc_type = INC_POP; - else - inc_type = INC_FILE; + /* Source of mail; -from overrides any -host. */ + inc_type = host && !from ? INC_POP : INC_FILE; - /* - * Are we getting the mail from - * a POP server? - */ if (inc_type == INC_POP) { - struct nmh_creds creds = { 0, 0, 0 }; + /* Mail from a POP server. */ + int tlsflag = 0; if (auth_svc == NULL) { if (saslmech && ! strcasecmp(saslmech, "xoauth2")) { - adios (NULL, "must specify -authservice with -saslmech xoauth2"); + die("must specify -authservice with -saslmech xoauth2"); } - nmh_get_credentials (host, user, sasl, &creds); } else { if (user == NULL) { - adios (NULL, "must specify -user with -saslmech xoauth2"); + die("must specify -user with -saslmech xoauth2"); } - creds.user = user; } + if (tls) + tlsflag |= P_INITTLS; + + if (noverify) + tlsflag |= P_NOVERIFY; + /* * initialize POP connection */ - if (pop_init (host, port, creds.user, creds.password, proxy, snoop, - sasl, saslmech, auth_svc) == NOTOK) - adios (NULL, "%s", response); + if (pop_init (host, port, user, proxy, snoop, sasl, saslmech, + tlsflag, auth_svc) == NOTOK) + die("%s", response); /* Check if there are any messages */ if (pop_stat (&nmsgs, &nbytes) == NOTOK) - adios (NULL, "%s", response); + die("%s", response); if (nmsgs == 0) { pop_quit(); - adios (NULL, "no mail to incorporate"); + die("no mail to incorporate"); } - } - - /* - * We will get the mail from a file - * (typically the standard maildrop) - */ - if (inc_type == INC_FILE) { + } else if (inc_type == INC_FILE) { + /* Mail from a spool file, or Maildir. */ if (from) newmail = from; else if ((newmail = getenv ("MAILDROP")) && *newmail) @@ -450,7 +448,7 @@ main (int argc, char **argv) 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; @@ -459,13 +457,13 @@ main (int argc, char **argv) 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) - 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); @@ -478,13 +476,13 @@ main (int argc, char **argv) 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) - 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); @@ -496,29 +494,21 @@ main (int argc, char **argv) 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); } - if ((cp = strdup(newmail)) == (char *)0) - adios (NULL, "error allocating memory to copy newmail"); - + cp = mh_xstrdup(newmail); newmail = cp; } - /* skip the folder setup */ - if ((inc_type == INC_POP) && packfile) - goto go_to_it; - if (!context_find ("path")) free (path ("./", TFOLDER)); if (!folder) folder = getfolder (0); maildir = m_maildir (folder); - - if ((maildir_copy = strdup(maildir)) == (char *)0) - adios (maildir, "error allocating memory to copy maildir"); + maildir_copy = mh_xstrdup(maildir); if (!folder_exists(maildir)) { /* If the folder doesn't exist, and we're given the -silent flag, @@ -535,13 +525,13 @@ main (int argc, char **argv) /* read folder and create message structure */ if (!(mp = folder_read (folder, 0))) - adios (NULL, "unable to read folder %s", folder); - -go_to_it: + 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) { - locked++; + locked = true; if (trnflag) { SIGNAL (SIGHUP, SIG_IGN); SIGNAL (SIGINT, SIG_IGN); @@ -553,7 +543,7 @@ go_to_it: 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; @@ -568,10 +558,10 @@ go_to_it: if (audfile) { int i; if ((i = stat (audfile, &st)) == NOTOK) - advise (NULL, "Creating Receive-Audit: %s", audfile); + 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) @@ -598,82 +588,48 @@ go_to_it: * Get the mail from a POP server */ if (inc_type == INC_POP) { + /* Mail from a POP server. */ int i; - if (packfile) { - packfile = path (packfile, TFILE); - if (stat (packfile, &st) == NOTOK) { - if (errno != ENOENT) - adios (packfile, "error on file"); - cp = concat ("Create file \"", packfile, "\"? ", NULL); - if (noisy && !getanswer (cp)) - done (1); - free (cp); - } - msgnum = map_count (); - if ((pd = mbx_open (packfile, mbx_style, getuid(), getgid(), m_gmprot())) - == NOTOK) - adios (packfile, "unable to open"); - if ((pf = fdopen (pd, "w+")) == NULL) - adios (NULL, "unable to fdopen %s", packfile); - } else { - hghnum = msgnum = mp->hghmsg; - } + pop_closure pc; + hghnum = msgnum = mp->hghmsg; for (i = 1; i <= nmsgs; i++) { charstring_t scanl = NULL; msgnum++; - if (packfile) { - fseek (pf, 0L, SEEK_CUR); - pos = ftell (pf); - size = 0; - if (fwrite (mmdlm1, 1, strlen (mmdlm1), pf) < strlen (mmdlm1)) { - advise (mmdlm1, "fwrite"); - } - start = ftell (pf); - - if (pop_retr (i, pop_pack) == NOTOK) - adios (NULL, "%s", response); - - fseek (pf, 0L, SEEK_CUR); - stop = ftell (pf); - if (fflush (pf)) - adios (packfile, "write error on"); - fseek (pf, start, SEEK_SET); - } else { - cp = getcpy (m_name (msgnum)); - 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); - - if (fflush (pf)) - adios (cp, "write error on"); - fseek (pf, 0L, SEEK_SET); - } + cp = mh_xstrdup(m_name (msgnum)); + if ((pf = fopen (cp, "w+")) == NULL) + adios (cp, "unable to write"); + chmod (cp, m_gmprot ()); + + 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, - packfile ? 0 : msgnum == mp->hghmsg + 1 && chgflag, - 1, NULL, stop - start, noisy, &scanl)) { - case SCNEOF: + msgnum == mp->hghmsg + 1 && chgflag, + 1, NULL, pc.written, noisy, &scanl)) { + case SCNEOF: printf ("%*d empty\n", DMAXFOLDER, msgnum); break; case SCNFAT: trnflag = 0; - noisy++; + noisy = true; /* advise (cp, "unable to read"); already advised */ - /* fall thru */ + break; case SCNERR: - case SCNNUM: + case SCNNUM: break; - case SCNMSG: + case SCNMSG: case SCNENC: - default: + default: if (aud) fputs (charstring_buffer (scanl), aud); if (noisy) @@ -682,47 +638,27 @@ go_to_it: } charstring_free (scanl); - if (packfile) { - fseek (pf, stop, SEEK_SET); - if (fwrite (mmdlm2, 1, strlen (mmdlm2), pf) < strlen (mmdlm1)) { - advise (mmdlm2, "fwrite"); - } - if (fflush (pf) || ferror (pf)) { - int e = errno; - pop_quit (); - errno = e; - adios (packfile, "write error on"); - } - map_write (packfile, pd, 0, 0L, start, stop, pos, size, noisy); - } else { - if (ferror(pf) || fclose (pf)) { - int e = errno; - (void) m_unlink (cp); - pop_quit (); - errno = e; - adios (cp, "write error on"); - } - free (cp); - } + if (ferror(pf) || fclose (pf)) { + int e = errno; + (void) m_unlink (cp); + pop_quit (); + errno = e; + adios (cp, "write error on"); + } + free (cp); if (trnflag && pop_dele (i) == NOTOK) - adios (NULL, "%s", response); + die("%s", response); scan_finished(); } if (pop_quit () == NOTOK) - adios (NULL, "%s", response); - if (packfile) { - mbx_close (packfile, pd); - pd = NOTOK; - } - } + die("%s", response); + + } else if (inc_type == INC_FILE && Maildir == NULL) { + /* Mail from a spool file. */ - /* - * Get the mail from file (usually mail spool) - */ - if (inc_type == INC_FILE && Maildir == NULL) { scan_detect_mbox_style (in); /* the MAGIC invocation... */ hghnum = msgnum = mp->hghmsg; for (;;) { @@ -733,21 +669,21 @@ go_to_it: msgnum == hghnum && chgflag, 1, NULL, 0L, noisy, &scanl)) { case SCNFAT: - case SCNEOF: + case SCNEOF: break; case SCNERR: if (aud) fputs ("inc aborted!\n", aud); - advise (NULL, "aborted!"); /* doesn't clean up locks! */ + inform("aborted!"); /* doesn't clean up locks! */ break; - case SCNNUM: - advise (NULL, "BUG in %s, number out of range", invo_name); + case SCNNUM: + inform("BUG in %s, number out of range", invo_name); break; - default: - advise (NULL, "BUG in %s, scan() botch (%d)", invo_name, incerr); + default: + inform("BUG in %s, scan() botch (%d)", invo_name, incerr); break; case SCNMSG: @@ -757,7 +693,7 @@ go_to_it: */ (void)snprintf(b, sizeof (b), "%s/%d", maildir_copy, msgnum + 1); - (void)ext_hook("add-hook", b, (char *)0); + (void)ext_hook("add-hook", b, NULL); if (aud) fputs (charstring_buffer (scanl), aud); @@ -774,7 +710,9 @@ go_to_it: */ break; } - } else if (inc_type == INC_FILE) { /* Maildir inbox to process */ + + } else { + /* Mail from Maildir. */ char *sp; FILE *sf; int i; @@ -786,7 +724,7 @@ go_to_it: msgnum++; sp = Maildir[i].filename; - cp = getcpy (m_name (msgnum)); + cp = mh_xstrdup(m_name (msgnum)); pf = NULL; if (!trnflag || link(sp, cp) == -1) { static char buf[65536]; @@ -807,7 +745,7 @@ go_to_it: } fclose (sf); sf = NULL; - } + } if (pf == NULL && (pf = fopen (cp, "r")) == NULL) adios (cp, "not available"); chmod (cp, m_gmprot ()); @@ -815,30 +753,30 @@ go_to_it: fseek (pf, 0L, SEEK_SET); switch (incerr = scan (pf, msgnum, 0, nfs, width, msgnum == mp->hghmsg + 1 && chgflag, - 1, NULL, stop - start, noisy, &scanl)) { - case SCNEOF: + 1, NULL, 0, noisy, &scanl)) { + case SCNEOF: printf ("%*d empty\n", DMAXFOLDER, msgnum); break; case SCNFAT: trnflag = 0; - noisy++; + noisy = true; /* advise (cp, "unable to read"); already advised */ - /* fall thru */ + break; case SCNERR: - case SCNNUM: + case SCNNUM: break; - case SCNMSG: + case SCNMSG: case SCNENC: - default: + default: /* * Run the external program hook on the message. */ (void)snprintf(b, sizeof (b), "%s/%d", maildir_copy, msgnum + 1); - (void)ext_hook("add-hook", b, (char *)0); + (void)ext_hook("add-hook", b, NULL); if (aud) fputs (charstring_buffer (scanl), aud); @@ -876,7 +814,7 @@ go_to_it: } else { fclose (in); in = NULL; } - adios (NULL, "failed"); + die("failed"); } if (aud) @@ -885,23 +823,18 @@ go_to_it: if (noisy) fflush (stdout); - if ((inc_type == INC_POP) && packfile) - done (0); - - /* - * truncate file we are incorporating from - */ if (inc_type == INC_FILE && Maildir == NULL) { + /* Mail from a spool file; truncate it. */ + if (trnflag) { if (stat (newmail, &st) != NOTOK && s1.st_mtime != st.st_mtime) - advise (NULL, "new messages have arrived!\007"); + inform("new messages have arrived!\007"); else { int newfd; if ((newfd = creat (newmail, 0600)) != NOTOK) close (newfd); else admonish (newmail, "error zero'ing"); - (void) m_unlink(map_name(newmail)); } } else { if (noisy) @@ -910,7 +843,7 @@ go_to_it: } if (msgnum == hghnum) { - admonish (NULL, "no messages incorporated"); + inform("no messages incorporated, continuing..."); } else { /* * Lock the sequence file now, and loop to set the right flags @@ -923,7 +856,7 @@ go_to_it: context_replace (pfolder, folder); /* update current folder */ if ((mp2 = folder_read(folder, 1)) == NULL) { - admonish(NULL, "Unable to reread folder %s", folder); + inform("Unable to reread folder %s, continuing...", folder); goto skip; } @@ -933,7 +866,7 @@ go_to_it: if (msgnum >= mp2->hghoff && !(mp2 = folder_realloc (mp2, mp2->lowoff, msgnum + 1))) { - advise (NULL, "unable to reallocate folder storage"); + inform("unable to reallocate folder storage"); goto skip; } @@ -956,12 +889,11 @@ go_to_it: seq_save(mp2); /* Save the sequence file */ folder_free(mp2); } -skip: - /* - * unlock the mail spool - */ +skip: if (inc_type == INC_FILE && Maildir == NULL) { + /* Mail from a spool file; unlock it. */ + if (locked) { GETGROUPPRIVS(); /* Be sure we can unlock mail file */ (void) lkfclosespool (in, newmail); in = NULL; @@ -977,12 +909,10 @@ skip: } -static void +static void NORETURN inc_done (int status) { - done = exit; - if (packfile && pd != NOTOK) - mbx_close (packfile, pd); + set_done(exit); if (locked) { GETGROUPPRIVS(); @@ -993,45 +923,16 @@ inc_done (int status) } 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; -static int -pop_pack (char *s) -{ - int j; - char buffer[BUFSIZ]; - - snprintf (buffer, sizeof(buffer), "%s\n", s); - for ( ; (j = stringdex (mmdlm1, buffer)) >= 0; buffer[j]++) - continue; - for ( ; (j = stringdex (mmdlm2, buffer)) >= 0; buffer[j]++) - continue; - fputs (buffer, pf); - size += strlen (buffer) + 1; - return 0; /* Is return value used? This was missing before 1999-07-15. */ -} + pc = closure; + n = fprintf(pc->mailout, "%s\n", s); + if (n < 0) + return NOTOK; + pc->written += n; /* Count linefeed too. */ -static int -map_count (void) -{ - int md; - char *cp; - struct drop d; - struct stat st; - - if (stat (packfile, &st) == NOTOK) - return 0; - if ((md = open (cp = map_name (packfile), O_RDONLY)) == NOTOK - || map_chk (cp, md, &d, (long) st.st_size, 1)) { - if (md != NOTOK) - close (md); - return 0; - } - close (md); - return (d.d_id); + return OK; }