|
|
1.1 root 1: /* inc.c - incorporate messages from a maildrop into a folder */
2:
3: #include "../h/mh.h"
4: #include "../h/formatsbr.h"
5: #include "../h/scansbr.h"
6: #include "../zotnet/tws.h"
7: #include <stdio.h>
8: #include "../zotnet/mts.h"
9: #include <errno.h>
10: #include <signal.h>
11: #include <sys/types.h>
12: #include <sys/stat.h>
13:
14: /* */
15:
16: static struct swit switches[] = {
17: #define AUDSW 0
18: "audit audit-file", 0,
19: #define NAUDSW 1
20: "noaudit", 0,
21:
22: #define CHGSW 2
23: "changecur", 0,
24: #define NCHGSW 3
25: "nochangecur", 0,
26:
27: #define DECRSW 4
28: "decrypt",
29: -7,
30: #define NDECRSW 5
31: "nodecrypt",
32: -9,
33:
34: #define MSW 6
35: "file name", 0,
36:
37: #define FORMSW 7
38: "form formatfile", 0,
39: #define FMTSW 8
40: "format string", 5,
41:
42: #define HOSTSW 9
43: "host host",
44: -4,
45: #define USERSW 10
46: "user user",
47: -4,
48: #define PACKSW 11
49: "pack file",
50: -4,
51: #define NPACKSW 12
52: "nopack",
53: -6,
54: #define RPOPSW 13
55: "rpop",
56: #ifndef RPOP
57: -4,
58: #else RPOP
59: 0,
60: #endif RPOP
61: #define NRPOPSW 14
62: "norpop",
63: #ifndef RPOP
64: -6,
65: #else RPOP
66: 0,
67: #endif RPOP
68:
69: #define SILSW 15
70: "silent", 0,
71: #define NSILSW 16
72: "nosilent", 0,
73:
74: #define TRNCSW 17
75: "truncate", 0,
76: #define NTRNCSW 18
77: "notruncate", 0,
78:
79: #define UUCPSW 19
80: "uucp",
81: #ifndef MF
82: -4,
83: #else MF
84: 0,
85: #endif MF
86: #define NUUCPSW 20
87: "nouucp",
88: #ifndef MF
89: -6,
90: #else MF
91: 0,
92: #endif MF
93:
94: #define WIDSW 21
95: "width columns", 0,
96:
97: #define HELPSW 22
98: "help", 4,
99:
100: NULL, NULL
101: };
102:
103: /* */
104:
105: extern int errno;
106: extern struct msgs *fmt_current_folder;
107:
108:
109: /* * /
110:
111: /* ARGSUSED */
112:
113: main(argc, argv)
114: int argc;
115: char *argv[];
116: {
117: int chgflag = 1,
118: trnflag = 1,
119: decflag = 1,
120: noisy = 1,
121: width = 0,
122: uucp = 1,
123: locked = 0,
124: rpop = 1,
125: i,
126: hghnum,
127: msgnum;
128: char *cp,
129: *maildir,
130: *folder = NULL,
131: *form = NULL,
132: *format = NULL,
133: *audfile = NULL,
134: *from = NULL,
135: *host = NULL,
136: *user = NULL,
137: *newmail,
138: buf[100],
139: **ap,
140: **argp,
141: *nfs,
142: *arguments[MAXARGS];
143: struct msgs *mp;
144: struct stat st,
145: s1;
146: FILE *in, *aud = NULL;
147: #ifdef MHE
148: FILE *mhe = NULL;
149: #endif MHE
150:
151: invo_name = r1bindex (argv[0], '/');
152: mts_init (invo_name);
153: if ((cp = m_find (invo_name)) != NULL) {
154: ap = brkstring (cp = getcpy (cp), " ", "\n");
155: ap = copyip (ap, arguments);
156: }
157: else
158: ap = arguments;
159: (void) copyip (argv + 1, ap);
160: argp = arguments;
161:
162: /* */
163:
164: while (cp = *argp++) {
165: if (*cp == '-')
166: switch (smatch (++cp, switches)) {
167: case AMBIGSW:
168: ambigsw (cp, switches);
169: done (1);
170: case UNKWNSW:
171: adios (NULLCP, "-%s unknown", cp);
172: case HELPSW:
173: (void) sprintf (buf, "%s [+folder] [switches]", invo_name);
174: help (buf, switches);
175: done (1);
176:
177: case AUDSW:
178: if (!(cp = *argp++) || *cp == '-')
179: adios (NULLCP, "missing argument to %s", argp[-2]);
180: audfile = getcpy (m_maildir (cp));
181: continue;
182: case NAUDSW:
183: audfile = NULL;
184: continue;
185:
186: case CHGSW:
187: chgflag++;
188: continue;
189: case NCHGSW:
190: chgflag = 0;
191: continue;
192:
193: case TRNCSW:
194: trnflag++;
195: continue;
196: case MSW:
197: if (!(cp = *argp++) || *cp == '-')
198: adios (NULLCP, "missing argument to %s", argp[-2]);
199: from = path (cp, TFILE);/* fall */
200: case NTRNCSW:
201: trnflag = 0;
202: continue;
203:
204: case SILSW:
205: noisy = 0;
206: continue;
207: case NSILSW:
208: noisy++;
209: continue;
210:
211: case FORMSW:
212: if (!(form = *argp++) || *form == '-')
213: adios (NULLCP, "missing argument to %s", argp[-2]);
214: format = NULL;
215: continue;
216: case FMTSW:
217: if (!(format = *argp++) || *format == '-')
218: adios (NULLCP, "missing argument to %s", argp[-2]);
219: form = NULL;
220: continue;
221:
222: case WIDSW:
223: if (!(cp = *argp++) || *cp == '-')
224: adios (NULLCP, "missing argument to %s", argp[-2]);
225: width = atoi (cp);
226: continue;
227:
228: case DECRSW:
229: decflag++;
230: continue;
231: case NDECRSW:
232: decflag = 0;
233: continue;
234:
235: case UUCPSW:
236: uucp++;
237: continue;
238: case NUUCPSW:
239: uucp = 0;
240: continue;
241:
242: case HOSTSW:
243: if (!(host = *argp++) || *host == '-')
244: adios (NULLCP, "missing argument to %s", argp[-2]);
245: continue;
246: case USERSW:
247: if (!(user = *argp++) || *user == '-')
248: adios (NULLCP, "missing argument to %s", argp[-2]);
249: continue;
250: case PACKSW:
251: if (!(cp = *argp++) || *cp == '-')
252: adios (NULLCP, "missing argument to %s", argp[-2]);
253: continue;
254: case NPACKSW:
255: continue;
256: case RPOPSW:
257: rpop++;
258: continue;
259: case NRPOPSW:
260: rpop = 0;
261: continue;
262: }
263: if (*cp == '+' || *cp == '@') {
264: if (folder)
265: adios (NULLCP, "only one folder at a time!");
266: else
267: folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF);
268: }
269: else
270: adios (NULLCP, "usage: %s [+folder] [switches]", invo_name);
271: }
272:
273: /* */
274:
275: if (from) {
276: newmail = from;
277: if (stat (newmail, &s1) == NOTOK || s1.st_size == 0)
278: adios (NULLCP, "no mail to incorporate");
279: }
280: else {
281: if (((newmail = getenv ("MAILDROP")) && *newmail)
282: || ((newmail = m_find ("maildrop")) && *newmail))
283: newmail = m_mailpath (newmail);
284: else {
285: newmail = concat (MAILDIR, "/", MAILFIL, NULLCP);
286: }
287: if (stat (newmail, &s1) == NOTOK || s1.st_size == 0)
288: adios (NULLCP, "no mail to incorporate");
289: }
290:
291: if (!m_find ("path"))
292: free (path ("./", TFOLDER));
293: if (!folder)
294: folder = defalt;
295: maildir = m_maildir (folder);
296:
297: if (stat (maildir, &st) == NOTOK) {
298: if (errno != ENOENT)
299: adios (maildir, "error on folder");
300: cp = concat ("Create folder \"", maildir, "\"? ", NULLCP);
301: if (noisy && !getanswer (cp))
302: done (1);
303: free (cp);
304: if (!makedir (maildir))
305: adios (NULLCP, "unable to create folder %s", maildir);
306: }
307:
308: if (chdir (maildir) == NOTOK)
309: adios (maildir, "unable to change directory to");
310: if (!(mp = m_gmsg (folder)))
311: adios (NULLCP, "unable to read folder %s", folder);
312:
313: if (access (newmail, 02) == NOTOK) {
314: trnflag = 0;
315: if ((in = fopen (newmail, "r")) == NULL)
316: adios (newmail, "unable to read");
317: }
318: else {
319: locked++;
320: if (trnflag) {
321: (void) signal (SIGHUP, SIG_IGN);
322: (void) signal (SIGINT, SIG_IGN);
323: (void) signal (SIGQUIT, SIG_IGN);
324: (void) signal (SIGTERM, SIG_IGN);
325: }
326: if ((in = lkfopen (newmail, "r")) == NULL)
327: adios (NULLCP, "unable to lock and fopen %s", newmail);
328: (void) fstat (fileno(in), &s1);
329: }
330:
331: if (audfile) {
332: if ((i = stat (audfile, &st)) == NOTOK)
333: advise (NULLCP, "Creating Receive-Audit: %s", audfile);
334: if ((aud = fopen (audfile, "a")) == NULL)
335: adios (audfile, "unable to append to");
336: else
337: if (i == NOTOK)
338: (void) chmod (audfile, m_gmprot ());
339: fprintf (aud, from ? "<<inc>> %s -ms %s\n" : "<<inc>> %s\n",
340: dtimenow (), from);
341: }
342:
343: #ifdef MHE
344: if (m_find ("mhe")) {
345: cp = concat (maildir, "/++", NULLCP);
346: i = stat (cp, &st);
347: if ((mhe = fopen (cp, "a")) == NULL)
348: admonish (cp, "unable to append to");
349: else
350: if (i == NOTOK)
351: (void) chmod (cp, m_gmprot ());
352: free (cp);
353: }
354: #endif MHE
355:
356: nfs = new_fs (form, format, FORMAT);
357:
358: if (noisy) {
359: printf ("Incorporating new mail into %s...\n\n", folder);
360: (void) fflush (stdout);
361: }
362:
363: /* */
364:
365: fmt_current_folder = mp;
366: m_unknown (in); /* the MAGIC invocation... */
367: hghnum = msgnum = mp -> hghmsg;
368: for (;;) {
369: if (msgnum >= mp -> hghoff) {
370: if ((mp = m_remsg (mp, 0, mp -> hghoff + MAXFOLDER)) == NULL)
371: adios (NULLCP, "unable to allocate folder storage");
372: fmt_current_folder = mp;
373: }
374: mp->msgstats[msgnum+1] = 0;
375: switch (i = scan(in, msgnum + 1, msgnum + 1, nfs, width,
376: msgnum == hghnum && chgflag, 0, 0L, noisy, aud)) {
377: case SCNEOF:
378: break;
379:
380: case SCNERR:
381: if (aud)
382: fputs ("inc aborted!\n", aud);
383: adios (NULLCP, "aborted!");
384:
385: case SCNNUM:
386: adios (NULLCP, "more than %d messages in folder %s, %s not zero'd",
387: MAXFOLDER, folder, newmail);
388:
389: default:
390: adios (NULLCP, "scan() botch (%d)", i);
391:
392: case SCNMSG:
393: case SCNENC:
394: #ifdef MHE
395: if (mhe)
396: fputs (scanl, mhe);
397: #endif MHE
398: if (noisy)
399: (void) fflush (stdout);
400:
401: ++msgnum; ++mp->hghmsg;
402: mp -> msgstats[msgnum] |= (EXISTS|UNSEEN);
403: mp -> msgflags |= SEQMOD;
404: continue;
405: }
406: break;
407: }
408:
409: if (aud)
410: (void) fclose (aud);
411: #ifdef MHE
412: if (mhe)
413: (void) fclose (mhe);
414: #endif MHE
415: if (noisy)
416: (void) fflush (stdout);
417:
418: if (trnflag) {
419: if (stat (newmail, &st) != NOTOK && s1.st_mtime != st.st_mtime)
420: advise (NULLCP, "new messages have arrived!\007");
421: else {
422: if ((i = creat (newmail, 0600)) != NOTOK)
423: (void) close (i);
424: else
425: admonish (newmail, "error zero'ing");
426: (void) unlink (map_name (newmail));
427: }
428: }
429: else
430: if (noisy)
431: printf ("%s not zero'd\n", newmail);
432:
433: if (msgnum == hghnum)
434: admonish (NULLCP, "no messages incorporated");
435: else {
436: m_replace (pfolder, folder);
437: if (chgflag)
438: mp -> curmsg = hghnum + 1;
439: mp -> hghmsg = msgnum;
440: if (mp -> lowmsg == 0)
441: mp -> lowmsg = 1;
442: if (chgflag) /* sigh... */
443: m_setcur (mp, mp -> curmsg);
444: }
445:
446: if (locked)
447: (void) lkfclose (in, newmail);
448: else
449: (void) fclose (in);
450:
451: m_setvis (mp, 0);
452: m_sync (mp);
453: m_update ();
454: done (0);
455: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.