X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Finc.c;h=f461dd86745a92c117390b40ca1f80bd5165a25a;hp=3ea3b9ef51f687f2d5b3e407c91ed58e05a37c84;hb=56f52a606b02d40fdc92b9012c7835679163cd5c;hpb=8f4c5da8971926f7eccc912f7998c343aef3c33b diff --git a/uip/inc.c b/uip/inc.c index 3ea3b9e..f461dd8 100644 --- a/uip/inc.c +++ b/uip/inc.c @@ -2,7 +2,9 @@ /* * inc.c -- incorporate messages from a maildrop into a folder * - * $Id$ + * This code is Copyright (c) 2002, by the authors of nmh. See the + * COPYRIGHT file in the root directory of the nmh distribution for + * complete copyright information. */ #ifdef MAILGROUP @@ -25,6 +27,7 @@ #endif #include +#include #include #ifdef POP @@ -32,15 +35,11 @@ # include #endif -#ifdef HESIOD -# include -#endif - #include #include #include #include -#include +#include #include #include @@ -50,24 +49,6 @@ # define POPminc(a) 0 #endif -#ifndef RPOP -# define RPOPminc(a) (a) -#else -# define RPOPminc(a) 0 -#endif - -#ifndef APOP -# define APOPminc(a) (a) -#else -# define APOPminc(a) 0 -#endif - -#ifndef KPOP -# define KPOPminc(a) (a) -#else -# define KPOPminc(a) 0 -#endif - #ifndef CYRUS_SASL # define SASLminc(a) (a) #else @@ -97,41 +78,33 @@ static struct swit switches[] = { { "pack file", POPminc (-4) }, #define NPACKSW 10 { "nopack", POPminc (-6) }, -#define APOPSW 11 - { "apop", APOPminc (-4) }, -#define NAPOPSW 12 - { "noapop", APOPminc (-6) }, -#define RPOPSW 13 - { "rpop", RPOPminc (-4) }, -#define NRPOPSW 14 - { "norpop", RPOPminc (-6) }, -#define SILSW 15 +#define PORTSW 11 + { "port name/number", POPminc (-4) }, +#define SILSW 12 { "silent", 0 }, -#define NSILSW 16 +#define NSILSW 13 { "nosilent", 0 }, -#define TRNCSW 17 +#define TRNCSW 14 { "truncate", 0 }, -#define NTRNCSW 18 +#define NTRNCSW 15 { "notruncate", 0 }, -#define WIDTHSW 19 +#define WIDTHSW 16 { "width columns", 0 }, -#define VERSIONSW 20 +#define VERSIONSW 17 { "version", 0 }, -#define HELPSW 21 +#define HELPSW 18 { "help", 0 }, -#define SNOOPSW 22 +#define SNOOPSW 19 { "snoop", -5 }, -#define KPOPSW 23 - { "kpop", KPOPminc (-4) }, -#define SASLSW 24 +#define SASLSW 20 { "sasl", SASLminc(-4) }, -#define SASLMECHSW 25 +#define SASLMECHSW 21 { "saslmech", SASLminc(-8) }, +#define PROXYSW 22 + { "proxy command", POPminc(-5) }, { NULL, 0 } }; -extern int errno; - /* * flags for the mail source */ @@ -202,12 +175,6 @@ if (geteuid() != 0) DROPGROUPPRIVS() #define SAVEGROUPPRIVS() #endif /* not MAILGROUP */ -#ifdef POP -#define DROPUSERPRIVS() setuid(getuid()) -#else -#define DROPUSERPRIVS() -#endif - /* these variables have to be globals so that done() can correctly clean up the lockfile */ static int locked = 0; static char *newmail; @@ -218,8 +185,8 @@ static FILE *in; */ char *map_name(char *); +static void inc_done(int) NORETURN; #ifdef POP -int done(int); static int pop_action(char *); static int pop_pack(char *); static int map_count(void); @@ -231,16 +198,18 @@ main (int argc, char **argv) { int chgflag = 1, trnflag = 1; int noisy = 1, width = 0; - int rpop, i, hghnum, msgnum; - int kpop = 0, sasl = 0; - char *cp, *maildir, *folder = NULL; + int i, hghnum = 0, msgnum = 0; + int sasl = 0; + char *cp, *maildir = NULL, *folder = NULL; char *format = NULL, *form = NULL; - char *host = NULL, *user = NULL; + char *host = NULL, *port = NULL, *user = NULL, *proxy = NULL; char *audfile = NULL, *from = NULL, *saslmech = NULL; char buf[BUFSIZ], **argp, *nfs, **arguments; - struct msgs *mp; + struct msgs *mp = NULL; struct stat st, s1; FILE *aud = NULL; + char b[MAXPATHLEN + 1]; + char *maildir_copy = NULL; /* copy of mail directory because the static gets overwritten */ #ifdef POP int nmsgs, nbytes, p = 0; @@ -252,9 +221,7 @@ main (int argc, char **argv) FILE *mhe = NULL; #endif -#ifdef HESIOD - struct hes_postoffice *po; -#endif + done=inc_done; /* absolutely the first thing we do is save our privileges, * and drop them if we can. @@ -284,11 +251,6 @@ main (int argc, char **argv) */ if ((MAILHOST_env_variable = getenv("MAILHOST")) != NULL) pophost = MAILHOST_env_variable; -# ifdef HESIOD - else if ((po = hes_getmailhost(getusername())) != NULL && - strcmp(po->po_type, "POP") == 0) - pophost = po->po_host; -# endif /* HESIOD */ /* * If there is a valid "pophost" entry in mts.conf, * then use it as the default host. @@ -300,8 +262,6 @@ main (int argc, char **argv) snoop++; #endif /* POP */ - rpop = 0; - while ((cp = *argp++)) { if (*cp == '-') { switch (smatch (++cp, switches)) { @@ -390,6 +350,12 @@ main (int argc, char **argv) if (!(host = *argp++) || *host == '-') adios (NULL, "missing argument to %s", argp[-2]); continue; + + case PORTSW: + if (!(host = *argp++) || *port == '-') + adios (NULL, "missing argument to %s", argp[-2]); + continue; + case USERSW: if (!(user = *argp++) || *user == '-') adios (NULL, "missing argument to %s", argp[-2]); @@ -410,24 +376,6 @@ main (int argc, char **argv) #endif /* POP */ continue; - case APOPSW: - rpop = -1; - continue; - case NAPOPSW: - rpop = 0; - continue; - - case RPOPSW: - rpop = 1; - continue; - case NRPOPSW: - rpop = 0; - continue; - - case KPOPSW: - kpop = 1; - continue; - case SNOOPSW: snoop++; continue; @@ -440,13 +388,17 @@ main (int argc, char **argv) if (!(saslmech = *argp++) || *saslmech == '-') adios (NULL, "missing argument to %s", argp[-2]); continue; + case PROXYSW: + if (!(proxy = *argp++) || *proxy == '-') + adios (NULL, "missing argument to %s", argp[-2]); + continue; } } if (*cp == '+' || *cp == '@') { if (folder) adios (NULL, "only one folder at a time!"); else - folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF); + folder = pluspath (cp); } else { adios (NULL, "usage: %s [+folder] [switches]", invo_name); } @@ -458,8 +410,6 @@ main (int argc, char **argv) #ifdef POP if (host && !*host) host = NULL; - if (from || !host || rpop <= 0) - DROPUSERPRIVS(); #endif /* POP */ /* guarantee dropping group priveleges; we might not have done so earlier */ @@ -485,10 +435,7 @@ main (int argc, char **argv) if (inc_type == INC_POP) { if (user == NULL) user = getusername (); - if ( strcmp( POPSERVICE, "kpop" ) == 0 ) { - kpop = 1; - } - if (kpop || sasl || ( rpop > 0)) + if (sasl) pass = getusername (); else ruserpass (host, &user, &pass); @@ -496,16 +443,14 @@ main (int argc, char **argv) /* * initialize POP connection */ - if (pop_init (host, user, pass, snoop, kpop ? 1 : rpop, kpop, - sasl, saslmech) == NOTOK) + if (pop_init (host, port, user, pass, proxy, snoop, sasl, + saslmech) == NOTOK) adios (NULL, "%s", response); /* Check if there are any messages */ if (pop_stat (&nmsgs, &nbytes) == NOTOK) adios (NULL, "%s", response); - if (rpop > 0) - DROPUSERPRIVS(); if (nmsgs == 0) { pop_quit(); adios (NULL, "no mail to incorporate"); @@ -530,6 +475,11 @@ main (int argc, char **argv) } if (stat (newmail, &s1) == NOTOK || s1.st_size == 0) adios (NULL, "no mail to incorporate"); + + if ((cp = strdup(newmail)) == (char *)0) + adios (NULL, "error allocating memory to copy newmail"); + + newmail = cp; } #ifdef POP @@ -544,15 +494,17 @@ main (int argc, char **argv) folder = getfolder (0); maildir = m_maildir (folder); - if (stat (maildir, &st) == NOTOK) { - if (errno != ENOENT) - adios (maildir, "error on folder"); - cp = concat ("Create folder \"", maildir, "\"? ", NULL); - if (noisy && !getanswer (cp)) - done (1); - free (cp); - if (!makedir (maildir)) - adios (NULL, "unable to create folder %s", maildir); + if ((maildir_copy = strdup(maildir)) == (char *)0) + adios (maildir, "error allocating memory to copy maildir"); + + if (!folder_exists(maildir)) { + /* If the folder doesn't exist, and we're given the -silent flag, + * just fail. + */ + if (noisy) + create_folder(maildir, 0, done); + else + done (1); } if (chdir (maildir) == NOTOK) @@ -602,10 +554,9 @@ go_to_it: #ifdef POP fprintf (aud, from ? "<> %s -ms %s\n" - : host ? "<> %s -host %s -user %s%s\n" + : host ? "<> %s -host %s -user %s\n" : "<> %s\n", - dtimenow (0), from ? from : host, user, - rpop < 0 ? " -apop" : rpop > 0 ? " -rpop" : ""); + dtimenow (0), from ? from : host, user); #else /* POP */ fprintf (aud, from ? "<> %s -ms %s\n" : "<> %s\n", dtimenow (0), from); @@ -798,7 +749,6 @@ go_to_it: /* link message into folder */ newmsg = folder_addmsg(mp, tmpfilenam); #endif - /* create scanline for new message */ switch (i = scan (in, msgnum + 1, msgnum + 1, nfs, width, msgnum == hghnum && chgflag, 1, NULL, 0L, noisy)) { @@ -822,6 +772,13 @@ go_to_it: case SCNMSG: case SCNENC: + /* + * 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); + if (aud) fputs (scanl, aud); #ifdef MHE @@ -833,6 +790,9 @@ go_to_it: msgnum++; mp->hghmsg++; + mp->nummsg++; + if (mp->lowmsg == 0) mp->lowmsg = 1; + clear_msg_flags (mp, msgnum); set_exists (mp, msgnum); set_unseen (mp, msgnum); @@ -923,7 +883,8 @@ go_to_it: seq_setunseen (mp, 0); /* set the Unseen-Sequence */ seq_save (mp); /* synchronize sequences */ context_save (); /* save the context file */ - return done (0); + done (0); + return 1; } @@ -960,8 +921,8 @@ cpymsg (FILE *in, FILE *out) #endif /* if 0 */ -int -done (int status) +static void +inc_done (int status) { #ifdef POP if (packfile && pd != NOTOK) @@ -974,7 +935,6 @@ done (int status) DROPGROUPPRIVS(); } exit (status); - return 1; /* dead code to satisfy the compiler */ } #ifdef POP