|
|
Initial revision
/* inc.c - incorporate messages from a maildrop into a folder */
#include "../h/mh.h"
#include "../h/formatsbr.h"
#include "../h/scansbr.h"
#include "../zotnet/tws.h"
#include <stdio.h>
#include "../zotnet/mts.h"
#include <errno.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
/* */
static struct swit switches[] = {
#define AUDSW 0
"audit audit-file", 0,
#define NAUDSW 1
"noaudit", 0,
#define CHGSW 2
"changecur", 0,
#define NCHGSW 3
"nochangecur", 0,
#define DECRSW 4
"decrypt",
-7,
#define NDECRSW 5
"nodecrypt",
-9,
#define MSW 6
"file name", 0,
#define FORMSW 7
"form formatfile", 0,
#define FMTSW 8
"format string", 5,
#define HOSTSW 9
"host host",
-4,
#define USERSW 10
"user user",
-4,
#define PACKSW 11
"pack file",
-4,
#define NPACKSW 12
"nopack",
-6,
#define RPOPSW 13
"rpop",
#ifndef RPOP
-4,
#else RPOP
0,
#endif RPOP
#define NRPOPSW 14
"norpop",
#ifndef RPOP
-6,
#else RPOP
0,
#endif RPOP
#define SILSW 15
"silent", 0,
#define NSILSW 16
"nosilent", 0,
#define TRNCSW 17
"truncate", 0,
#define NTRNCSW 18
"notruncate", 0,
#define UUCPSW 19
"uucp",
#ifndef MF
-4,
#else MF
0,
#endif MF
#define NUUCPSW 20
"nouucp",
#ifndef MF
-6,
#else MF
0,
#endif MF
#define WIDSW 21
"width columns", 0,
#define HELPSW 22
"help", 4,
NULL, NULL
};
/* */
extern int errno;
extern struct msgs *fmt_current_folder;
/* * /
/* ARGSUSED */
main(argc, argv)
int argc;
char *argv[];
{
int chgflag = 1,
trnflag = 1,
decflag = 1,
noisy = 1,
width = 0,
uucp = 1,
locked = 0,
rpop = 1,
i,
hghnum,
msgnum;
char *cp,
*maildir,
*folder = NULL,
*form = NULL,
*format = NULL,
*audfile = NULL,
*from = NULL,
*host = NULL,
*user = NULL,
*newmail,
buf[100],
**ap,
**argp,
*nfs,
*arguments[MAXARGS];
struct msgs *mp;
struct stat st,
s1;
FILE *in, *aud = NULL;
#ifdef MHE
FILE *mhe = NULL;
#endif MHE
invo_name = r1bindex (argv[0], '/');
mts_init (invo_name);
if ((cp = m_find (invo_name)) != NULL) {
ap = brkstring (cp = getcpy (cp), " ", "\n");
ap = copyip (ap, arguments);
}
else
ap = arguments;
(void) copyip (argv + 1, ap);
argp = arguments;
/* */
while (cp = *argp++) {
if (*cp == '-')
switch (smatch (++cp, switches)) {
case AMBIGSW:
ambigsw (cp, switches);
done (1);
case UNKWNSW:
adios (NULLCP, "-%s unknown", cp);
case HELPSW:
(void) sprintf (buf, "%s [+folder] [switches]", invo_name);
help (buf, switches);
done (1);
case AUDSW:
if (!(cp = *argp++) || *cp == '-')
adios (NULLCP, "missing argument to %s", argp[-2]);
audfile = getcpy (m_maildir (cp));
continue;
case NAUDSW:
audfile = NULL;
continue;
case CHGSW:
chgflag++;
continue;
case NCHGSW:
chgflag = 0;
continue;
case TRNCSW:
trnflag++;
continue;
case MSW:
if (!(cp = *argp++) || *cp == '-')
adios (NULLCP, "missing argument to %s", argp[-2]);
from = path (cp, TFILE);/* fall */
case NTRNCSW:
trnflag = 0;
continue;
case SILSW:
noisy = 0;
continue;
case NSILSW:
noisy++;
continue;
case FORMSW:
if (!(form = *argp++) || *form == '-')
adios (NULLCP, "missing argument to %s", argp[-2]);
format = NULL;
continue;
case FMTSW:
if (!(format = *argp++) || *format == '-')
adios (NULLCP, "missing argument to %s", argp[-2]);
form = NULL;
continue;
case WIDSW:
if (!(cp = *argp++) || *cp == '-')
adios (NULLCP, "missing argument to %s", argp[-2]);
width = atoi (cp);
continue;
case DECRSW:
decflag++;
continue;
case NDECRSW:
decflag = 0;
continue;
case UUCPSW:
uucp++;
continue;
case NUUCPSW:
uucp = 0;
continue;
case HOSTSW:
if (!(host = *argp++) || *host == '-')
adios (NULLCP, "missing argument to %s", argp[-2]);
continue;
case USERSW:
if (!(user = *argp++) || *user == '-')
adios (NULLCP, "missing argument to %s", argp[-2]);
continue;
case PACKSW:
if (!(cp = *argp++) || *cp == '-')
adios (NULLCP, "missing argument to %s", argp[-2]);
continue;
case NPACKSW:
continue;
case RPOPSW:
rpop++;
continue;
case NRPOPSW:
rpop = 0;
continue;
}
if (*cp == '+' || *cp == '@') {
if (folder)
adios (NULLCP, "only one folder at a time!");
else
folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF);
}
else
adios (NULLCP, "usage: %s [+folder] [switches]", invo_name);
}
/* */
if (from) {
newmail = from;
if (stat (newmail, &s1) == NOTOK || s1.st_size == 0)
adios (NULLCP, "no mail to incorporate");
}
else {
if (((newmail = getenv ("MAILDROP")) && *newmail)
|| ((newmail = m_find ("maildrop")) && *newmail))
newmail = m_mailpath (newmail);
else {
newmail = concat (MAILDIR, "/", MAILFIL, NULLCP);
}
if (stat (newmail, &s1) == NOTOK || s1.st_size == 0)
adios (NULLCP, "no mail to incorporate");
}
if (!m_find ("path"))
free (path ("./", TFOLDER));
if (!folder)
folder = defalt;
maildir = m_maildir (folder);
if (stat (maildir, &st) == NOTOK) {
if (errno != ENOENT)
adios (maildir, "error on folder");
cp = concat ("Create folder \"", maildir, "\"? ", NULLCP);
if (noisy && !getanswer (cp))
done (1);
free (cp);
if (!makedir (maildir))
adios (NULLCP, "unable to create folder %s", maildir);
}
if (chdir (maildir) == NOTOK)
adios (maildir, "unable to change directory to");
if (!(mp = m_gmsg (folder)))
adios (NULLCP, "unable to read folder %s", folder);
if (access (newmail, 02) == NOTOK) {
trnflag = 0;
if ((in = fopen (newmail, "r")) == NULL)
adios (newmail, "unable to read");
}
else {
locked++;
if (trnflag) {
(void) signal (SIGHUP, SIG_IGN);
(void) signal (SIGINT, SIG_IGN);
(void) signal (SIGQUIT, SIG_IGN);
(void) signal (SIGTERM, SIG_IGN);
}
if ((in = lkfopen (newmail, "r")) == NULL)
adios (NULLCP, "unable to lock and fopen %s", newmail);
(void) fstat (fileno(in), &s1);
}
if (audfile) {
if ((i = stat (audfile, &st)) == NOTOK)
advise (NULLCP, "Creating Receive-Audit: %s", audfile);
if ((aud = fopen (audfile, "a")) == NULL)
adios (audfile, "unable to append to");
else
if (i == NOTOK)
(void) chmod (audfile, m_gmprot ());
fprintf (aud, from ? "<<inc>> %s -ms %s\n" : "<<inc>> %s\n",
dtimenow (), from);
}
#ifdef MHE
if (m_find ("mhe")) {
cp = concat (maildir, "/++", NULLCP);
i = stat (cp, &st);
if ((mhe = fopen (cp, "a")) == NULL)
admonish (cp, "unable to append to");
else
if (i == NOTOK)
(void) chmod (cp, m_gmprot ());
free (cp);
}
#endif MHE
nfs = new_fs (form, format, FORMAT);
if (noisy) {
printf ("Incorporating new mail into %s...\n\n", folder);
(void) fflush (stdout);
}
/* */
fmt_current_folder = mp;
m_unknown (in); /* the MAGIC invocation... */
hghnum = msgnum = mp -> hghmsg;
for (;;) {
if (msgnum >= mp -> hghoff) {
if ((mp = m_remsg (mp, 0, mp -> hghoff + MAXFOLDER)) == NULL)
adios (NULLCP, "unable to allocate folder storage");
fmt_current_folder = mp;
}
mp->msgstats[msgnum+1] = 0;
switch (i = scan(in, msgnum + 1, msgnum + 1, nfs, width,
msgnum == hghnum && chgflag, 0, 0L, noisy, aud)) {
case SCNEOF:
break;
case SCNERR:
if (aud)
fputs ("inc aborted!\n", aud);
adios (NULLCP, "aborted!");
case SCNNUM:
adios (NULLCP, "more than %d messages in folder %s, %s not zero'd",
MAXFOLDER, folder, newmail);
default:
adios (NULLCP, "scan() botch (%d)", i);
case SCNMSG:
case SCNENC:
#ifdef MHE
if (mhe)
fputs (scanl, mhe);
#endif MHE
if (noisy)
(void) fflush (stdout);
++msgnum; ++mp->hghmsg;
mp -> msgstats[msgnum] |= (EXISTS|UNSEEN);
mp -> msgflags |= SEQMOD;
continue;
}
break;
}
if (aud)
(void) fclose (aud);
#ifdef MHE
if (mhe)
(void) fclose (mhe);
#endif MHE
if (noisy)
(void) fflush (stdout);
if (trnflag) {
if (stat (newmail, &st) != NOTOK && s1.st_mtime != st.st_mtime)
advise (NULLCP, "new messages have arrived!\007");
else {
if ((i = creat (newmail, 0600)) != NOTOK)
(void) close (i);
else
admonish (newmail, "error zero'ing");
(void) unlink (map_name (newmail));
}
}
else
if (noisy)
printf ("%s not zero'd\n", newmail);
if (msgnum == hghnum)
admonish (NULLCP, "no messages incorporated");
else {
m_replace (pfolder, folder);
if (chgflag)
mp -> curmsg = hghnum + 1;
mp -> hghmsg = msgnum;
if (mp -> lowmsg == 0)
mp -> lowmsg = 1;
if (chgflag) /* sigh... */
m_setcur (mp, mp -> curmsg);
}
if (locked)
(void) lkfclose (in, newmail);
else
(void) fclose (in);
m_setvis (mp, 0);
m_sync (mp);
m_update ();
done (0);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.