X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=uip%2Finc.c;h=7c91c2597218bcf7b98e7b86d5f03bcc8f585893;hb=ab7b48411962d26439f92f35ed084d3d6275459c;hp=4903e21856486e4410dcd7069be33fd1c5bc986c;hpb=99e5043db7ee6cf80f93708610a6e584a8068c6a;p=mmh diff --git a/uip/inc.c b/uip/inc.c index 4903e21..7c91c25 100644 --- a/uip/inc.c +++ b/uip/inc.c @@ -2,8 +2,6 @@ /* * 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. @@ -29,17 +27,9 @@ #endif #include +#include #include -#ifdef POP -# include -# include -#endif - -#ifdef HESIOD -# include -#endif - #include #include #include @@ -48,36 +38,6 @@ #include #include -#ifndef POP -# define POPminc(a) (a) -#else -# 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 -# define SASLminc(a) 0 -#endif - static struct swit switches[] = { #define AUDSW 0 { "audit audit-file", 0 }, @@ -93,78 +53,26 @@ static struct swit switches[] = { { "form formatfile", 0 }, #define FMTSW 6 { "format string", 5 }, -#define HOSTSW 7 - { "host hostname", POPminc (-4) }, -#define USERSW 8 - { "user username", POPminc (-4) }, -#define PACKSW 9 - { "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 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 - { "snoop", -5 }, -#define KPOPSW 23 - { "kpop", KPOPminc (-4) }, -#define SASLSW 24 - { "sasl", SASLminc(-4) }, -#define SASLMECHSW 25 - { "saslmech", SASLminc(-8) }, -#define PROXYSW 26 - { "proxy command", POPminc(-5) }, - { NULL, 0 } }; -/* - * flags for the mail source - */ -#define INC_FILE 0 -#define INC_POP 1 - -static int inc_type; -static int snoop = 0; - -#ifdef POP -extern char response[]; - -static char *packfile = NULL; -static int size; -static long pos; -static long start; -static long stop; - -static int mbx_style = MMDF_FORMAT; -static int pd = NOTOK; -static FILE *pf = NULL; -#endif /* POP */ - /* This is an attempt to simplify things by putting all the * privilege ops into macros. * *GROUPPRIVS() is related to handling the setgid MAIL property, * and only applies if MAILGROUP is defined. - * *USERPRIVS() is related to handling the setuid root property, - * and only applies if POP is defined [why does POP => setuid root?] * Basically, SAVEGROUPPRIVS() is called right at the top of main() * to initialise things, and then DROPGROUPPRIVS() and GETGROUPPRIVS() * do the obvious thing. TRYDROPGROUPPRIVS() has to be safe to call @@ -186,15 +94,10 @@ static FILE *pf = NULL; */ #ifdef MAILGROUP static int return_gid; -#ifndef POP /* easy case; we're not setuid root, so can drop group privs * immediately. */ #define TRYDROPGROUPPRIVS() DROPGROUPPRIVS() -#else /* POP ie we are setuid root */ -#define TRYDROPGROUPPRIVS() \ -if (geteuid() != 0) DROPGROUPPRIVS() -#endif #define DROPGROUPPRIVS() setgid(getgid()) #define GETGROUPPRIVS() setgid(return_gid) #define SAVEGROUPPRIVS() return_gid = getegid() @@ -206,12 +109,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; @@ -222,12 +119,7 @@ static FILE *in; */ char *map_name(char *); -#ifdef POP -int done(int); -static int pop_action(char *); -static int pop_pack(char *); -static int map_count(void); -#endif +static void inc_done(int) NORETURN; int @@ -235,32 +127,23 @@ 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 hghnum = 0, msgnum = 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; - char *host = NULL, *user = NULL, *proxy = NULL; - char *audfile = NULL, *from = NULL, *saslmech = NULL; + char *audfile = NULL, *from = 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; /* copy of mail directory because the static gets overwritten */ - -#ifdef POP - int nmsgs, nbytes, p = 0; - char *pass = NULL; - char *MAILHOST_env_variable; -#endif + char b[MAXPATHLEN + 1]; + char *maildir_copy = NULL; /* copy of mail directory because the static gets overwritten */ #ifdef MHE 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. @@ -280,34 +163,6 @@ main (int argc, char **argv) arguments = getarguments (invo_name, argc, argv, 1); argp = arguments; -#ifdef POP - /* - * Scheme is: - * use MAILHOST environment variable if present, - * else try Hesiod. - * If that fails, use the default (if any) - * provided by mts.conf in mts_init() - */ - 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. - */ - if (pophost && *pophost) - host = pophost; - - if ((cp = getenv ("MHPOPDEBUG")) && *cp) - snoop++; -#endif /* POP */ - - rpop = 0; - while ((cp = *argp++)) { if (*cp == '-') { switch (smatch (++cp, switches)) { @@ -391,72 +246,13 @@ main (int argc, char **argv) adios (NULL, "missing argument to %s", argp[-2]); width = atoi (cp); continue; - - case HOSTSW: - if (!(host = *argp++) || *host == '-') - adios (NULL, "missing argument to %s", argp[-2]); - continue; - case USERSW: - if (!(user = *argp++) || *user == '-') - adios (NULL, "missing argument to %s", argp[-2]); - continue; - - case PACKSW: -#ifndef POP - if (!(cp = *argp++) || *cp == '-') - adios (NULL, "missing argument to %s", argp[-2]); -#else /* POP */ - if (!(packfile = *argp++) || *packfile == '-') - adios (NULL, "missing argument to %s", argp[-2]); -#endif /* POP */ - continue; - case NPACKSW: -#ifdef POP - packfile = NULL; -#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; - - case SASLSW: - sasl++; - continue; - - case SASLMECHSW: - 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); } @@ -465,93 +261,29 @@ main (int argc, char **argv) /* NOTE: above this point you should use TRYDROPGROUPPRIVS(), * not DROPGROUPPRIVS(). */ -#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 */ DROPGROUPPRIVS(); /* - * Where are we getting the new mail? - */ - if (from) - inc_type = INC_FILE; -#ifdef POP - else if (host) - inc_type = INC_POP; -#endif - else - inc_type = INC_FILE; - -#ifdef POP - /* - * Are we getting the mail from - * a POP server? - */ - if (inc_type == INC_POP) { - if (user == NULL) - user = getusername (); - if ( strcmp( POPSERVICE, "kpop" ) == 0 ) { - kpop = 1; - } - if (kpop || sasl || ( rpop > 0)) - pass = getusername (); - else - ruserpass (host, &user, &pass); - - /* - * initialize POP connection - */ - if (pop_init (host, user, pass, proxy, snoop, kpop ? 1 : rpop, kpop, - 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"); - } - } -#endif /* POP */ - - /* * We will get the mail from a file * (typically the standard maildrop) */ - - if (inc_type == INC_FILE) { - if (from) - newmail = from; - else if ((newmail = getenv ("MAILDROP")) && *newmail) - newmail = m_mailpath (newmail); - else if ((newmail = context_find ("maildrop")) && *newmail) - newmail = m_mailpath (newmail); - else { - newmail = concat (MAILDIR, "/", MAILFIL, NULL); - } - if (stat (newmail, &s1) == NOTOK || s1.st_size == 0) - adios (NULL, "no mail to incorporate"); - - if ((cp = strdup(newmail)) == (char *)0) - adios (maildir, "error allocating memory to copy newmail"); - - newmail = cp; + if (from) + newmail = from; + else if ((newmail = getenv ("MAILDROP")) && *newmail) + newmail = m_mailpath (newmail); + else if ((newmail = context_find ("maildrop")) && *newmail) + newmail = m_mailpath (newmail); + else { + newmail = concat (MAILDIR, "/", MAILFIL, NULL); } + 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"); -#ifdef POP - /* skip the folder setup */ - if ((inc_type == INC_POP) && packfile) - goto go_to_it; -#endif /* POP */ + newmail = cp; if (!context_find ("path")) free (path ("./", TFOLDER)); @@ -562,15 +294,14 @@ main (int argc, char **argv) if ((maildir_copy = strdup(maildir)) == (char *)0) adios (maildir, "error allocating memory to copy maildir"); - 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 (!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) @@ -580,37 +311,32 @@ main (int argc, char **argv) if (!(mp = folder_read (folder))) adios (NULL, "unable to read folder %s", folder); -#ifdef POP -go_to_it: -#endif /* POP */ - - if (inc_type == INC_FILE) { - if (access (newmail, W_OK) != NOTOK) { - locked++; - if (trnflag) { - SIGNAL (SIGHUP, SIG_IGN); - SIGNAL (SIGINT, SIG_IGN); - SIGNAL (SIGQUIT, SIG_IGN); - SIGNAL (SIGTERM, SIG_IGN); - } + if (access (newmail, W_OK) != NOTOK) { + locked++; + if (trnflag) { + SIGNAL (SIGHUP, SIG_IGN); + SIGNAL (SIGINT, SIG_IGN); + SIGNAL (SIGQUIT, SIG_IGN); + SIGNAL (SIGTERM, SIG_IGN); + } - GETGROUPPRIVS(); /* Reset gid to lock mail file */ - in = lkfopen (newmail, "r"); - DROPGROUPPRIVS(); - if (in == NULL) - adios (NULL, "unable to lock and fopen %s", newmail); - fstat (fileno(in), &s1); - } else { - trnflag = 0; - if ((in = fopen (newmail, "r")) == NULL) - adios (newmail, "unable to read"); - } + GETGROUPPRIVS(); /* Reset gid to lock mail file */ + in = lkfopen (newmail, "r"); + DROPGROUPPRIVS(); + if (in == NULL) + adios (NULL, "unable to lock and fopen %s", newmail); + fstat (fileno(in), &s1); + } else { + trnflag = 0; + if ((in = fopen (newmail, "r")) == NULL) + adios (newmail, "unable to read"); } /* This shouldn't be necessary but it can't hurt. */ DROPGROUPPRIVS(); if (audfile) { + int i; if ((i = stat (audfile, &st)) == NOTOK) advise (NULL, "Creating Receive-Audit: %s", audfile); if ((aud = fopen (audfile, "a")) == NULL) @@ -618,20 +344,13 @@ go_to_it: else if (i == NOTOK) chmod (audfile, m_gmprot ()); -#ifdef POP - fprintf (aud, from ? "<> %s -ms %s\n" - : host ? "<> %s -host %s -user %s%s\n" - : "<> %s\n", - dtimenow (0), from ? from : host, user, - rpop < 0 ? " -apop" : rpop > 0 ? " -rpop" : ""); -#else /* POP */ fprintf (aud, from ? "<> %s -ms %s\n" : "<> %s\n", dtimenow (0), from); -#endif /* POP */ } #ifdef MHE if (context_find ("mhe")) { + int i; cp = concat (maildir, "/++", NULL); i = stat (cp, &st); if ((mhe = fopen (cp, "a")) == NULL) @@ -651,230 +370,79 @@ go_to_it: fflush (stdout); } -#ifdef POP - /* - * Get the mail from a POP server - */ - if (inc_type == INC_POP) { - 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; - /* - * Check if we have enough message space for all the new - * messages. If not, then realloc the folder and add enough - * space for all new messages plus 10 additional slots. - */ - if (mp->hghmsg + nmsgs >= mp->hghoff - && !(mp = folder_realloc (mp, mp->lowoff, mp->hghmsg + nmsgs + 10))) - adios (NULL, "unable to allocate folder storage"); - } - - for (i = 1; i <= nmsgs; i++) { - msgnum++; - if (packfile) { - fseek (pf, 0L, SEEK_CUR); - pos = ftell (pf); - size = 0; - fwrite (mmdlm1, 1, strlen (mmdlm1), pf); - 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); - } - switch (p = scan (pf, msgnum, 0, nfs, width, - packfile ? 0 : msgnum == mp->hghmsg + 1 && chgflag, - 1, NULL, stop - start, noisy)) { - case SCNEOF: - printf ("%*d empty\n", DMAXFOLDER, msgnum); - break; - - case SCNFAT: - trnflag = 0; - noisy++; - /* advise (cp, "unable to read"); already advised */ - /* fall thru */ - - case SCNERR: - case SCNNUM: - break; - - case SCNMSG: - case SCNENC: - default: - if (aud) - fputs (scanl, aud); -# ifdef MHE - if (mhe) - fputs (scanl, mhe); -# endif /* MHE */ - if (noisy) - fflush (stdout); - if (!packfile) { - clear_msg_flags (mp, msgnum); - set_exists (mp, msgnum); - set_unseen (mp, msgnum); - mp->msgflags |= SEQMOD; - } - break; - } - if (packfile) { - fseek (pf, stop, SEEK_SET); - fwrite (mmdlm2, 1, strlen (mmdlm2), pf); - 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; - unlink (cp); - pop_quit (); - errno = e; - adios (cp, "write error on"); - } - free (cp); - } - - if (trnflag && pop_dele (i) == NOTOK) - adios (NULL, "%s", response); - } - - if (pop_quit () == NOTOK) - adios (NULL, "%s", response); - if (packfile) { - mbx_close (packfile, pd); - pd = NOTOK; - } - } -#endif /* POP */ - /* * Get the mail from file (usually mail spool) */ - if (inc_type == INC_FILE) { - m_unknown (in); /* the MAGIC invocation... */ - hghnum = msgnum = mp->hghmsg; - for (i = 0;;) { - /* - * Check if we need to allocate more space for message status. - * If so, then add space for an additional 100 messages. - */ - if (msgnum >= mp->hghoff - && !(mp = folder_realloc (mp, mp->lowoff, mp->hghoff + 100))) { - advise (NULL, "unable to allocate folder storage"); - i = NOTOK; - break; - } - -#if 0 - /* copy file from spool to tmp file */ - tmpfilenam = m_scratch ("", invo_name); - if ((fd = creat (tmpfilenam, m_gmprot ())) == NOTOK) - adios (tmpfilenam, "unable to create"); - chmod (tmpfilenam, m_gmprot ()); - if (!(in2 = fdopen (fd, "r+"))) - adios (tmpfilenam, "unable to access"); - cpymsg (in, in2); - - /* 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)) { - case SCNFAT: - case SCNEOF: - break; - - case SCNERR: - if (aud) - fputs ("inc aborted!\n", aud); - advise (NULL, "aborted!"); /* doesn't clean up locks! */ - break; - - case SCNNUM: - advise (NULL, "BUG in %s, number out of range", invo_name); - break; - - default: - advise (NULL, "BUG in %s, scan() botch (%d)", invo_name, i); - break; - - 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); + m_unknown (in); /* the MAGIC invocation... */ + hghnum = msgnum = mp->hghmsg; + for (;;) { + /* + * Check if we need to allocate more space for message status. + * If so, then add space for an additional 100 messages. + */ + if (msgnum >= mp->hghoff + && !(mp = folder_realloc (mp, mp->lowoff, mp->hghoff + 100))) { + advise (NULL, "unable to allocate folder storage"); + incerr = NOTOK; + break; + } + + /* create scanline for new message */ + switch (incerr = scan (in, msgnum + 1, msgnum + 1, nfs, width, + msgnum == hghnum && chgflag, 1, NULL, 0L, noisy)) { + case SCNFAT: + case SCNEOF: + break; + + case SCNERR: + if (aud) + fputs ("inc aborted!\n", aud); + advise (NULL, "aborted!"); /* doesn't clean up locks! */ + break; + + case SCNNUM: + advise (NULL, "BUG in %s, number out of range", invo_name); + break; + + default: + advise (NULL, "BUG in %s, scan() botch (%d)", invo_name, incerr); + break; + + 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 - if (mhe) - fputs (scanl, mhe); + if (mhe) + fputs (scanl, mhe); #endif /* MHE */ - if (noisy) - fflush (stdout); - - 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); - mp->msgflags |= SEQMOD; - continue; - } - break; - } + if (noisy) + fflush (stdout); + 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); + mp->msgflags |= SEQMOD; + continue; + } + /* If we get here there was some sort of error from scan(), + * so stop processing anything more from the spool. + */ + break; } -#ifdef POP - if (p < 0) { /* error */ -#else - if (i < 0) { /* error */ -#endif + if (incerr < 0) { /* error */ if (locked) { GETGROUPPRIVS(); /* Be sure we can unlock mail file */ (void) lkfclose (in, newmail); in = NULL; @@ -896,29 +464,23 @@ go_to_it: if (noisy) fflush (stdout); -#ifdef POP - if ((inc_type == INC_POP) && packfile) - done (0); -#endif /* POP */ - /* * truncate file we are incorporating from */ - if (inc_type == INC_FILE) { - if (trnflag) { - if (stat (newmail, &st) != NOTOK && s1.st_mtime != st.st_mtime) - advise (NULL, "new messages have arrived!\007"); - else { - if ((i = creat (newmail, 0600)) != NOTOK) - close (i); - else - admonish (newmail, "error zero'ing"); - unlink(map_name(newmail)); - } - } else { - if (noisy) - printf ("%s not zero'd\n", newmail); - } + if (trnflag) { + if (stat (newmail, &st) != NOTOK && s1.st_mtime != st.st_mtime) + advise (NULL, "new messages have arrived!\007"); + else { + int newfd; + if ((newfd = creat (newmail, 0600)) != NOTOK) + close (newfd); + else + admonish (newmail, "error zero'ing"); + unlink(map_name(newmail)); + } + } else { + if (noisy) + printf ("%s not zero'd\n", newmail); } if (msgnum == hghnum) { @@ -937,63 +499,24 @@ go_to_it: /* * unlock the mail spool */ - if (inc_type == INC_FILE) { - if (locked) { - GETGROUPPRIVS(); /* Be sure we can unlock mail file */ - (void) lkfclose (in, newmail); in = NULL; - DROPGROUPPRIVS(); /* And then return us to normal privileges */ - } else { - fclose (in); in = NULL; - } + if (locked) { + GETGROUPPRIVS(); /* Be sure we can unlock mail file */ + (void) lkfclose (in, newmail); in = NULL; + DROPGROUPPRIVS(); /* And then return us to normal privileges */ + } else { + fclose (in); in = NULL; } seq_setunseen (mp, 0); /* set the Unseen-Sequence */ seq_save (mp); /* synchronize sequences */ context_save (); /* save the context file */ - return done (0); -} - - -#if 0 - -/* - * Copy message message from spool into - * temporary file. Massage the "From " line - * while copying. - */ - -cpymsg (FILE *in, FILE *out) -{ - int state; - char *tmpbuf, name[NAMESZ]; - - for (;;) { - state = m_getfld (state, name, tmpbuf, rlwidth, in); - switch (state) { - case FLD: - case FLDPLUS: - break; - case BODY: - break; - case LENERR: - case FMTERR: - break; - case FILEEOF: - break; - default: - } - } + done (0); + return 1; } -#endif /* if 0 */ - -int -done (int status) +static void +inc_done (int status) { -#ifdef POP - if (packfile && pd != NOTOK) - mbx_close (packfile, pd); -#endif /* POP */ if (locked) { GETGROUPPRIVS(); @@ -1001,51 +524,4 @@ done (int status) DROPGROUPPRIVS(); } exit (status); - return 1; /* dead code to satisfy the compiler */ -} - -#ifdef POP -static int -pop_action (char *s) -{ - fprintf (pf, "%s\n", s); - stop += strlen (s) + 1; - return 0; /* Is return value used? This was missing before 1999-07-15. */ -} - -static int -pop_pack (char *s) -{ - int j; - char buffer[BUFSIZ]; - - snprintf (buffer, sizeof(buffer), "%s\n", s); - for (j = 0; (j = stringdex (mmdlm1, buffer)) >= 0; buffer[j]++) - continue; - for (j = 0; (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. */ -} - -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); } -#endif /* POP */