X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/aec3da7124a644558ae111ecf068f5f39a3216b3..ec173fd2c:/uip/inc.c?ds=inline diff --git a/uip/inc.c b/uip/inc.c index 85a6396a..dc49337d 100644 --- a/uip/inc.c +++ b/uip/inc.c @@ -30,19 +30,43 @@ */ #endif -#include -#include +#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" +#include "sbr/ext_hook.h" +#include "sbr/folder_read.h" +#include "sbr/folder_realloc.h" +#include "sbr/folder_free.h" +#include "sbr/context_save.h" +#include "sbr/context_replace.h" +#include "sbr/context_find.h" +#include "sbr/ambigsw.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 -#include "../sbr/lock_file.h" -#include "../sbr/m_maildir.h" -#include "../sbr/m_mktemp.h" +#include "h/dropsbr.h" +#include "popsbr.h" +#include "h/fmt_scan.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) @@ -72,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) \ @@ -98,7 +123,7 @@ static struct Maildir_entry { time_t mtime; } *Maildir = NULL; static int num_maildir_entries = 0; -static int snoop = 0; +static bool snoop; typedef struct { FILE *mailout; @@ -156,7 +181,7 @@ static FILE *in; /* * prototypes */ -static int maildir_srt(const void *va, const void *vb); +static int maildir_srt(const void *va, const void *vb) PURE; static void inc_done(int) NORETURN; static int pop_action(void *closure, char *); @@ -181,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; @@ -193,10 +219,11 @@ 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; - done=inc_done; + set_done(inc_done); /* absolutely the first thing we do is save our privileges, * and drop them if we can. @@ -204,7 +231,7 @@ 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 (); arguments = getarguments (invo_name, argc, argv, 1); @@ -235,7 +262,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 [+folder] [switches]", invo_name); @@ -247,8 +274,8 @@ main (int argc, char **argv) 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; @@ -277,7 +304,7 @@ main (int argc, char **argv) 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); /* @@ -297,38 +324,38 @@ main (int argc, char **argv) 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 == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); 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 == '-') - 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]); + die("missing argument to %s", argp[-2]); continue; case SNOOPSW: - snoop++; + snoop = true; continue; case SASLSW: @@ -340,15 +367,19 @@ main (int argc, char **argv) case SASLMECHSW: if (!(saslmech = *argp++) || *saslmech == '-') - adios (NULL, "missing argument to %s", argp[-2]); + 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: @@ -362,24 +393,24 @@ main (int argc, char **argv) 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!"); + 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); } } @@ -401,16 +432,18 @@ main (int argc, char **argv) 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) { - adios (NULL, "must specify -user with -saslmech xoauth2"); + die("must specify -user with -saslmech xoauth2"); } } - if (tls) - tlsflag |= P_INITTLS; + if (tls == 1) + tlsflag = P_STARTTLS; + else if (tls == 2) + tlsflag = P_INITTLS; if (noverify) tlsflag |= P_NOVERIFY; @@ -420,15 +453,15 @@ main (int argc, char **argv) */ 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) - adios (NULL, "%s", response); + die("%s", response); if (nmsgs == 0) { pop_quit(); - adios (NULL, "no mail to incorporate"); + die("no mail to incorporate"); } } else if (inc_type == INC_FILE) { @@ -443,7 +476,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; @@ -452,13 +485,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); @@ -471,13 +504,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); @@ -489,7 +522,7 @@ 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); } @@ -520,7 +553,7 @@ 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); + die("unable to read folder %s", folder); if (inc_type == INC_FILE && Maildir == NULL) { /* Mail from a spool file. */ @@ -538,7 +571,7 @@ main (int argc, char **argv) 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; @@ -589,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)); @@ -600,7 +632,7 @@ main (int argc, char **argv) pc.written = 0; pc.mailout = pf; if (pop_retr(i, pop_action, &pc) == NOTOK) - adios (NULL, "%s", response); + die("%s", response); if (fflush (pf)) adios (cp, "write error on"); @@ -631,7 +663,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; @@ -643,13 +677,16 @@ main (int argc, char **argv) free (cp); if (trnflag && pop_dele (i) == NOTOK) - adios (NULL, "%s", response); + die("%s", response); scan_finished(); } + charstring_free (scanl); + scanl = NULL; + if (pop_quit () == NOTOK) - adios (NULL, "%s", response); + die("%s", response); } else if (inc_type == INC_FILE && Maildir == NULL) { /* Mail from a spool file. */ @@ -657,8 +694,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, @@ -695,16 +730,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. */ @@ -714,8 +751,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; @@ -779,7 +814,7 @@ main (int argc, char **argv) fflush (stdout); break; } - charstring_free (scanl); + charstring_clear (scanl); if (ferror(pf) || fclose (pf)) { int e = errno; @@ -797,6 +832,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 (); @@ -809,7 +846,7 @@ main (int argc, char **argv) } else { fclose (in); in = NULL; } - adios (NULL, "failed"); + die("failed"); } if (aud) @@ -907,7 +944,7 @@ skip: static void NORETURN inc_done (int status) { - done = exit; + set_done(exit); if (locked) { GETGROUPPRIVS();