X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/8bd6112f573f6b9e8cc9b93d01a594748a2ef8fb..ddf3a8574f657dcb8c53fc5908e7bebbde1994b5:/uip/inc.c?ds=sidebyside diff --git a/uip/inc.c b/uip/inc.c index e07f4caa..c34d28ae 100644 --- a/uip/inc.c +++ b/uip/inc.c @@ -31,6 +31,15 @@ #endif #include "h/mh.h" +#include "sbr/fmt_new.h" +#include "sbr/dtime.h" +#include "scansbr.h" +#include "sbr/m_name.h" +#include "sbr/m_gmprot.h" +#include "sbr/getarguments.h" +#include "sbr/concat.h" +#include "sbr/seq_setunseen.h" +#include "sbr/seq_setcur.h" #include "sbr/seq_save.h" #include "sbr/smatch.h" #include "sbr/getfolder.h" @@ -49,9 +58,8 @@ #include "h/utils.h" #include #include "h/dropsbr.h" -#include "h/popsbr.h" +#include "popsbr.h" #include "h/fmt_scan.h" -#include "h/scansbr.h" #include "h/signals.h" #include "h/tws.h" #include "h/mts.h" @@ -88,6 +96,7 @@ X("sasl", 0, SASLSW) \ X("nosasl", 0, NOSASLSW) \ X("saslmech", 0, SASLMECHSW) \ + X("tls", TLSminc(-3), TLSSW) \ X("initialtls", TLSminc(-10), INITTLSSW) \ X("notls", TLSminc(-5), NOTLSSW) \ X("certverify", TLSminc(-10), CERTVERSW) \ @@ -197,7 +206,8 @@ main (int argc, char **argv) int width = -1; int hghnum = 0, msgnum = 0; FILE *pf = NULL; - bool sasl, tls, noverify; + bool sasl, noverify; + int tls = 0; 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; @@ -209,6 +219,7 @@ main (int argc, char **argv) FILE *aud = NULL; char b[PATH_MAX + 1]; char *maildir_copy = NULL; /* copy of mail directory because the static gets overwritten */ + charstring_t scanl = NULL; int nmsgs, nbytes; char *MAILHOST_env_variable; @@ -242,7 +253,7 @@ main (int argc, char **argv) if (pophost && *pophost) host = pophost; - sasl = tls = false; + sasl = false; chgflag = noisy = noverify = true; while ((cp = *argp++)) { if (*cp == '-') { @@ -359,12 +370,16 @@ main (int argc, char **argv) die("missing argument to %s", argp[-2]); continue; + case TLSSW: + tls = 1; + continue; + case INITTLSSW: - tls = true; + tls = 2; continue; case NOTLSSW: - tls = false; + tls = 0; continue; case CERTVERSW: @@ -425,8 +440,10 @@ main (int argc, char **argv) } } - if (tls) - tlsflag |= P_INITTLS; + if (tls == 1) + tlsflag = P_STARTTLS; + else if (tls == 2) + tlsflag = P_INITTLS; if (noverify) tlsflag |= P_NOVERIFY; @@ -460,55 +477,55 @@ main (int argc, char **argv) } if (stat (newmail, &s1) == NOTOK || s1.st_size == 0) die("no mail to incorporate"); - if (s1.st_mode & S_IFDIR) { - DIR *md; - struct dirent *de; - struct stat ms; - int i; - i = 0; - cp = concat (newmail, "/new", NULL); - if ((md = opendir(cp)) == NULL) - 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) - 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); - if (stat(Maildir[i].filename, &ms) != 0) - adios (Maildir[i].filename, "couldn't get delivery time"); - Maildir[i].mtime = ms.st_mtime; - i++; - } - free (cp); - closedir (md); - cp = concat (newmail, "/cur", NULL); - if ((md = opendir(cp)) == NULL) - 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) - 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); - if (stat(Maildir[i].filename, &ms) != 0) - adios (Maildir[i].filename, "couldn't get delivery time"); - Maildir[i].mtime = ms.st_mtime; - i++; - } - free (cp); - closedir (md); - if (i == 0) - die("no mail to incorporate"); - num_maildir_entries = i; - qsort (Maildir, num_maildir_entries, sizeof(*Maildir), maildir_srt); - } + if (s1.st_mode & S_IFDIR) { + DIR *md; + struct dirent *de; + struct stat ms; + int i; + i = 0; + cp = concat (newmail, "/new", NULL); + if ((md = opendir(cp)) == NULL) + 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) + 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); + if (stat(Maildir[i].filename, &ms) != 0) + adios (Maildir[i].filename, "couldn't get delivery time"); + Maildir[i].mtime = ms.st_mtime; + i++; + } + free (cp); + closedir (md); + cp = concat (newmail, "/cur", NULL); + if ((md = opendir(cp)) == NULL) + 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) + 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); + if (stat(Maildir[i].filename, &ms) != 0) + adios (Maildir[i].filename, "couldn't get delivery time"); + Maildir[i].mtime = ms.st_mtime; + i++; + } + free (cp); + closedir (md); + if (i == 0) + die("no mail to incorporate"); + num_maildir_entries = i; + qsort (Maildir, num_maildir_entries, sizeof(*Maildir), maildir_srt); + } cp = mh_xstrdup(newmail); newmail = cp; @@ -579,7 +596,7 @@ main (int argc, char **argv) fprintf (aud, "<> %s -ms %s\n", dtimenow(0), from); else { if (host) - fprintf (aud, "<> %s -host %s -user %s\n", dtimenow(0), + fprintf (aud, "<> %s -host %s -user %s\n", dtimenow(0), host, user); else fprintf (aud, "<> %s\n", dtimenow (0)); @@ -605,7 +622,6 @@ main (int argc, char **argv) hghnum = msgnum = mp->hghmsg; for (i = 1; i <= nmsgs; i++) { - charstring_t scanl = NULL; msgnum++; cp = mh_xstrdup(m_name (msgnum)); @@ -639,7 +655,6 @@ main (int argc, char **argv) break; case SCNMSG: - case SCNENC: default: if (aud) fputs (charstring_buffer (scanl), aud); @@ -647,7 +662,9 @@ main (int argc, char **argv) fflush (stdout); break; } - charstring_free (scanl); + + if (scanl) + charstring_clear (scanl); if (ferror(pf) || fclose (pf)) { int e = errno; @@ -664,6 +681,9 @@ main (int argc, char **argv) scan_finished(); } + charstring_free (scanl); + scanl = NULL; + if (pop_quit () == NOTOK) die("%s", response); @@ -673,8 +693,6 @@ main (int argc, char **argv) scan_detect_mbox_style (in); /* the MAGIC invocation... */ hghnum = msgnum = mp->hghmsg; for (;;) { - charstring_t scanl = NULL; - /* create scanline for new message */ switch (incerr = scan (in, msgnum + 1, msgnum + 1, nfs, width, msgnum == hghnum && chgflag, 1, NULL, 0L, noisy, @@ -698,7 +716,6 @@ main (int argc, char **argv) break; case SCNMSG: - case SCNENC: /* * Run the external program hook on the message. */ @@ -711,16 +728,18 @@ main (int argc, char **argv) if (noisy) fflush (stdout); + charstring_clear (scanl); msgnum++; continue; } - charstring_free (scanl); /* If we get here there was some sort of error from scan(), * so stop processing anything more from the spool. */ break; } + charstring_free (scanl); + scanl = NULL; } else { /* Mail from Maildir. */ @@ -730,8 +749,6 @@ main (int argc, char **argv) hghnum = msgnum = mp->hghmsg; for (i = 0; i < num_maildir_entries; i++) { - charstring_t scanl = NULL; - msgnum++; sp = Maildir[i].filename; @@ -742,7 +759,7 @@ main (int argc, char **argv) size_t nrd; if ((sf = fopen (sp, "r")) == NULL) - adios (sp, "unable to read for copy"); + adios (sp, "unable to read for copy"); if ((pf = fopen (cp, "w+")) == NULL) adios (cp, "unable to write for copy"); while ((nrd = fread(buf, 1, sizeof(buf), sf)) > 0) @@ -780,7 +797,6 @@ main (int argc, char **argv) break; case SCNMSG: - case SCNENC: default: /* * Run the external program hook on the message. @@ -795,7 +811,7 @@ main (int argc, char **argv) fflush (stdout); break; } - charstring_free (scanl); + charstring_clear (scanl); if (ferror(pf) || fclose (pf)) { int e = errno; @@ -813,6 +829,8 @@ main (int argc, char **argv) scan_finished(); } free (Maildir); /* From now on Maildir is just a flag - don't dref! */ + charstring_free (scanl); + scanl = NULL; } scan_finished (); @@ -856,7 +874,7 @@ main (int argc, char **argv) if (msgnum == hghnum) { inform("no messages incorporated, continuing..."); } else { - /* + /* * Lock the sequence file now, and loop to set the right flags * in the folder structure */