|
|
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.