|
|
1.1 ! root 1: /* post.c - enter messages into the transport system */ ! 2: ! 3: #include "../h/mh.h" ! 4: #include "../h/addrsbr.h" ! 5: #include "../h/aliasbr.h" ! 6: #include "../h/dropsbr.h" ! 7: #include "../zotnet/tws.h" ! 8: #ifndef MMDFMTS ! 9: #include <ctype.h> ! 10: #include <errno.h> ! 11: #include <setjmp.h> ! 12: #include <stdio.h> ! 13: #include <sys/types.h> ! 14: #else MMDFMTS ! 15: #include "../mts/mmdf/util.h" ! 16: #include "../mts/mmdf/mmdf.h" ! 17: #endif MMDFMTS ! 18: #include "../zotnet/mts.h" ! 19: #ifdef MHMTS ! 20: #ifndef V7 ! 21: #include <sys/ioctl.h> ! 22: #endif not V7 ! 23: #include <sys/stat.h> ! 24: #endif MHMTS ! 25: #ifdef SENDMTS ! 26: #include "../mts/sendmail/smail.h" ! 27: #undef MF ! 28: #endif SENDMTS ! 29: #include <signal.h> ! 30: ! 31: ! 32: #ifndef MMDFMTS ! 33: #define uptolow(c) (isupper (c) ? tolower (c) : (c)) ! 34: #endif not MMDFMTS ! 35: ! 36: #define FCCS 10 /* max number of fccs allowed */ ! 37: ! 38: /* */ ! 39: ! 40: static struct swit switches[] = { ! 41: #define ALIASW 0 ! 42: "alias aliasfile", 0, ! 43: ! 44: #define CHKSW 1 ! 45: "check", -5, /* interface from whom */ ! 46: #define NCHKSW 2 ! 47: "nocheck", -7, /* interface from whom */ ! 48: ! 49: #define DEBUGSW 3 ! 50: "debug", -5, ! 51: ! 52: #define DISTSW 4 ! 53: "dist", -4, /* interface from dist */ ! 54: ! 55: #define ENCRSW 5 ! 56: "encrypt", ! 57: #ifndef TMA ! 58: -7, ! 59: #else TMA ! 60: 0, ! 61: #endif TMA ! 62: #define NENCRSW 6 ! 63: "noencrypt", ! 64: #ifndef TMA ! 65: -9, ! 66: #else TMA ! 67: 0, ! 68: #endif TMA ! 69: ! 70: #define FILTSW 7 ! 71: "filter filterfile", 0, ! 72: #define NFILTSW 8 ! 73: "nofilter", 0, ! 74: ! 75: #define FRMTSW 9 ! 76: "format", 0, ! 77: #define NFRMTSW 10 ! 78: "noformat", 0, ! 79: ! 80: #define LIBSW 11 /* interface from send, whom */ ! 81: "library directory", -7, ! 82: ! 83: #define MSGDSW 12 ! 84: "msgid", 0, ! 85: #define NMSGDSW 13 ! 86: "nomsgid", 0, ! 87: ! 88: #define VERBSW 14 ! 89: "verbose", 0, ! 90: #define NVERBSW 15 ! 91: "noverbose", 0, ! 92: ! 93: #define WATCSW 16 ! 94: "watch", 0, ! 95: #define NWATCSW 17 ! 96: "nowatch", 0, ! 97: ! 98: #define WHOMSW 18 /* interface from whom */ ! 99: "whom", -4, ! 100: ! 101: #define WIDTHSW 19 ! 102: "width columns", 0, ! 103: ! 104: #define HELPSW 20 ! 105: "help", 4, ! 106: ! 107: #define MAILSW 21 ! 108: "mail", -4, ! 109: #define SAMLSW 22 ! 110: "saml", -4, ! 111: #define SENDSW 23 ! 112: "send", -4, ! 113: #define SOMLSW 24 ! 114: "soml", -4, ! 115: ! 116: #define ANNOSW 25 /* interface from send */ ! 117: "idanno number", -6, ! 118: ! 119: #define DLVRSW 26 ! 120: "deliver address-list", -7, ! 121: ! 122: #define CLIESW 27 ! 123: "client host", -6, ! 124: #define SERVSW 28 ! 125: "server host", -6, ! 126: #define SNOOPSW 29 ! 127: "snoop", -5, ! 128: ! 129: NULL, NULL ! 130: }; ! 131: ! 132: /* */ ! 133: ! 134: struct headers { ! 135: char *value; ! 136: ! 137: unsigned int flags; ! 138: #define HNOP 0x0000 /* just used to keep .set around */ ! 139: #define HBAD 0x0001 /* bad header - don't let it through */ ! 140: #define HADR 0x0002 /* header has an address field */ ! 141: #define HSUB 0x0004 /* Subject: header */ ! 142: #define HTRY 0x0008 /* try to send to addrs on header */ ! 143: #define HBCC 0x0010 /* don't output this header */ ! 144: #define HMNG 0x0020 /* munge this header */ ! 145: #define HNGR 0x0040 /* no groups allowed in this header */ ! 146: #define HFCC 0x0080 /* FCC: type header */ ! 147: #define HNIL 0x0100 /* okay for this header not to have addrs */ ! 148: #define HIGN 0x0200 /* ignore this header */ ! 149: ! 150: unsigned int set; ! 151: #define MFRM 0x0001 /* we've seen a From: */ ! 152: #define MDAT 0x0002 /* we've seen a Date: */ ! 153: #define MRFM 0x0004 /* we've seen a Resent-From: */ ! 154: #define MVIS 0x0008 /* we've seen sighted addrs */ ! 155: #define MINV 0x0010 /* we've seen blind addrs */ ! 156: }; ! 157: ! 158: /* */ ! 159: ! 160: static struct headers NHeaders[] = { ! 161: "Return-Path", HBAD, NULL, ! 162: "Received", HBAD, NULL, ! 163: "Reply-To", HADR | HNGR, NULL, ! 164: "From", HADR | HNGR, MFRM, ! 165: "Sender", HADR | HBAD, NULL, ! 166: "Date", HBAD, NULL, ! 167: "Subject", HSUB, NULL, ! 168: "To", HADR | HTRY, MVIS, ! 169: "cc", HADR | HTRY, MVIS, ! 170: "Bcc", HADR | HTRY | HBCC | HNIL, MINV, ! 171: "Message-ID", HBAD, NULL, ! 172: "Fcc", HFCC, NULL, ! 173: ! 174: NULL ! 175: }; ! 176: ! 177: static struct headers RHeaders[] = { ! 178: "Resent-Reply-To", HADR | HNGR, NULL, ! 179: "Resent-From", HADR | HNGR, MRFM, ! 180: "Resent-Sender", HADR | HBAD, NULL, ! 181: "Resent-Date", HBAD, NULL, ! 182: "Resent-Subject", HSUB, NULL, ! 183: "Resent-To", HADR | HTRY, MVIS, ! 184: "Resent-cc", HADR | HTRY, MVIS, ! 185: "Resent-Bcc", HADR | HTRY | HBCC, MINV, ! 186: "Resent-Message-ID", HBAD, NULL, ! 187: "Resent-Fcc", HFCC, NULL, ! 188: "Reply-To", HADR, NULL, ! 189: "From", HADR | HNGR, MFRM, ! 190: #ifdef MMDFI ! 191: "Sender", HADR | HMNG | HNGR, NULL, ! 192: #else not MMFDI ! 193: "Sender", HADR | HNGR, NULL, ! 194: #endif not MMDFI ! 195: "Date", HNOP, MDAT, ! 196: "To", HADR | HNIL, NULL, ! 197: "cc", HADR | HNIL, NULL, ! 198: "Bcc", HADR | HTRY | HBCC | HNIL, NULL, ! 199: "Fcc", HIGN, NULL, ! 200: ! 201: NULL ! 202: }; ! 203: ! 204: /* */ ! 205: ! 206: ! 207: static short fccind = 0; /* index into fccfold[] */ ! 208: static short outputlinelen = OUTPUTLINELEN; ! 209: ! 210: static int pfd = NOTOK; /* fd to write annotation list to */ ! 211: static int myuid; /* my user id */ ! 212: static int mygid; /* my group id */ ! 213: static int recipients = 0; /* how many people will get a copy */ ! 214: static int unkadr = 0; /* how many of those were unknown */ ! 215: static int badadr = 0; /* number of bad addrs */ ! 216: static int badmsg = 0; /* message has bad semantics */ ! 217: static int verbose = 0; /* spell it out */ ! 218: static int format = 1; /* format addresses */ ! 219: static int msgid = 0; /* add msgid */ ! 220: static int debug = 0; /* debugging post */ ! 221: static int watch = 0; /* watch the delivery process */ ! 222: static int whomsw = 0; /* we are whom not post */ ! 223: static int checksw = 0; /* whom -check */ ! 224: static int linepos; /* putadr()'s position on the line */ ! 225: static int nameoutput; /* putadr() has output header name */ ! 226: ! 227: static unsigned msgflags = 0; /* what we've seen */ ! 228: ! 229: #define NORMAL 0 ! 230: #define RESENT 1 ! 231: static int msgstate = NORMAL; ! 232: ! 233: static long clock = 0L; /* the time we started (more or less) */ ! 234: ! 235: static int (*hstat) (), (*istat) (), (*qstat) (), (*tstat) (); ! 236: ! 237: static char tmpfil[BUFSIZ]; ! 238: static char bccfil[BUFSIZ]; ! 239: ! 240: static char from[BUFSIZ]; /* my network address */ ! 241: static char signature[BUFSIZ]; /* my signature */ ! 242: static char *filter = NULL; /* the filter for BCC'ing */ ! 243: static char *subject = NULL; /* the subject field for BCC'ing */ ! 244: static char *fccfold[FCCS]; /* foldernames for FCC'ing */ ! 245: ! 246: static struct headers *hdrtab; /* table for the message we're doing */ ! 247: ! 248: static struct mailname localaddrs; /* local addrs */ ! 249: static struct mailname netaddrs; /* network addrs */ ! 250: static struct mailname uuaddrs; /* uucp addrs */ ! 251: static struct mailname tmpaddrs; /* temporary queue */ ! 252: ! 253: /* */ ! 254: ! 255: #ifdef MMDFMTS ! 256: static char *submitmode = "m"; /* deliver to mailbox only */ ! 257: #ifndef RP_DOK ! 258: static char submitopts[6] = "vl";/* initial options for submit */ ! 259: #else RP_DOK ! 260: static char submitopts[7] = "vlk";/* initial options for submit */ ! 261: #endif RP_DOK ! 262: #endif MMDFMTS ! 263: ! 264: #ifdef MHMTS ! 265: static char *deliver = NULL; ! 266: ! 267: extern char **environ; ! 268: ! 269: int sigser (); ! 270: #endif MHMTS ! 271: ! 272: #ifdef SENDMTS ! 273: static int smtpmode = S_MAIL; ! 274: static int snoop = 0; ! 275: static char *clientsw = NULL; ! 276: static char *serversw = NULL; ! 277: ! 278: extern struct smtp sm_reply; ! 279: #endif SENDMTS ! 280: ! 281: #ifdef TMA ! 282: #define post(a,b,c) \ ! 283: if (encryptsw) postcipher ((a), (b), (c)); else postplain ((a), (b), (c)) ! 284: #endif TMA ! 285: ! 286: static int encryptsw = 0; /* encrypt it */ ! 287: ! 288: ! 289: long lseek (); ! 290: ! 291: /* MAIN */ ! 292: ! 293: /* ARGSUSED */ ! 294: ! 295: main (argc, argv) ! 296: int argc; ! 297: char *argv[]; ! 298: { ! 299: int state, ! 300: compnum; ! 301: char *cp, ! 302: *msg = NULL, ! 303: **argp = argv + 1, ! 304: buf[BUFSIZ], ! 305: name[NAMESZ]; ! 306: FILE *in, ! 307: *out; ! 308: ! 309: invo_name = r1bindex (argv[0], '/'); ! 310: m_foil (NULLCP); ! 311: mts_init (invo_name); ! 312: #ifdef MMDFMTS ! 313: #ifdef MMDFII ! 314: mmdf_init (invo_name); ! 315: #endif MMDFII ! 316: #endif MMDFMTS ! 317: ! 318: /* */ ! 319: ! 320: while (cp = *argp++) { ! 321: if (*cp == '-') ! 322: switch (smatch (++cp, switches)) { ! 323: case AMBIGSW: ! 324: ambigsw (cp, switches); ! 325: done (1); ! 326: case UNKWNSW: ! 327: adios (NULLCP, "-%s unknown", cp); ! 328: case HELPSW: ! 329: (void) sprintf (buf, "%s [switches] file", invo_name); ! 330: help (buf, switches); ! 331: done (1); ! 332: ! 333: case LIBSW: ! 334: if (!(cp = *argp++) || *cp == '-') ! 335: adios (NULLCP, "missing argument to %s", argp[-2]); ! 336: m_foil (cp); ! 337: continue; ! 338: ! 339: case ALIASW: ! 340: if (!(cp = *argp++) || *cp == '-') ! 341: adios (NULLCP, "missing argument to %s", argp[-2]); ! 342: #ifdef MHMTS ! 343: if (access (libpath (cp), 04) == NOTOK) ! 344: adios (cp, "unable to read"); ! 345: #endif MHMTS ! 346: if ((state = alias (cp)) != AK_OK) ! 347: adios (NULLCP, "aliasing error in %s - %s", ! 348: cp, akerror (state)); ! 349: continue; ! 350: ! 351: case CHKSW: ! 352: checksw++; ! 353: continue; ! 354: case NCHKSW: ! 355: checksw = 0; ! 356: continue; ! 357: ! 358: case DEBUGSW: ! 359: debug++; ! 360: continue; ! 361: ! 362: case DISTSW: ! 363: msgstate = RESENT; ! 364: continue; ! 365: ! 366: case FILTSW: ! 367: if (!(filter = *argp++) || *filter == '-') ! 368: adios (NULLCP, "missing argument to %s", argp[-2]); ! 369: continue; ! 370: case NFILTSW: ! 371: filter = NULL; ! 372: continue; ! 373: ! 374: case FRMTSW: ! 375: format++; ! 376: continue; ! 377: case NFRMTSW: ! 378: format = 0; ! 379: continue; ! 380: ! 381: case MSGDSW: ! 382: msgid++; ! 383: continue; ! 384: case NMSGDSW: ! 385: msgid = 0; ! 386: continue; ! 387: ! 388: case VERBSW: ! 389: verbose++; ! 390: continue; ! 391: case NVERBSW: ! 392: verbose = 0; ! 393: continue; ! 394: ! 395: case WATCSW: ! 396: watch++; ! 397: continue; ! 398: case NWATCSW: ! 399: watch = 0; ! 400: continue; ! 401: ! 402: case WHOMSW: ! 403: whomsw++; ! 404: continue; ! 405: ! 406: case WIDTHSW: ! 407: if (!(cp = *argp++) || *cp == '-') ! 408: adios (NULLCP, "missing argument to %s", argp[-2]); ! 409: if ((outputlinelen = atoi (cp)) < 10) ! 410: adios (NULLCP, "impossible width %d", outputlinelen); ! 411: continue; ! 412: ! 413: case ENCRSW: ! 414: encryptsw++; ! 415: continue; ! 416: case NENCRSW: ! 417: encryptsw = 0; ! 418: continue; ! 419: ! 420: case ANNOSW: ! 421: if (!(cp = *argp++) || *cp == '-') ! 422: adios (NULLCP, "missing argument to %s", argp[-2]); ! 423: if ((pfd = atoi (cp)) <= 2) ! 424: adios (NULLCP, "bad argument %s %s", argp[-2], cp); ! 425: continue; ! 426: ! 427: #ifdef MMDFMTS ! 428: case MAILSW: ! 429: submitmode = "m"; ! 430: continue; ! 431: case SOMLSW: /* for right now, sigh... */ ! 432: case SAMLSW: ! 433: submitmode = "b"; ! 434: continue; ! 435: case SENDSW: ! 436: submitmode = "y"; ! 437: continue; ! 438: #endif MMDFMTS ! 439: ! 440: #ifndef MHMTS ! 441: case DLVRSW: ! 442: if (!(cp = *argp++) || *cp == '-') ! 443: adios (NULLCP, "missing argument to %s", argp[-2]); ! 444: continue; ! 445: #else MHMTS ! 446: case MAILSW: ! 447: case SAMLSW: ! 448: case SOMLSW: ! 449: case SENDSW: ! 450: continue; ! 451: case DLVRSW: ! 452: if (!(deliver = *argp++) || *deliver == '-') ! 453: adios (NULLCP, "missing argument to %s", argp[-2]); ! 454: continue; ! 455: #endif MHMTS ! 456: ! 457: #ifndef SENDMTS ! 458: case CLIESW: ! 459: case SERVSW: ! 460: if (!(cp = *argp++) || *cp == '-') ! 461: adios (NULLCP, "missing argument to %s", argp[-2]); ! 462: continue; ! 463: ! 464: case SNOOPSW: ! 465: continue; ! 466: #else SENDMTS ! 467: case MAILSW: ! 468: smtpmode = S_MAIL; ! 469: continue; ! 470: case SAMLSW: ! 471: smtpmode = S_SAML; ! 472: continue; ! 473: case SOMLSW: ! 474: smtpmode = S_SOML; ! 475: continue; ! 476: case SENDSW: ! 477: smtpmode = S_SEND; ! 478: continue; ! 479: case CLIESW: ! 480: if (!(clientsw = *argp++) || *clientsw == '-') ! 481: adios (NULLCP, "missing argument to %s", argp[-2]); ! 482: continue; ! 483: case SERVSW: ! 484: if (!(serversw = *argp++) || *serversw == '-') ! 485: adios (NULLCP, "missing argument to %s", argp[-2]); ! 486: continue; ! 487: case SNOOPSW: ! 488: snoop++; ! 489: continue; ! 490: #endif SENDMTS ! 491: } ! 492: if (msg) ! 493: adios (NULLCP, "only one message at a time!"); ! 494: else ! 495: msg = cp; ! 496: } ! 497: ! 498: (void) alias (AliasFile); ! 499: ! 500: /* */ ! 501: ! 502: if (!msg) ! 503: adios (NULLCP, "usage: %s [switches] file", invo_name); ! 504: ! 505: if (outputlinelen < 10) ! 506: adios (NULLCP, "impossible width %d", outputlinelen); ! 507: ! 508: #ifdef MHMTS ! 509: if (access (msg, 04) == NOTOK) ! 510: adios (msg, "unable to read"); ! 511: #endif MHMTS ! 512: if ((in = fopen (msg, "r")) == NULL) ! 513: adios (msg, "unable to open"); ! 514: ! 515: start_headers (); ! 516: if (debug) { ! 517: verbose++; ! 518: out = stdout; ! 519: #ifdef MHMTS ! 520: if (deliver) { ! 521: (void) strcpy (tmpfil, msg); ! 522: putfmt ("To", deliver, out); ! 523: goto daemon; ! 524: } ! 525: #endif MHMTS ! 526: } ! 527: else ! 528: #ifdef MHMTS ! 529: if (deliver) { ! 530: if ((out = fopen ("/dev/null", "r")) == NULL) ! 531: adios ("/dev/null", "unable to write"); ! 532: (void) strcpy (tmpfil, msg); ! 533: putfmt ("To", deliver, out); ! 534: goto daemon; ! 535: } ! 536: else ! 537: #endif MHMTS ! 538: if (whomsw) { ! 539: if ((out = fopen ("/dev/null", "w")) == NULL) ! 540: adios ("/dev/null", "unable to open"); ! 541: } ! 542: else { ! 543: (void) strcpy (tmpfil, m_tmpfil (invo_name)); ! 544: if ((out = fopen (tmpfil, "w")) == NULL) ! 545: adios (tmpfil, "unable to create"); ! 546: #ifdef MHMTS ! 547: (void) chown (tmpfil, myuid, mygid); ! 548: #endif MHMTS ! 549: (void) chmod (tmpfil, 0600); ! 550: } ! 551: ! 552: /* */ ! 553: ! 554: hdrtab = msgstate == NORMAL ? NHeaders : RHeaders; ! 555: ! 556: for (compnum = 1, state = FLD;;) { ! 557: switch (state = m_getfld (state, name, buf, sizeof buf, in)) { ! 558: case FLD: ! 559: case FLDEOF: ! 560: case FLDPLUS: ! 561: compnum++; ! 562: cp = add (buf, NULLCP); ! 563: while (state == FLDPLUS) { ! 564: state = m_getfld (state, name, buf, sizeof buf, in); ! 565: cp = add (buf, cp); ! 566: } ! 567: putfmt (name, cp, out); ! 568: free (cp); ! 569: if (state != FLDEOF) ! 570: continue; ! 571: finish_headers (out); ! 572: break; ! 573: ! 574: case BODY: ! 575: case BODYEOF: ! 576: finish_headers (out); ! 577: if (whomsw) ! 578: break; ! 579: fprintf (out, "\n%s", buf); ! 580: while (state == BODY) { ! 581: state = m_getfld (state, name, buf, sizeof buf, in); ! 582: fputs (buf, out); ! 583: } ! 584: break; ! 585: ! 586: case FILEEOF: ! 587: finish_headers (out); ! 588: break; ! 589: ! 590: case LENERR: ! 591: case FMTERR: ! 592: adios (NULLCP, "message format error in component #%d", ! 593: compnum); ! 594: ! 595: default: ! 596: adios (NULLCP, "getfld() returned %d", state); ! 597: } ! 598: break; ! 599: } ! 600: ! 601: /* */ ! 602: ! 603: #ifdef MHMTS ! 604: daemon: ; ! 605: #endif MHMTS ! 606: if (pfd != NOTOK) ! 607: anno (); ! 608: (void) fclose (in); ! 609: if (debug) { ! 610: pl (); ! 611: done (0); ! 612: } ! 613: else ! 614: (void) fclose (out); ! 615: ! 616: #ifdef TMA ! 617: if (encryptsw) ! 618: tmastart (); ! 619: #endif TMA ! 620: if (whomsw) { ! 621: verify_all_addresses (1); ! 622: done (0); ! 623: } ! 624: ! 625: #ifdef MMDFMTS ! 626: (void) strcat (submitopts, submitmode); ! 627: if (watch) ! 628: (void) strcat (submitopts, "nw"); ! 629: #endif MMDFMTS ! 630: #ifdef MHMTS ! 631: verify_all_addresses (0); ! 632: #endif MHMTS ! 633: if (encryptsw) ! 634: verify_all_addresses (verbose); ! 635: if (msgflags & MINV) { ! 636: make_bcc_file (); ! 637: if (msgflags & MVIS) { ! 638: #ifndef MHMTS ! 639: if (!encryptsw) ! 640: verify_all_addresses (verbose); ! 641: #endif not MHMTS ! 642: post (tmpfil, 0, verbose); ! 643: } ! 644: post (bccfil, 1, verbose); ! 645: (void) unlink (bccfil); ! 646: } ! 647: else ! 648: post (tmpfil, 0, isatty (1)); ! 649: #ifdef TMA ! 650: if (encryptsw) ! 651: tmastop (); ! 652: #endif TMA ! 653: ! 654: refile (tmpfil); ! 655: ! 656: #ifdef MHMTS ! 657: if (!deliver) ! 658: #endif MHMTS ! 659: (void) unlink (tmpfil); ! 660: ! 661: if (verbose) ! 662: printf ("Message Processed\n"); ! 663: ! 664: done (0); ! 665: } ! 666: ! 667: /* DRAFT GENERATION */ ! 668: ! 669: static putfmt (name, str, out) ! 670: register char *name, ! 671: *str; ! 672: register FILE *out; ! 673: { ! 674: int count, ! 675: grp, ! 676: i, ! 677: keep; ! 678: register char *cp, ! 679: *pp, ! 680: *qp; ! 681: char namep[BUFSIZ]; ! 682: register struct mailname *mp, ! 683: *np; ! 684: register struct headers *hdr; ! 685: ! 686: while (*str == ' ' || *str == '\t') ! 687: str++; ! 688: ! 689: if (msgstate == NORMAL && uprf (name, "resent")) { ! 690: advise (NULLCP, "illegal header line -- %s:", name); ! 691: badmsg++; ! 692: return; ! 693: } ! 694: ! 695: if ((i = get_header (name, hdrtab)) == NOTOK) { ! 696: fprintf (out, "%s: %s", name, str); ! 697: return; ! 698: } ! 699: ! 700: hdr = &hdrtab[i]; ! 701: if (hdr -> flags & HIGN) ! 702: return; ! 703: if (hdr -> flags & HBAD) { ! 704: advise (NULLCP, "illegal header line -- %s:", name); ! 705: badmsg++; ! 706: return; ! 707: } ! 708: msgflags |= (hdr -> set & ~(MVIS | MINV)); ! 709: ! 710: if (hdr -> flags & HSUB) ! 711: subject = subject ? add (str, add ("\t", subject)) : getcpy (str); ! 712: if (hdr -> flags & HFCC) { ! 713: if (cp = rindex (str, '\n')) ! 714: *cp = NULL; ! 715: for (cp = pp = str; cp = index (pp, ','); pp = cp) { ! 716: *cp++ = NULL; ! 717: insert_fcc (hdr, pp); ! 718: } ! 719: insert_fcc (hdr, pp); ! 720: return; ! 721: } ! 722: ! 723: /* */ ! 724: ! 725: if (!(hdr -> flags & HADR)) { ! 726: fprintf (out, "%s: %s", name, str); ! 727: return; ! 728: } ! 729: ! 730: tmpaddrs.m_next = NULL; ! 731: for (count = 0; cp = getname (str); count++) ! 732: if (mp = getm (cp, NULLCP, 0, AD_HOST, NULLCP)) { ! 733: if (tmpaddrs.m_next) ! 734: np -> m_next = mp; ! 735: else ! 736: tmpaddrs.m_next = mp; ! 737: np = mp; ! 738: } ! 739: else ! 740: if (hdr -> flags & HTRY) ! 741: badadr++; ! 742: else ! 743: badmsg++; ! 744: ! 745: if (count < 1) { ! 746: if (hdr -> flags & HNIL) ! 747: fprintf (out, "%s: %s", name, str); ! 748: else { ! 749: #ifdef notdef ! 750: advise (NULLCP, "%s: field requires at least one address", name); ! 751: badmsg++; ! 752: #endif notdef ! 753: } ! 754: return; ! 755: } ! 756: ! 757: /* */ ! 758: ! 759: nameoutput = linepos = 0; ! 760: (void) sprintf (namep, "%s%s", ! 761: (hdr -> flags & HMNG) ? "Original-" : "", name); ! 762: ! 763: for (grp = 0, mp = tmpaddrs.m_next; mp; mp = np) ! 764: if (mp -> m_nohost) { /* also used to test (hdr -> flags & HTRY) */ ! 765: pp = akvalue (mp -> m_mbox); ! 766: qp = akvisible () ? mp -> m_mbox : ""; ! 767: np = mp; ! 768: if (np -> m_gname) ! 769: putgrp (namep, np -> m_gname, out, hdr -> flags); ! 770: while (cp = getname (pp)) { ! 771: if (!(mp = getm (cp, NULLCP, 0, AD_HOST, NULLCP))) { ! 772: badadr++; ! 773: continue; ! 774: } ! 775: if (hdr -> flags & HBCC) ! 776: mp -> m_bcc++; ! 777: if (mp -> m_ingrp = np -> m_ingrp) ! 778: grp++; ! 779: #ifdef MHMTS ! 780: mp -> m_aka = getcpy (np -> m_mbox); ! 781: #endif MHMTS ! 782: if (putadr (namep, qp, mp, out, hdr -> flags)) ! 783: msgflags |= (hdr -> set & (MVIS | MINV)); ! 784: else ! 785: mnfree (mp); ! 786: } ! 787: mp = np; ! 788: np = np -> m_next; ! 789: mnfree (mp); ! 790: } ! 791: else { ! 792: if (hdr -> flags & HBCC) ! 793: mp -> m_bcc++; ! 794: if (mp -> m_gname) ! 795: putgrp (namep, mp -> m_gname, out, hdr -> flags); ! 796: if (mp -> m_ingrp) ! 797: grp++; ! 798: keep = putadr (namep, "", mp, out, hdr -> flags); ! 799: np = mp -> m_next; ! 800: if (keep) { ! 801: mp -> m_next = NULL; ! 802: msgflags |= (hdr -> set & (MVIS | MINV)); ! 803: } ! 804: else ! 805: mnfree (mp); ! 806: } ! 807: ! 808: if (grp > 0 && (hdr -> flags & HNGR)) { ! 809: advise (NULLCP, "%s: field does not allow groups", name); ! 810: badmsg++; ! 811: } ! 812: if (linepos) ! 813: (void) putc ('\n', out); ! 814: } ! 815: ! 816: /* */ ! 817: ! 818: static start_headers () { ! 819: register char *cp; ! 820: char myhost[BUFSIZ], ! 821: sigbuf[BUFSIZ]; ! 822: register struct mailname *mp; ! 823: ! 824: myuid = getuid (); ! 825: mygid = getgid (); ! 826: (void) time (&clock); ! 827: ! 828: (void) strcpy (from, adrsprintf (NULLCP, NULLCP)); ! 829: ! 830: (void) strcpy (myhost, LocalName ()); ! 831: for (cp = myhost; *cp; cp++) ! 832: *cp = uptolow (*cp); ! 833: ! 834: #ifdef MHMTS ! 835: if (deliver) { ! 836: if (geteuid () == 0 && myuid != 0 && myuid != 1 && mygid != 1) ! 837: adios (NULLCP, "-deliver unknown"); ! 838: (void) strcpy (signature, from); ! 839: } ! 840: #endif MHMTS ! 841: ! 842: if ((cp = getfullname ()) && *cp) { ! 843: (void) strcpy (sigbuf, cp); ! 844: (void) sprintf (signature, "%s <%s>", sigbuf, adrsprintf (NULLCP, NULLCP)); ! 845: if ((cp = getname (signature)) == NULL) ! 846: adios (NULLCP, "getname () failed -- you lose extraordinarily big"); ! 847: if ((mp = getm (cp, NULLCP, 0, AD_HOST, NULLCP)) == NULL) ! 848: adios (NULLCP, "bad signature '%s'", sigbuf); ! 849: mnfree (mp); ! 850: while (getname ("")) ! 851: continue; ! 852: } ! 853: else ! 854: (void) strcpy (signature, adrsprintf (NULLCP, NULLCP)); ! 855: } ! 856: ! 857: /* */ ! 858: ! 859: static finish_headers (out) ! 860: register FILE *out; ! 861: { ! 862: switch (msgstate) { ! 863: case NORMAL: ! 864: if (whomsw) ! 865: break; ! 866: ! 867: fprintf (out, "Date: %s\n", dtime (&clock)); ! 868: if (msgid) ! 869: fprintf (out, "Message-ID: <%d.%ld@%s>\n", ! 870: getpid (), clock, LocalName ()); ! 871: if (msgflags & MFRM) ! 872: fprintf (out, "Sender: %s\n", from); ! 873: else ! 874: fprintf (out, "From: %s\n", signature); ! 875: if (!(msgflags & MVIS)) ! 876: fprintf (out, "Bcc: Blind Distribution List: ;\n"); ! 877: break; ! 878: ! 879: case RESENT: ! 880: if (!(msgflags & MDAT)) { ! 881: advise (NULLCP, "message has no Date: header"); ! 882: badmsg++; ! 883: } ! 884: if (!(msgflags & MFRM)) { ! 885: advise (NULLCP, "message has no From: header"); ! 886: badmsg++; ! 887: } ! 888: if (whomsw) ! 889: break; ! 890: ! 891: #ifdef MMDFI /* sigh */ ! 892: fprintf (out, "Sender: %s\n", from); ! 893: #endif MMDFI ! 894: ! 895: fprintf (out, "Resent-Date: %s\n", dtime (&clock)); ! 896: if (msgid) ! 897: fprintf (out, "Resent-Message-ID: <%d.%ld@%s>\n", ! 898: getpid (), clock, LocalName ()); ! 899: if (msgflags & MRFM) ! 900: fprintf (out, "Resent-Sender: %s\n", from); ! 901: else ! 902: fprintf (out, "Resent-From: %s\n", signature); ! 903: if (!(msgflags & MVIS)) ! 904: fprintf (out, "Resent-Bcc: Blind Re-Distribution List: ;\n"); ! 905: break; ! 906: } ! 907: ! 908: if (badmsg) ! 909: adios (NULLCP, "re-format message and try again"); ! 910: if (!recipients) ! 911: adios (NULLCP, "no addressees"); ! 912: } ! 913: ! 914: /* */ ! 915: ! 916: static int get_header (header, table) ! 917: register char *header; ! 918: register struct headers *table; ! 919: { ! 920: register struct headers *h; ! 921: ! 922: for (h = table; h -> value; h++) ! 923: if (uleq (header, h -> value)) ! 924: return (h - table); ! 925: ! 926: return NOTOK; ! 927: } ! 928: ! 929: /* */ ! 930: ! 931: static int putadr (name, aka, mp, out, flags) ! 932: register char *name, ! 933: *aka; ! 934: register struct mailname *mp; ! 935: register FILE *out; ! 936: unsigned int flags; ! 937: { ! 938: int len; ! 939: register char *cp; ! 940: char buffer[BUFSIZ]; ! 941: ! 942: if (mp -> m_mbox == NULL || ((flags & HTRY) && !insert (mp))) ! 943: return 0; ! 944: if ((flags & HBCC) || mp -> m_ingrp) ! 945: return 1; ! 946: ! 947: if (!nameoutput) { ! 948: fprintf (out, "%s: ", name); ! 949: linepos += (nameoutput = strlen (name) + 2); ! 950: } ! 951: ! 952: if (*aka && mp -> m_type != UUCPHOST && !mp -> m_pers) ! 953: mp -> m_pers = getcpy (aka); ! 954: if (format) { ! 955: if (mp -> m_gname) ! 956: (void) sprintf (cp = buffer, "%s;", mp -> m_gname); ! 957: else ! 958: cp = adrformat (mp); ! 959: } ! 960: else ! 961: cp = mp -> m_text; ! 962: len = strlen (cp); ! 963: ! 964: if (linepos != nameoutput) ! 965: if (len + linepos + 2 > outputlinelen) ! 966: fprintf (out, ",\n%*s", linepos = nameoutput, ""); ! 967: else { ! 968: fputs (", ", out); ! 969: linepos += 2; ! 970: } ! 971: ! 972: fputs (cp, out); ! 973: linepos += len; ! 974: ! 975: return (flags & HTRY); ! 976: } ! 977: ! 978: /* */ ! 979: ! 980: static putgrp (name, group, out, flags) ! 981: register char *name, ! 982: *group; ! 983: register FILE *out; ! 984: unsigned int flags; ! 985: { ! 986: int len; ! 987: char *cp; ! 988: ! 989: if (flags & HBCC) ! 990: return; ! 991: ! 992: if (!nameoutput) { ! 993: fprintf (out, "%s: ", name); ! 994: linepos += (nameoutput = strlen (name) + 2); ! 995: } ! 996: ! 997: cp = concat (group, ";", NULLCP); ! 998: len = strlen (cp); ! 999: ! 1000: if (linepos != nameoutput) ! 1001: if (len + linepos + 2 > outputlinelen) { ! 1002: fprintf (out, ",\n%*s", nameoutput, ""); ! 1003: linepos = nameoutput; ! 1004: } ! 1005: else { ! 1006: fputs (", ", out); ! 1007: linepos += 2; ! 1008: } ! 1009: ! 1010: fputs (cp, out); ! 1011: linepos += len; ! 1012: } ! 1013: ! 1014: /* */ ! 1015: ! 1016: static int insert (np) ! 1017: register struct mailname *np; ! 1018: { ! 1019: register struct mailname *mp; ! 1020: ! 1021: if (np -> m_mbox == NULL) ! 1022: return 0; ! 1023: ! 1024: for (mp = np -> m_type == LOCALHOST ? &localaddrs ! 1025: : np -> m_type == UUCPHOST ? &uuaddrs ! 1026: : &netaddrs; ! 1027: mp -> m_next; ! 1028: mp = mp -> m_next) ! 1029: if (uleq (np -> m_host, mp -> m_next -> m_host) ! 1030: && uleq (np -> m_mbox, mp -> m_next -> m_mbox) ! 1031: && np -> m_bcc == mp -> m_next -> m_bcc) ! 1032: return 0; ! 1033: ! 1034: mp -> m_next = np; ! 1035: recipients++; ! 1036: return 1; ! 1037: } ! 1038: ! 1039: ! 1040: static pl () { ! 1041: register int i; ! 1042: register struct mailname *mp; ! 1043: ! 1044: printf ("-------\n\t-- Addresses --\nlocal:\t"); ! 1045: for (mp = localaddrs.m_next; mp; mp = mp -> m_next) ! 1046: printf ("%s%s%s", mp -> m_mbox, ! 1047: mp -> m_bcc ? "[BCC]" : "", ! 1048: mp -> m_next ? ",\n\t" : ""); ! 1049: ! 1050: printf ("\nnet:\t"); ! 1051: for (mp = netaddrs.m_next; mp; mp = mp -> m_next) ! 1052: printf ("%s%s@%s%s%s", mp -> m_path ? mp -> m_path : "", ! 1053: mp -> m_mbox, mp -> m_host, ! 1054: mp -> m_bcc ? "[BCC]" : "", ! 1055: mp -> m_next ? ",\n\t" : ""); ! 1056: ! 1057: printf ("\nuucp:\t"); ! 1058: for (mp = uuaddrs.m_next; mp; mp = mp -> m_next) ! 1059: printf ("%s!%s%s", mp -> m_host, mp -> m_mbox, ! 1060: mp -> m_bcc ? "[BCC]" : "", ! 1061: mp -> m_next ? ",\n\t" : ""); ! 1062: ! 1063: printf ("\n\t-- Folder Copies --\nfcc:\t"); ! 1064: for (i = 0; i < fccind; i++) ! 1065: printf ("%s%s", fccfold[i], i + 1 < fccind ? ",\n\t" : ""); ! 1066: printf ("\n"); ! 1067: } ! 1068: ! 1069: /* */ ! 1070: ! 1071: static anno () { ! 1072: register struct mailname *mp; ! 1073: ! 1074: for (mp = localaddrs.m_next; mp; mp = mp -> m_next) ! 1075: if (annoaux (mp) == NOTOK) ! 1076: goto oops; ! 1077: ! 1078: for (mp = netaddrs.m_next; mp; mp = mp -> m_next) ! 1079: if (annoaux (mp) == NOTOK) ! 1080: goto oops; ! 1081: ! 1082: for (mp = uuaddrs.m_next; mp; mp = mp -> m_next) ! 1083: if (annoaux (mp) == NOTOK) ! 1084: break; ! 1085: ! 1086: oops: ; ! 1087: (void) close (pfd); ! 1088: pfd = NOTOK; ! 1089: } ! 1090: ! 1091: ! 1092: static int annoaux (mp) ! 1093: register struct mailname *mp; ! 1094: { ! 1095: int i; ! 1096: char buffer[BUFSIZ]; ! 1097: ! 1098: (void) sprintf (buffer, "%s\n", adrformat (mp)); ! 1099: i = strlen (buffer); ! 1100: ! 1101: return (write (pfd, buffer, i) == i ? OK : NOTOK); ! 1102: } ! 1103: ! 1104: /* */ ! 1105: ! 1106: static insert_fcc (hdr, pp) ! 1107: register struct headers *hdr; ! 1108: register char *pp; ! 1109: { ! 1110: register char *cp; ! 1111: ! 1112: for (cp = pp; isspace (*cp); cp++) ! 1113: continue; ! 1114: for (pp += strlen (pp) - 1; pp > cp && isspace (*pp); pp--) ! 1115: continue; ! 1116: if (pp >= cp) ! 1117: *++pp = NULL; ! 1118: if (*cp == NULL) ! 1119: return; ! 1120: ! 1121: if (fccind >= FCCS) ! 1122: adios (NULLCP, "too many %ss", hdr -> value); ! 1123: fccfold[fccind++] = getcpy (cp); ! 1124: } ! 1125: ! 1126: /* BCC GENERATION */ ! 1127: ! 1128: static make_bcc_file () { ! 1129: int fd, ! 1130: i, ! 1131: child_id; ! 1132: char *vec[6]; ! 1133: register FILE *out; ! 1134: ! 1135: (void) strcpy (bccfil, m_tmpfil ("bccs")); ! 1136: if ((out = fopen (bccfil, "w")) == NULL) ! 1137: adios (bccfil, "unable to create"); ! 1138: (void) chmod (bccfil, 0600); ! 1139: ! 1140: fprintf (out, "Date: %s\n", dtime (&clock)); ! 1141: if (msgid) ! 1142: fprintf (out, "Message-ID: <%d.%ld@%s>\n", ! 1143: getpid (), clock, LocalName ()); ! 1144: fprintf (out, "From: %s\n", signature); ! 1145: if (subject) ! 1146: fprintf (out, "Subject: %s", subject); ! 1147: fprintf (out, "BCC:\n\n------- Blind-Carbon-Copy\n\n"); ! 1148: (void) fflush (out); ! 1149: ! 1150: if (filter == NULL) { ! 1151: if ((fd = open (tmpfil, 0)) == NOTOK) ! 1152: adios (NULLCP, "unable to re-open"); ! 1153: cpydgst (fd, fileno (out), tmpfil, bccfil); ! 1154: (void) close (fd); ! 1155: } ! 1156: else { ! 1157: vec[0] = r1bindex (mhlproc, '/'); ! 1158: ! 1159: for (i = 0; (child_id = fork ()) == NOTOK && i < 5; i++) ! 1160: sleep (5); ! 1161: switch (child_id) { ! 1162: case NOTOK: ! 1163: adios ("fork", "unable to"); ! 1164: ! 1165: case OK: ! 1166: (void) dup2 (fileno (out), 1); ! 1167: ! 1168: i = 1; ! 1169: vec[i++] = "-forward"; ! 1170: vec[i++] = "-form"; ! 1171: vec[i++] = filter; ! 1172: vec[i++] = tmpfil; ! 1173: vec[i] = NULL; ! 1174: ! 1175: execvp (mhlproc, vec); ! 1176: fprintf (stderr, "unable to exec "); ! 1177: perror (mhlproc); ! 1178: _exit (-1); ! 1179: ! 1180: default: ! 1181: (void) pidXwait (child_id, mhlproc); ! 1182: break; ! 1183: } ! 1184: } ! 1185: ! 1186: (void) fseek (out, 0L, 2); ! 1187: fprintf (out, "\n------- End of Blind-Carbon-Copy\n"); ! 1188: (void) fclose (out); ! 1189: } ! 1190: ! 1191: /* ADDRESS VERIFICATION */ ! 1192: ! 1193: static verify_all_addresses (talk) ! 1194: int talk; ! 1195: { ! 1196: #ifndef MHMTS ! 1197: int retval; ! 1198: #endif not MHMTS ! 1199: #ifdef MMDFMTS ! 1200: #ifdef RP_NS ! 1201: int len; ! 1202: struct rp_bufstruct reply; ! 1203: #endif RP_NS ! 1204: #endif MMDFMTS ! 1205: register struct mailname *lp; ! 1206: ! 1207: #ifndef MHMTS ! 1208: sigon (); ! 1209: #endif not MHMTS ! 1210: ! 1211: #ifdef MMDFMTS ! 1212: if (!whomsw || checksw) { ! 1213: if (rp_isbad (retval = mm_init ()) ! 1214: || rp_isbad (retval = mm_sbinit ()) ! 1215: || rp_isbad (retval = mm_winit (NULLCP, submitopts, from))) ! 1216: die (NULLCP, "problem initializing MMDF system [%s]", ! 1217: rp_valstr (retval)); ! 1218: #ifdef RP_NS ! 1219: if (rp_isbad (retval = mm_rrply (&reply, &len))) ! 1220: die (NULLCP, "problem with sender address [%s]", ! 1221: rp_valstr (retval)); ! 1222: #endif RP_NS ! 1223: } ! 1224: #endif MMDFMTS ! 1225: #ifdef SENDMTS ! 1226: if (!whomsw || checksw) ! 1227: if (rp_isbad (retval = sm_init (clientsw, serversw, 0, 0, snoop)) ! 1228: || rp_isbad (retval = sm_winit (smtpmode, from))) ! 1229: die (NULLCP, "problem initializing server; %s", ! 1230: rp_string (retval)); ! 1231: #endif SENDMTS ! 1232: ! 1233: if (talk && !whomsw) ! 1234: printf (" -- Address Verification --\n"); ! 1235: #ifndef BERK ! 1236: if (talk && localaddrs.m_next) ! 1237: printf (" -- Local Recipients --\n"); ! 1238: #endif BERK ! 1239: for (lp = localaddrs.m_next; lp; lp = lp -> m_next) ! 1240: do_an_address (lp, talk, encryptsw); ! 1241: ! 1242: #ifndef BERK ! 1243: if (talk && uuaddrs.m_next) ! 1244: printf (" -- UUCP Recipients --\n"); ! 1245: #endif BERK ! 1246: for (lp = uuaddrs.m_next; lp; lp = lp -> m_next) ! 1247: do_an_address (lp, talk, encryptsw); ! 1248: ! 1249: #ifndef BERK ! 1250: if (talk && netaddrs.m_next) ! 1251: printf (" -- Network Recipients --\n"); ! 1252: #endif BERK ! 1253: for (lp = netaddrs.m_next; lp; lp = lp -> m_next) ! 1254: do_an_address (lp, talk, encryptsw); ! 1255: ! 1256: chkadr (); ! 1257: if (talk && !whomsw) ! 1258: printf (" -- Address Verification Successful --\n"); ! 1259: ! 1260: #ifdef MMDFMTS ! 1261: if (!whomsw || checksw) ! 1262: (void) mm_end (NOTOK); ! 1263: #endif MMDFMTS ! 1264: #ifdef SENDMTS ! 1265: if (!whomsw || checksw) ! 1266: (void) sm_end (DONE); ! 1267: #endif SENDMTS ! 1268: (void) fflush (stdout); ! 1269: ! 1270: #ifndef MHMTS ! 1271: sigoff (); ! 1272: #endif not MHMTS ! 1273: } ! 1274: ! 1275: /* */ ! 1276: ! 1277: static chkadr () { ! 1278: #define plural(x) (x == 1 ? "" : "s") ! 1279: ! 1280: if (badadr && unkadr) ! 1281: die (NULLCP, "%d address%s unparsable, %d addressee%s undeliverable", ! 1282: badadr, plural (badadr), unkadr, plural (badadr)); ! 1283: if (badadr) ! 1284: die (NULLCP, "%d address%s unparsable", badadr, plural (badadr)); ! 1285: if (unkadr) ! 1286: die (NULLCP, "%d addressee%s undeliverable", unkadr, plural (unkadr)); ! 1287: } ! 1288: ! 1289: /* MTS INTERACTION */ ! 1290: ! 1291: #ifdef TMA ! 1292: static postplain (file, bccque, talk) ! 1293: #else TMA ! 1294: static post (file, bccque, talk) ! 1295: #endif TMA ! 1296: register char *file; ! 1297: int bccque, ! 1298: talk; ! 1299: { ! 1300: int fd; ! 1301: #ifndef MHMTS ! 1302: int retval; ! 1303: #ifdef MMDFMTS ! 1304: #ifdef RP_NS ! 1305: int len; ! 1306: struct rp_bufstruct reply; ! 1307: #endif RP_NS ! 1308: #endif MMDFMTS ! 1309: #else MHMTS ! 1310: int ud; ! 1311: #endif MHMTS ! 1312: ! 1313: if (verbose) ! 1314: if (msgflags & MINV) ! 1315: printf (" -- Posting for %s Recipients --\n", ! 1316: bccque ? "Blind" : "Sighted"); ! 1317: else ! 1318: printf (" -- Posting for All Recipients --\n"); ! 1319: ! 1320: sigon (); ! 1321: ! 1322: #ifdef MMDFMTS ! 1323: if (rp_isbad (retval = mm_init ()) ! 1324: || rp_isbad (retval = mm_sbinit ()) ! 1325: || rp_isbad (retval = mm_winit (NULLCP, submitopts, from))) ! 1326: die (NULLCP, "problem initializing MMDF system [%s]", ! 1327: rp_valstr (retval)); ! 1328: #ifdef RP_NS ! 1329: if (rp_isbad (retval = mm_rrply (&reply, &len))) ! 1330: die (NULLCP, "problem with sender address [%s]", ! 1331: rp_valstr (retval)); ! 1332: #endif RP_NS ! 1333: #endif MMDFMTS ! 1334: #ifdef SENDMTS ! 1335: if (rp_isbad (retval = sm_init (clientsw, serversw, watch, verbose, snoop)) ! 1336: || rp_isbad (retval = sm_winit (smtpmode, from))) ! 1337: die (NULLCP, "problem initializing server; %s", rp_string (retval)); ! 1338: #endif SENDMTS ! 1339: ! 1340: #ifndef MHMTS ! 1341: do_addresses (bccque, talk && verbose); ! 1342: if ((fd = open (file, 0)) == NOTOK) ! 1343: die (file, "unable to re-open"); ! 1344: do_text (file, fd); ! 1345: #else MHMTS ! 1346: if ((fd = open (file, 0)) == NULL) ! 1347: adios (file, "unable to re-open"); ! 1348: #ifdef MF ! 1349: ud = UucpChan () && uuaddrs.m_next ? make_uucp_file (fd) : NOTOK; ! 1350: #else not MF ! 1351: ud = NOTOK; ! 1352: #endif not MF ! 1353: do_addresses (file, fd, ud, bccque, talk && verbose); ! 1354: if (ud != NOTOK) ! 1355: (void) close (ud); ! 1356: #endif MHMTS ! 1357: (void) close (fd); ! 1358: (void) fflush (stdout); ! 1359: ! 1360: #ifdef MMDFMTS ! 1361: (void) mm_sbend (); ! 1362: (void) mm_end (OK); ! 1363: #endif MMDFMTS ! 1364: #ifdef SENDMTS ! 1365: (void) sm_end (!(msgflags & MINV) || bccque ? OK : DONE); ! 1366: #endif SENDMTS ! 1367: ! 1368: sigoff (); ! 1369: ! 1370: if (verbose) ! 1371: if (msgflags & MINV) ! 1372: printf (" -- %s Recipient Copies Posted --\n", ! 1373: bccque ? "Blind" : "Sighted"); ! 1374: else ! 1375: printf (" -- Recipient Copies Posted --\n"); ! 1376: (void) fflush (stdout); ! 1377: } ! 1378: ! 1379: /* */ ! 1380: ! 1381: #ifdef TMA ! 1382: static postcipher (file, bccque, talk) ! 1383: register char *file; ! 1384: int bccque, ! 1385: talk; ! 1386: { ! 1387: int fdP, ! 1388: state; ! 1389: char reason[BUFSIZ]; ! 1390: struct mailname *lp; ! 1391: ! 1392: if (verbose) ! 1393: if (msgflags & MINV) ! 1394: printf (" -- Posting for %s Recipients --\n", ! 1395: bccque ? "Blind" : "Sighted"); ! 1396: else ! 1397: printf (" -- Posting for All Recipients --\n"); ! 1398: ! 1399: if ((fdP = open (file, 0)) == NOTOK) ! 1400: adios (file, "unable to re-open"); ! 1401: if (ciphinit (fdP, reason) == NOTOK) ! 1402: adios (NULLCP, "%s", reason); ! 1403: (void) close (fdP); ! 1404: ! 1405: for (state = 0, lp = localaddrs.m_next; lp; lp = lp -> m_next) ! 1406: if (lp -> m_bcc ? bccque : !bccque) { ! 1407: #ifndef BERK ! 1408: if (talk && !state) ! 1409: printf (" -- Local Recipients --\n"); ! 1410: #endif BERK ! 1411: do_a_cipher (lp, talk); ! 1412: #ifndef BERK ! 1413: state++; ! 1414: #endif BERK ! 1415: } ! 1416: ! 1417: for (state = 0, lp = uuaddrs.m_next; lp; lp = lp -> m_next) ! 1418: if (lp -> m_bcc ? bccque : !bccque) { ! 1419: #ifndef BERK ! 1420: if (talk && !state) ! 1421: printf (" -- UUCP Recipients --\n"); ! 1422: #endif BERK ! 1423: do_a_cipher (lp, talk); ! 1424: #ifndef BERK ! 1425: state++; ! 1426: #endif BERK ! 1427: } ! 1428: ! 1429: for (state = 0, lp = netaddrs.m_next; lp; lp = lp -> m_next) ! 1430: if (lp -> m_bcc ? bccque : !bccque) { ! 1431: #ifndef BERK ! 1432: if (talk && !state) ! 1433: printf (" -- Network Recipients --\n"); ! 1434: #endif BERK ! 1435: do_a_cipher (lp, talk); ! 1436: #ifndef BERK ! 1437: state++; ! 1438: #endif BERK ! 1439: } ! 1440: ! 1441: if (ciphdone (reason) == NOTOK) ! 1442: admonish (NULLCP, "%s", reason); ! 1443: #ifdef SENDMTS ! 1444: if (!(msgflags & MINV) || bccque) ! 1445: (void) sm_end (OK); ! 1446: #endif SENDMTS ! 1447: ! 1448: if (verbose) ! 1449: if (msgflags & MINV) ! 1450: printf (" -- %s Recipient Copies Posted --\n", ! 1451: bccque ? "Blind" : "Sighted"); ! 1452: else ! 1453: printf (" -- Recipient Copies Posted --\n"); ! 1454: (void) fflush (stdout); ! 1455: } ! 1456: ! 1457: /* */ ! 1458: ! 1459: static do_a_cipher (lp, talk) ! 1460: register struct mailname *lp; ! 1461: int talk; ! 1462: { ! 1463: int fd, ! 1464: retval; ! 1465: register char *mbox, ! 1466: *host; ! 1467: char addr[BUFSIZ], ! 1468: reason[BUFSIZ]; ! 1469: #ifdef MMDFMTS ! 1470: #ifdef RP_NS ! 1471: int len; ! 1472: struct rp_bufstruct reply; ! 1473: #endif RP_NS ! 1474: #endif MMDFMTS ! 1475: ! 1476: sigon (); ! 1477: ! 1478: #ifdef MMDFMTS ! 1479: if (rp_isbad (retval = mm_init ()) ! 1480: || rp_isbad (retval = mm_sbinit ()) ! 1481: || rp_isbad (retval = mm_winit (NULL, submitopts, from))) ! 1482: die (NULLCP, "problem initializing MMDF system [%s]", ! 1483: rp_valstr (retval)); ! 1484: #ifdef RP_NS ! 1485: if (rp_isbad (retval = mm_rrply (&reply, &len))) ! 1486: die (NULLCP, "problem with sender address [%s]", ! 1487: rp_valstr (retval)); ! 1488: #endif RP_NS ! 1489: #endif MMDFMTS ! 1490: #ifdef SENDMTS ! 1491: if (rp_isbad (retval = sm_init (clientsw, serversw, watch, verbose, snoop)) ! 1492: || rp_isbad (retval = sm_winit (smtpmode, from))) ! 1493: die (NULLCP, "problem initializing server; %s", rp_string (retval)); ! 1494: #endif SENDMTS ! 1495: ! 1496: do_an_address (lp, talk, 0); ! 1497: ! 1498: switch (lp -> m_type) { ! 1499: case LOCALHOST: ! 1500: mbox = lp -> m_mbox; ! 1501: host = LocalName (); ! 1502: (void) strcpy (addr, mbox); ! 1503: break; ! 1504: ! 1505: case UUCPHOST: ! 1506: #ifdef MMDFMTS ! 1507: mbox = concat (lp -> m_host, "!", lp -> m_mbox, NULLCP); ! 1508: host = UucpChan (); ! 1509: #endif MMDFMTS ! 1510: #ifdef SENDMTS ! 1511: mbox = auxformat (lp, 0); ! 1512: host = NULL; ! 1513: #endif SENDMTS ! 1514: (void) sprintf (addr, "%s!%s", lp -> m_host, lp -> m_mbox); ! 1515: break; ! 1516: ! 1517: default: ! 1518: mbox = lp -> m_mbox; ! 1519: host = lp -> m_host; ! 1520: (void) sprintf (addr, "%s at %s", lp -> m_mbox, lp -> m_host); ! 1521: break; ! 1522: } ! 1523: chkadr (); /* XXX */ ! 1524: ! 1525: #ifdef MMDFMTS ! 1526: if (rp_isbad (retval = mm_waend ())) ! 1527: die (NULLCP, "problem ending addresses [%s]\n", ! 1528: rp_valstr (retval)); ! 1529: #endif MMDFMTS ! 1530: #ifdef SENDMTS ! 1531: if (rp_isbad (retval = sm_waend ())) ! 1532: die (NULLCP, "problem ending addresses; %s", rp_string (retval)); ! 1533: #endif SENDMTS ! 1534: ! 1535: if ((fd = encipher (mbox, host, reason)) == NOTOK) ! 1536: die (NULLCP, "%s: %s", addr, reason); ! 1537: do_text ("temporary file", fd); ! 1538: (void) close (fd); ! 1539: (void) fflush (stdout); ! 1540: ! 1541: #ifdef MMDFMTS ! 1542: (void) mm_sbend (); ! 1543: (void) mm_end (OK); ! 1544: #endif MMDFMTS ! 1545: #ifdef SENDMTS ! 1546: (void) sm_end (DONE); ! 1547: #endif SENDMTS ! 1548: ! 1549: sigoff (); ! 1550: } ! 1551: #endif TMA ! 1552: ! 1553: /* */ ! 1554: ! 1555: #ifndef MHMTS ! 1556: static do_addresses (bccque, talk) ! 1557: #else MHMTS ! 1558: static do_addresses (file, fd, ud, bccque, talk) ! 1559: register char *file; ! 1560: int fd, ! 1561: ud; ! 1562: #endif MHMTS ! 1563: int bccque, ! 1564: talk; ! 1565: { ! 1566: int retval; ! 1567: #ifndef BERK ! 1568: int state; ! 1569: #endif not BERK ! 1570: register struct mailname *lp; ! 1571: ! 1572: #ifndef BERK ! 1573: state = 0; ! 1574: #endif not BERK ! 1575: for (lp = localaddrs.m_next; lp; lp = lp -> m_next) ! 1576: if (lp -> m_bcc ? bccque : !bccque) { ! 1577: #ifndef BERK ! 1578: if (talk && !state) ! 1579: printf (" -- Local Recipients --\n"); ! 1580: #endif not BERK ! 1581: #ifndef MHMTS ! 1582: do_an_address (lp, talk, 0); ! 1583: #else MHMTS ! 1584: localmail (lp, talk, fd); ! 1585: #endif MHMTS ! 1586: #ifndef BERK ! 1587: state++; ! 1588: #endif not BERK ! 1589: } ! 1590: ! 1591: #ifndef BERK ! 1592: state = 0; ! 1593: #endif not BERK ! 1594: for (lp = uuaddrs.m_next; lp; lp = lp -> m_next) ! 1595: if (lp -> m_bcc ? bccque : !bccque) { ! 1596: #ifndef BERK ! 1597: if (talk && !state) ! 1598: printf (" -- UUCP Recipients --\n"); ! 1599: #endif not BERK ! 1600: #ifndef MHMTS ! 1601: do_an_address (lp, talk, 0); ! 1602: #else MHMTS ! 1603: uucpmail (lp, talk, ud != NOTOK ? ud : fd, ud == NOTOK); ! 1604: #endif MHMTS ! 1605: #ifndef BERK ! 1606: state++; ! 1607: #endif not BERK ! 1608: } ! 1609: ! 1610: #ifndef BERK ! 1611: state = 0; ! 1612: #endif not BERK ! 1613: for (lp = netaddrs.m_next; lp; lp = lp -> m_next) ! 1614: if (lp -> m_bcc ? bccque : !bccque) { ! 1615: #ifndef BERK ! 1616: if (talk && !state) ! 1617: printf (" -- Network Recipients --\n"); ! 1618: #endif not BERK ! 1619: #ifndef MHMTS ! 1620: do_an_address (lp, talk, 0); ! 1621: #else MHMTS ! 1622: netmail (talk, fd, bccque); ! 1623: #endif MHMTS ! 1624: #ifndef BERK ! 1625: state++; ! 1626: #endif not BERK ! 1627: } ! 1628: ! 1629: /* */ ! 1630: ! 1631: chkadr (); ! 1632: ! 1633: #ifdef MMDFMTS ! 1634: if (rp_isbad (retval = mm_waend ())) ! 1635: die (NULLCP, "problem ending addresses [%s]\n", ! 1636: rp_valstr (retval)); ! 1637: #endif MMDFMTS ! 1638: #ifdef SENDMTS ! 1639: if (rp_isbad (retval = sm_waend ())) ! 1640: die (NULLCP, "problem ending addresses; %s", rp_string (retval)); ! 1641: #endif SENDMTS ! 1642: } ! 1643: ! 1644: /* */ ! 1645: ! 1646: #ifndef MHMTS ! 1647: static do_text (file, fd) ! 1648: register char *file; ! 1649: int fd; ! 1650: { ! 1651: int retval, ! 1652: state; ! 1653: char buf[BUFSIZ]; ! 1654: #ifdef MMDFMTS ! 1655: struct rp_bufstruct reply; ! 1656: #endif MMDFMTS ! 1657: ! 1658: (void) lseek (fd, 0L, 0); ! 1659: while ((state = read (fd, buf, sizeof buf)) > 0) ! 1660: #ifdef MMDFMTS ! 1661: if (rp_isbad (mm_wtxt (buf, state))) ! 1662: die (NULLCP, "problem writing text [%s]\n", rp_valstr (retval)); ! 1663: #endif MMDFMTS ! 1664: #ifdef SENDMTS ! 1665: if (rp_isbad (retval = sm_wtxt (buf, state))) ! 1666: die (NULLCP, "problem writing text; %s\n", rp_string (retval)); ! 1667: #endif SENDMTS ! 1668: ! 1669: if (state == NOTOK) ! 1670: die (file, "problem reading from"); ! 1671: ! 1672: #ifdef MMDFMTS ! 1673: if (rp_isbad (retval = mm_wtend ())) ! 1674: die (NULLCP, "problem ending text [%s]\n", rp_valstr (retval)); ! 1675: ! 1676: if (rp_isbad (retval = mm_rrply (&reply, &state))) ! 1677: die (NULLCP, "problem getting submission status [%s]\n", ! 1678: rp_valstr (retval)); ! 1679: ! 1680: switch (rp_gval (reply.rp_val)) { ! 1681: case RP_OK: ! 1682: case RP_MOK: ! 1683: break; ! 1684: ! 1685: case RP_NO: ! 1686: die (NULLCP, "you lose; %s", reply.rp_line); ! 1687: ! 1688: case RP_NDEL: ! 1689: die (NULLCP, "no delivery occurred; %s", reply.rp_line); ! 1690: ! 1691: case RP_AGN: ! 1692: die (NULLCP, "try again later; %s", reply.rp_line); ! 1693: ! 1694: case RP_NOOP: ! 1695: die (NULLCP, "nothing done; %s", reply.rp_line); ! 1696: ! 1697: default: ! 1698: die (NULLCP, "unexpected response;\n\t[%s] -- %s", ! 1699: rp_valstr (reply.rp_val), reply.rp_line); ! 1700: } ! 1701: #endif MMDFMTS ! 1702: #ifdef SENDMTS ! 1703: switch (retval = sm_wtend ()) { ! 1704: case RP_OK: ! 1705: break; ! 1706: ! 1707: case RP_NO: ! 1708: case RP_NDEL: ! 1709: die (NULLCP, "posting failed; %s", rp_string (retval)); ! 1710: ! 1711: default: ! 1712: die (NULLCP, "unexpected response; %s", rp_string (retval)); ! 1713: } ! 1714: #endif SENDMTS ! 1715: } ! 1716: #endif not MHMTS ! 1717: ! 1718: /* MTS-SPECIFIC INTERACTION */ ! 1719: ! 1720: #ifdef MMDFMTS ! 1721: ! 1722: #ifndef TMA ! 1723: /* ARGSUSED */ ! 1724: #endif TMA ! 1725: ! 1726: static do_an_address (lp, talk, tma) ! 1727: register struct mailname *lp; ! 1728: int talk, ! 1729: tma; ! 1730: { ! 1731: int len, ! 1732: retval; ! 1733: register char *mbox, ! 1734: *host, ! 1735: *text, ! 1736: *path; ! 1737: char addr[BUFSIZ]; ! 1738: #ifdef TMA ! 1739: char reason[BUFSIZ]; ! 1740: #endif TMA ! 1741: struct rp_bufstruct reply; ! 1742: ! 1743: switch (lp -> m_type) { ! 1744: case LOCALHOST: ! 1745: mbox = lp -> m_mbox; ! 1746: host = LocalName (); ! 1747: (void) strcpy (addr, mbox); ! 1748: break; ! 1749: ! 1750: case UUCPHOST: ! 1751: #ifdef MF ! 1752: mbox = concat (lp -> m_host, "!", lp -> m_mbox, NULLCP); ! 1753: host = UucpChan (); ! 1754: (void) strcpy (addr, mbox); ! 1755: break; ! 1756: #else MF ! 1757: fprintf (talk ? stdout : stderr, " %s!%s: %s\n", ! 1758: lp -> m_host, lp -> m_mbox, "not supported; UUCP address"); ! 1759: unkadr++; ! 1760: (void) fflush (stdout); ! 1761: return; ! 1762: #endif MF ! 1763: ! 1764: default: /* let MMDF decide if the host is bad */ ! 1765: mbox = lp -> m_mbox; ! 1766: host = lp -> m_host; ! 1767: (void) sprintf (addr, "%s at %s", mbox, host); ! 1768: break; ! 1769: } ! 1770: #ifdef TMA ! 1771: if ((!whomsw || checksw) ! 1772: && tma ! 1773: && seekaddr (mbox, host, reason) == NOTOK) { ! 1774: fprintf (talk ? stdout : stderr, " %s%s: %s\n", ! 1775: addr, "[TMA]", reason); ! 1776: unkadr++; ! 1777: } ! 1778: #endif TMA ! 1779: ! 1780: if (talk) ! 1781: printf (" %s%s", addr, whomsw && lp -> m_bcc ? "[BCC]" : ""); ! 1782: ! 1783: if (whomsw && !checksw) { ! 1784: (void) putchar ('\n'); ! 1785: return; ! 1786: } ! 1787: if (talk) ! 1788: printf (": "); ! 1789: (void) fflush (stdout); ! 1790: ! 1791: /* */ ! 1792: ! 1793: #ifdef MMDFII ! 1794: if (lp -> m_path) ! 1795: path = concat (lp -> m_path, mbox, "@", host, NULLCP); ! 1796: else ! 1797: #endif MMDFII ! 1798: path = NULLCP; ! 1799: if (rp_isbad (retval = mm_wadr (path ? NULLCP : host, path ? path : mbox)) ! 1800: || rp_isbad (retval = mm_rrply (&reply, &len))) ! 1801: die (NULLCP, "problem submitting address [%s]", rp_valstr (retval)); ! 1802: ! 1803: switch (rp_gval (reply.rp_val)) { ! 1804: case RP_AOK: ! 1805: if (talk) ! 1806: printf ("address ok\n"); ! 1807: (void) fflush (stdout); ! 1808: return; ! 1809: ! 1810: #ifdef RP_DOK ! 1811: case RP_DOK: ! 1812: if (talk) ! 1813: printf ("nameserver timeout - queued for checking\n"); ! 1814: (void) fflush (stdout); ! 1815: return; ! 1816: #endif RP_DOK ! 1817: ! 1818: case RP_NO: ! 1819: text = "you lose"; ! 1820: break; ! 1821: ! 1822: #ifdef RP_NS ! 1823: case RP_NS: ! 1824: text = "temporary nameserver failure"; ! 1825: break; ! 1826: ! 1827: #endif RP_NS ! 1828: ! 1829: case RP_USER: ! 1830: case RP_NDEL: ! 1831: text = "not deliverable"; ! 1832: break; ! 1833: ! 1834: case RP_AGN: ! 1835: text = "try again later"; ! 1836: break; ! 1837: ! 1838: case RP_NOOP: ! 1839: text = "nothing done"; ! 1840: break; ! 1841: ! 1842: default: ! 1843: if (!talk) ! 1844: fprintf (stderr, " %s: ", addr); ! 1845: text = "unexpected response"; ! 1846: die (NULLCP, "%s;\n [%s] -- %s", text, ! 1847: rp_valstr (reply.rp_val), reply.rp_line); ! 1848: } ! 1849: ! 1850: if (!talk) ! 1851: fprintf (stderr, " %s: ", addr); ! 1852: fprintf (talk ? stdout : stderr, "%s;\n %s\n", text, reply.rp_line); ! 1853: unkadr++; ! 1854: ! 1855: (void) fflush (stdout); ! 1856: } ! 1857: #endif MMDFMTS ! 1858: ! 1859: /* */ ! 1860: ! 1861: #ifdef MHMTS ! 1862: /* ARGSUSED */ ! 1863: ! 1864: static do_an_address (lp, talk, tma) ! 1865: register struct mailname *lp; ! 1866: int talk, ! 1867: tma; ! 1868: { ! 1869: register char *mbox; ! 1870: char addr[BUFSIZ]; ! 1871: ! 1872: switch (lp -> m_type) { ! 1873: case LOCALHOST: ! 1874: (void) strcpy (addr, lp -> m_mbox); ! 1875: break; ! 1876: ! 1877: case UUCPHOST: ! 1878: (void) sprintf (addr, "%s!%s", lp -> m_host, lp -> m_mbox); ! 1879: break; ! 1880: ! 1881: default: ! 1882: (void) sprintf (addr, "%s at %s", lp -> m_mbox, lp -> m_host); ! 1883: break; ! 1884: } ! 1885: if (talk) ! 1886: printf (" %s%s", addr, whomsw && lp -> m_bcc ? "[BCC]" : ""); ! 1887: ! 1888: if (whomsw && !checksw) { ! 1889: (void) putchar ('\n'); ! 1890: return; ! 1891: } ! 1892: if (talk) ! 1893: printf (": "); ! 1894: (void) fflush (stdout); ! 1895: ! 1896: /* */ ! 1897: ! 1898: switch (lp -> m_type) { ! 1899: case LOCALHOST: ! 1900: mbox = lp -> m_mbox; ! 1901: if (*mbox == '~') ! 1902: mbox++; ! 1903: if (seek_home (mbox)) { ! 1904: lp -> m_mbox = mbox; ! 1905: if (talk) ! 1906: printf ("address ok\n"); ! 1907: } ! 1908: else { ! 1909: if (!talk) ! 1910: fprintf (stderr, " %s: ", addr); ! 1911: fprintf (talk ? stdout : stderr, ! 1912: "not deliverable; unknown user\n"); ! 1913: unkadr++; ! 1914: } ! 1915: break; ! 1916: ! 1917: case UUCPHOST: ! 1918: if (uucpsite (lp -> m_host) == OK) { ! 1919: if (talk) ! 1920: printf ("address ok\n"); ! 1921: } ! 1922: else { ! 1923: if (!talk) ! 1924: fprintf (stderr, " %s: ", addr); ! 1925: fprintf (talk ? stdout : stderr, ! 1926: "not deliverable; unknown system\n"); ! 1927: unkadr++; ! 1928: } ! 1929: break; ! 1930: ! 1931: case NETHOST: ! 1932: if (talk) ! 1933: printf ("address ok\n"); ! 1934: break; ! 1935: ! 1936: default: ! 1937: if (!talk) ! 1938: fprintf (stderr, " %s: ", addr); ! 1939: fprintf (talk ? stdout : stderr, ! 1940: "not deliverable; unknown host\n"); ! 1941: unkadr++; ! 1942: break; ! 1943: } ! 1944: ! 1945: (void) fflush (stdout); ! 1946: } ! 1947: #endif MHMTS ! 1948: ! 1949: /* */ ! 1950: ! 1951: #ifdef SENDMTS ! 1952: ! 1953: #ifndef TMA ! 1954: /* ARGSUSED */ ! 1955: #endif TMA ! 1956: ! 1957: static do_an_address (lp, talk, tma) ! 1958: register struct mailname *lp; ! 1959: int talk, ! 1960: tma; ! 1961: { ! 1962: int retval; ! 1963: register char *mbox, ! 1964: *host; ! 1965: char addr[BUFSIZ]; ! 1966: #ifdef TMA ! 1967: char reason[BUFSIZ]; ! 1968: #endif TMA ! 1969: ! 1970: switch (lp -> m_type) { ! 1971: case LOCALHOST: ! 1972: mbox = lp -> m_mbox; ! 1973: host = lp -> m_host; ! 1974: (void) strcpy (addr, mbox); ! 1975: break; ! 1976: ! 1977: case UUCPHOST: ! 1978: mbox = auxformat (lp, 0); ! 1979: host = NULL; ! 1980: (void) sprintf (addr, "%s!%s", lp -> m_host, lp -> m_mbox); ! 1981: break; ! 1982: ! 1983: default: /* let SendMail decide if the host is bad */ ! 1984: mbox = lp -> m_mbox; ! 1985: host = lp -> m_host; ! 1986: (void) sprintf (addr, "%s at %s", mbox, host); ! 1987: break; ! 1988: } ! 1989: ! 1990: #ifdef TMA ! 1991: if ((!whomsw || checksw) ! 1992: && tma ! 1993: && seekaddr (mbox, host, reason) == NOTOK) { ! 1994: fprintf (talk ? stdout : stderr, " %s%s: %s\n", ! 1995: addr, "[TMA]", reason); ! 1996: unkadr++; ! 1997: } ! 1998: #endif TMA ! 1999: ! 2000: if (talk) ! 2001: printf (" %s%s", addr, whomsw && lp -> m_bcc ? "[BCC]" : ""); ! 2002: ! 2003: if (whomsw && !checksw) { ! 2004: (void) putchar ('\n'); ! 2005: return; ! 2006: } ! 2007: if (talk) ! 2008: printf (": "); ! 2009: (void) fflush (stdout); ! 2010: ! 2011: /* */ ! 2012: ! 2013: switch (retval = sm_wadr (mbox, host, ! 2014: lp -> m_type != UUCPHOST ? lp -> m_path : NULLCP)) { ! 2015: case RP_OK: ! 2016: if (talk) ! 2017: printf ("address ok\n"); ! 2018: break; ! 2019: ! 2020: case RP_NO: ! 2021: case RP_USER: ! 2022: if (!talk) ! 2023: fprintf (stderr, " %s: ", addr); ! 2024: fprintf (talk ? stdout : stderr, "loses; %s\n", ! 2025: rp_string (retval)); ! 2026: unkadr++; ! 2027: break; ! 2028: ! 2029: default: ! 2030: if (!talk) ! 2031: fprintf (stderr, " %s: ", addr); ! 2032: die (NULLCP, "unexpected response; %s", rp_string (retval)); ! 2033: } ! 2034: ! 2035: (void) fflush (stdout); ! 2036: } ! 2037: #endif SENDMTS ! 2038: ! 2039: /* SIGNAL HANDLING */ ! 2040: ! 2041: #ifndef MHMTS ! 2042: ! 2043: /* ARGSUSED */ ! 2044: ! 2045: static int sigser (i) ! 2046: int i; ! 2047: { ! 2048: #ifndef BSD42 ! 2049: (void) signal (i, SIG_IGN); ! 2050: #endif not BSD42 ! 2051: (void) unlink (tmpfil); ! 2052: if (msgflags & MINV) ! 2053: (void) unlink (bccfil); ! 2054: #ifdef MMDFMTS ! 2055: if (!whomsw || checksw) ! 2056: (void) mm_end (NOTOK); ! 2057: #endif MMDFMTS ! 2058: #ifdef SENDMTS ! 2059: if (!whomsw || checksw) ! 2060: (void) sm_end (NOTOK); ! 2061: #endif SENDMTS ! 2062: done (1); ! 2063: } ! 2064: #endif not MHMTS ! 2065: ! 2066: ! 2067: static sigon () { ! 2068: if (debug) ! 2069: return; ! 2070: ! 2071: #ifndef MHMTS ! 2072: setsigx (hstat, SIGHUP, sigser); ! 2073: setsigx (istat, SIGINT, sigser); ! 2074: setsigx (qstat, SIGQUIT, sigser); ! 2075: setsigx (tstat, SIGTERM, sigser); ! 2076: #else MHMTS ! 2077: setsigx (hstat, SIGHUP, SIG_IGN); ! 2078: setsigx (istat, SIGINT, SIG_IGN); ! 2079: setsigx (qstat, SIGQUIT, SIG_IGN); ! 2080: setsigx (tstat, SIGTERM, SIG_IGN); ! 2081: #endif MHMTS ! 2082: } ! 2083: ! 2084: ! 2085: static sigoff () { ! 2086: if (debug) ! 2087: return; ! 2088: ! 2089: (void) signal (SIGHUP, hstat); ! 2090: (void) signal (SIGINT, istat); ! 2091: (void) signal (SIGQUIT, qstat); ! 2092: (void) signal (SIGTERM, tstat); ! 2093: } ! 2094: ! 2095: /* FCC INTERACTION */ ! 2096: ! 2097: static refile (file) ! 2098: register char *file; ! 2099: { ! 2100: register int i; ! 2101: ! 2102: if (fccind == 0) ! 2103: return; ! 2104: ! 2105: #ifdef MHMTS ! 2106: (void) setuid (myuid); ! 2107: #endif MHMTS ! 2108: if (verbose) ! 2109: printf (" -- Filing Folder Copies --\n"); ! 2110: for (i = 0; i < fccind; i++) ! 2111: fcc (file, fccfold[i]); ! 2112: if (verbose) ! 2113: printf (" -- Folder Copies Filed --\n"); ! 2114: } ! 2115: ! 2116: ! 2117: static fcc (file, folder) ! 2118: register char *file, ! 2119: *folder; ! 2120: { ! 2121: int i, ! 2122: child_id, ! 2123: status; ! 2124: char fold[BUFSIZ]; ! 2125: ! 2126: if (verbose) ! 2127: printf (" %sFcc %s: ", msgstate == RESENT ? "Resent-" : "", folder); ! 2128: (void) fflush (stdout); ! 2129: ! 2130: for (i = 0; (child_id = fork ()) == NOTOK && i < 5; i++) ! 2131: sleep (5); ! 2132: switch (child_id) { ! 2133: case NOTOK: ! 2134: if (!verbose) ! 2135: fprintf (stderr, " %sFcc %s: ", ! 2136: msgstate == RESENT ? "Resent-" : "", folder); ! 2137: fprintf (verbose ? stdout : stderr, "no forks, so not ok\n"); ! 2138: break; ! 2139: ! 2140: case OK: ! 2141: (void) sprintf (fold, "%s%s", ! 2142: *folder == '+' || *folder == '@' ? "" : "+", folder); ! 2143: execlp (fileproc, r1bindex (fileproc, '/'), ! 2144: "-link", "-file", file, fold, NULLCP); ! 2145: _exit (-1); ! 2146: ! 2147: default: ! 2148: if (status = pidwait (child_id, OK)) { ! 2149: if (!verbose) ! 2150: fprintf (stderr, " %sFcc %s: ", ! 2151: msgstate == RESENT ? "Resent-" : "", folder); ! 2152: (void) pidstatus (status, verbose ? stdout : stderr, NULLCP); ! 2153: } ! 2154: else ! 2155: if (verbose) ! 2156: printf ("folder ok\n"); ! 2157: } ! 2158: ! 2159: (void) fflush (stdout); ! 2160: } ! 2161: ! 2162: /* TERMINATION */ ! 2163: ! 2164: /* VARARGS2 */ ! 2165: ! 2166: static die (what, fmt, a, b, c, d) ! 2167: char *what, ! 2168: *fmt, ! 2169: *a, ! 2170: *b, ! 2171: *c, ! 2172: *d; ! 2173: { ! 2174: #ifndef MHMTS ! 2175: (void) unlink (tmpfil); ! 2176: if (msgflags & MINV) ! 2177: (void) unlink (bccfil); ! 2178: #endif MHMTS ! 2179: #ifdef MMDFMTS ! 2180: if (!whomsw || checksw) ! 2181: (void) mm_end (NOTOK); ! 2182: #endif MMDFMTS ! 2183: #ifdef SENDMTS ! 2184: if (!whomsw || checksw) ! 2185: (void) sm_end (NOTOK); ! 2186: #endif SENDMTS ! 2187: ! 2188: adios (what, fmt, a, b, c, d); ! 2189: } ! 2190: ! 2191: ! 2192: #ifdef MMDFMTS ! 2193: /* ! 2194: * err_abrt() is used by the mm_ routines ! 2195: * do not, under *ANY* circumstances, remove it from post, ! 2196: * or you will lose *BIG* ! 2197: */ ! 2198: ! 2199: err_abrt (code, fmt, a, b, c) ! 2200: int code; ! 2201: char *fmt, ! 2202: *a, ! 2203: *b, ! 2204: *c; ! 2205: { ! 2206: char buffer[BUFSIZ]; ! 2207: ! 2208: (void) sprintf (buffer, "[%s]", rp_valstr (code)); ! 2209: ! 2210: adios (buffer, fmt, a, b, c); ! 2211: } ! 2212: #endif MMDFMTS ! 2213: ! 2214: /* STAND-ALONE DELIVERY */ ! 2215: ! 2216: #ifdef MHMTS ! 2217: ! 2218: /* BUG: MHMTS ignores 822-style route addresses... */ ! 2219: ! 2220: static localmail (lp, talk, fd) ! 2221: register struct mailname *lp; ! 2222: int talk, ! 2223: fd; ! 2224: { ! 2225: int md; ! 2226: char mailbox[BUFSIZ], ! 2227: ddate[BUFSIZ]; ! 2228: register struct home *hp; ! 2229: ! 2230: if (talk) ! 2231: printf (" %s: ", lp -> m_mbox); ! 2232: (void) fflush (stdout); ! 2233: ! 2234: if ((hp = seek_home (lp -> m_mbox)) == NULL) { ! 2235: if (!talk) ! 2236: fprintf (stderr, " %s: ", lp -> m_mbox); ! 2237: fprintf (talk ? stdout : stderr, ! 2238: "not deliverable; unknown address\n"); ! 2239: unkadr++; ! 2240: return; ! 2241: } ! 2242: ! 2243: (void) sprintf (mailbox, "%s/%s", ! 2244: mmdfldir[0] ? mmdfldir : hp -> h_home, ! 2245: mmdflfil[0] ? mmdflfil : hp -> h_name); ! 2246: ! 2247: /* */ ! 2248: ! 2249: switch (access (slocalproc, 01)) { ! 2250: default: ! 2251: if (talk) ! 2252: printf ("(invoking hook)\n\t"); ! 2253: (void) fflush (stdout); ! 2254: ! 2255: if (usr_hook (lp, talk, fd, hp, mailbox) != NOTOK) ! 2256: return; ! 2257: if (talk) ! 2258: printf (" %s: ", lp -> m_mbox); ! 2259: (void) fflush (stdout); ! 2260: ! 2261: case NOTOK: ! 2262: (void) lseek (fd, 0L, 0); ! 2263: if ((md = mbx_open (mailbox, hp -> h_uid, hp -> h_gid, m_gmprot ())) ! 2264: == NOTOK) { ! 2265: if (!talk) ! 2266: fprintf (stderr, " %s: ", lp -> m_mbox); ! 2267: fprintf (talk ? stdout : stderr, ! 2268: "error in transmission; unable to open maildrop\n"); ! 2269: unkadr++; ! 2270: return; ! 2271: } ! 2272: (void) sprintf (ddate, "Delivery-Date: %s\n", dtimenow ()); ! 2273: if (mbx_copy (mailbox, md, fd, 0, ddate, 0) == NOTOK) { ! 2274: if (!talk) ! 2275: fprintf (stderr, " %s: ", lp -> m_mbox); ! 2276: fprintf (talk ? stdout : stderr, ! 2277: "error in transmission; write to maildrop failed\n"); ! 2278: unkadr++; ! 2279: (void) close (md); ! 2280: return; ! 2281: } ! 2282: mbx_close (mailbox, md); ! 2283: ! 2284: if (talk) ! 2285: printf ("sent\n"); ! 2286: break; ! 2287: } ! 2288: ! 2289: (void) fflush (stdout); ! 2290: } ! 2291: ! 2292: /* */ ! 2293: ! 2294: static int usr_hook (lp, talk, fd, hp, mailbox) ! 2295: register struct mailname *lp; ! 2296: int talk, ! 2297: fd; ! 2298: register struct home *hp; ! 2299: register char *mailbox; ! 2300: { ! 2301: int i, ! 2302: child_id, ! 2303: status; ! 2304: char tmpfil[BUFSIZ]; ! 2305: ! 2306: if ((fd = copyfile (fd, tmpfil)) == NOTOK) { ! 2307: if (!talk) ! 2308: fprintf (stderr, " %s: ", lp -> m_mbox); ! 2309: fprintf (talk ? stdout : stderr, ! 2310: "unable to copy message; skipping hook\n"); ! 2311: return NOTOK; ! 2312: } ! 2313: (void) chown (tmpfil, hp -> h_uid, hp -> h_gid); ! 2314: ! 2315: (void) fflush (stdout); ! 2316: ! 2317: for (i = 0; (child_id = fork ()) == NOTOK && i < 5; i++) ! 2318: sleep (5); ! 2319: switch (child_id) { ! 2320: case NOTOK: ! 2321: if (!talk) ! 2322: fprintf (stderr, " %s: ", lp -> m_mbox); ! 2323: fprintf (talk ? stdout : stderr, ! 2324: "unable to invoke hook; fork() failed\n"); ! 2325: return NOTOK; ! 2326: ! 2327: case OK: ! 2328: if (fd != 0) ! 2329: (void) dup2 (fd, 0); ! 2330: (void) freopen ("/dev/null", "w", stdout); ! 2331: (void) freopen ("/dev/null", "w", stderr); ! 2332: if (fd != 3) /* backwards compatible... */ ! 2333: (void) dup2 (fd, 3); ! 2334: closefds (4); ! 2335: #ifdef TIOCNOTTY ! 2336: if ((fd = open ("/dev/tty", 2)) != NOTOK) { ! 2337: (void) ioctl (fd, TIOCNOTTY, NULLCP); ! 2338: (void) close (fd); ! 2339: } ! 2340: #endif TIOCNOTTY ! 2341: #ifdef BSD42 ! 2342: (void) setpgrp (0, getpid ()); ! 2343: #endif BSD42 ! 2344: ! 2345: *environ = NULL; ! 2346: (void) putenv ("USER", hp -> h_name); ! 2347: (void) putenv ("HOME", hp -> h_home); ! 2348: (void) putenv ("SHELL", hp -> h_shell); ! 2349: if (chdir (hp -> h_home) == NOTOK) ! 2350: (void) chdir ("/"); ! 2351: (void) umask (0077); ! 2352: #ifdef BSD41A ! 2353: (void) inigrp (hp -> h_name, hp -> h_gid); ! 2354: #endif BSD41A ! 2355: (void) setgid (hp -> h_gid); ! 2356: #ifdef BSD42 ! 2357: (void) initgroups (hp -> h_name, hp -> h_gid); ! 2358: #endif BSD42 ! 2359: (void) setuid (hp -> h_uid); ! 2360: ! 2361: execlp (slocalproc, r1bindex (slocalproc, '/'), ! 2362: "-file", tmpfil, "-mailbox", mailbox, ! 2363: "-home", hp -> h_home, "-addr", lp -> m_aka, ! 2364: "-user", hp -> h_name, "-sender", from, ! 2365: talk ? "-verbose" : NULLCP, NULLCP); ! 2366: _exit (-1); ! 2367: ! 2368: /* */ ! 2369: ! 2370: default: ! 2371: (void) close (fd); ! 2372: ! 2373: status = pidwait (child_id, OK); ! 2374: ! 2375: (void) unlink (tmpfil); ! 2376: if (status == 0) { ! 2377: if (talk) ! 2378: printf ("accepted\n"); ! 2379: return OK; ! 2380: } ! 2381: if (!talk) ! 2382: fprintf (stderr, " %s: ", lp -> m_mbox); ! 2383: fprintf (talk ? stdout : stderr, ! 2384: "%s error on hook; status=0%o\n", ! 2385: status & 0x00ff ? "system" : "user", ! 2386: status & 0x00ff ? status & 0xff ! 2387: : (status & 0xff00) >> 8); ! 2388: return NOTOK; ! 2389: } ! 2390: } ! 2391: ! 2392: /* */ ! 2393: ! 2394: static int copyfile (qd, tmpfil) ! 2395: int qd; ! 2396: register char *tmpfil; ! 2397: { ! 2398: int i, ! 2399: fd; ! 2400: char buffer[BUFSIZ]; ! 2401: ! 2402: (void) strcpy (tmpfil, m_tmpfil ("hook")); ! 2403: if ((fd = creat (tmpfil, 0600)) == NOTOK) ! 2404: return NOTOK; ! 2405: (void) close (fd); ! 2406: if ((fd = open (tmpfil, 2)) == NOTOK) ! 2407: return NOTOK; ! 2408: ! 2409: (void) lseek (qd, 0L, 0); ! 2410: while ((i = read (qd, buffer, sizeof buffer)) > 0) ! 2411: if (write (fd, buffer, i) != i) { ! 2412: (void) close (fd); ! 2413: return NOTOK; ! 2414: } ! 2415: if (i == NOTOK) { ! 2416: (void) close (fd); ! 2417: return NOTOK; ! 2418: } ! 2419: ! 2420: (void) lseek (fd, 0L, 0); ! 2421: ! 2422: return fd; ! 2423: } ! 2424: ! 2425: /* */ ! 2426: ! 2427: static uucpmail (lp, talk, fd, from) ! 2428: register struct mailname *lp; ! 2429: int talk, ! 2430: fd, ! 2431: from; ! 2432: { ! 2433: int i; ! 2434: int (*pstat) (); ! 2435: char addr[BUFSIZ], ! 2436: buffer[BUFSIZ]; ! 2437: register FILE *fp; ! 2438: ! 2439: (void) sprintf (addr, "%s!%s", lp -> m_host, lp -> m_mbox); ! 2440: if (talk) ! 2441: printf (" %s: ", addr); ! 2442: (void) fflush (stdout); ! 2443: ! 2444: #ifndef UCI ! 2445: (void) sprintf (buffer, "uux -r -p %s!rmail \\(%s\\)", ! 2446: lp -> m_host, lp -> m_mbox); ! 2447: #else UCI ! 2448: (void) sprintf (buffer, "uux -p %s!rmail \\(%s\\)", lp -> m_host, ! 2449: lp -> m_mbox); ! 2450: #endif UCI ! 2451: if ((fp = popen (buffer, "w")) == NULL) { ! 2452: if (!talk) ! 2453: fprintf (stderr, " %s: ", addr); ! 2454: fprintf (talk ? stdout : stderr, ! 2455: "unable to start uux; popen() failed\n"); ! 2456: unkadr++; ! 2457: return; ! 2458: } ! 2459: ! 2460: pstat = signal (SIGPIPE, SIG_IGN); ! 2461: if (from) { /* no mail filtering, so... */ ! 2462: (void) sprintf (buffer, "From %s %.24s remote from %s\n", ! 2463: getusr (), ctime (&clock), SystemName ()); ! 2464: i = strlen (buffer); ! 2465: if (fwrite (buffer, sizeof *buffer, i, fp) != i) ! 2466: goto oops; ! 2467: } ! 2468: ! 2469: (void) lseek (fd, 0L, 0); ! 2470: while ((i = read (fd, buffer, sizeof buffer)) > 0) ! 2471: if (fwrite (buffer, sizeof *buffer, i, fp) != i) { ! 2472: oops: ; ! 2473: if (!talk) ! 2474: fprintf (stderr, " %s: ", addr); ! 2475: fprintf (talk ? stdout : stderr, ! 2476: "error in transmission; write to uux failed\n"); ! 2477: unkadr++; ! 2478: (void) pclose (fp); ! 2479: return; ! 2480: } ! 2481: if (pclose (fp)) ! 2482: goto oops; ! 2483: (void) signal (SIGPIPE, pstat); ! 2484: ! 2485: if (i < 0) { ! 2486: if (!talk) ! 2487: fprintf (stderr, " %s: ", addr); ! 2488: fprintf (talk ? stdout : stderr, ! 2489: "error in transmission; read failed\n"); ! 2490: unkadr++; ! 2491: return; ! 2492: } ! 2493: ! 2494: if (talk) ! 2495: printf ("queued (via uux)\n"); ! 2496: (void) fflush (stdout); ! 2497: } ! 2498: ! 2499: /* */ ! 2500: ! 2501: #ifdef MF ! 2502: static int make_uucp_file (td) ! 2503: int td; ! 2504: { ! 2505: int i, ! 2506: qd, ! 2507: fd; ! 2508: char tmpfil[BUFSIZ]; ! 2509: ! 2510: (void) lseek (td, 0L, 0); ! 2511: if ((qd = dup (td)) == NOTOK) ! 2512: adios ("fd", "unable to dup"); ! 2513: ! 2514: (void) strcpy (tmpfil, m_tmpfil ("uumf")); ! 2515: if ((fd = creat (tmpfil, 0600)) == NOTOK) ! 2516: adios (tmpfil, "unable to create"); ! 2517: (void) close (fd); ! 2518: if ((fd = open (tmpfil, 2)) == NOTOK) ! 2519: adios (tmpfil, "unable to re-open"); ! 2520: ! 2521: switch (i = mmdf2uucp (qd, fd, 1)) { ! 2522: case OK: ! 2523: if (!debug) ! 2524: (void) unlink (tmpfil); ! 2525: break; ! 2526: ! 2527: default: ! 2528: adios (NULLCP, "unable to filter mail(%d), examine %s", i, tmpfil); ! 2529: } ! 2530: (void) close (qd); ! 2531: ! 2532: return fd; ! 2533: } ! 2534: #endif MF ! 2535: ! 2536: /* */ ! 2537: ! 2538: static netmail (talk, fd, bccque) ! 2539: int talk, ! 2540: fd, ! 2541: bccque; ! 2542: { ! 2543: int i, ! 2544: naddrs; ! 2545: char buffer[BUFSIZ]; ! 2546: register struct mailname *lp; ! 2547: ! 2548: naddrs = 0; ! 2549: if (nm_init (getusr (), &clock) == NOTOK) { ! 2550: for (lp = netaddrs.m_next; lp; lp = lp -> m_next) ! 2551: if (lp -> m_bcc ? bccque : !bccque) ! 2552: fprintf (stderr, " %s at %s: unable to get queue file\n", ! 2553: lp -> m_mbox, lp -> m_host); ! 2554: return; ! 2555: } ! 2556: ! 2557: for (lp = netaddrs.m_next; lp; lp = lp -> m_next) ! 2558: if (lp -> m_bcc ? bccque : !bccque) { ! 2559: (void) nm_wadr (lp -> m_mbox, lp -> m_host); ! 2560: naddrs++; ! 2561: if (talk) ! 2562: printf (" %s at %s: queued\n", lp -> m_mbox, lp -> m_host); ! 2563: (void) fflush (stdout); ! 2564: } ! 2565: nm_waend (); ! 2566: ! 2567: (void) lseek (fd, 0L, 0); ! 2568: while ((i = read (fd, buffer, sizeof buffer)) > 0) ! 2569: if (nm_wtxt (buffer, i) == NOTOK) { ! 2570: fprintf (stderr, ! 2571: "error in transmission; write to temporary failed"); ! 2572: unkadr += naddrs; ! 2573: return; ! 2574: } ! 2575: ! 2576: if (i < 0) { ! 2577: fprintf (stderr, "error in transmission; read failed\n"); ! 2578: unkadr += naddrs; ! 2579: return; ! 2580: } ! 2581: ! 2582: if (nm_wtend () == NOTOK) { ! 2583: fprintf (stderr, "error in transmission; unable to queue message\n"); ! 2584: unkadr += naddrs; ! 2585: return; ! 2586: } ! 2587: } ! 2588: #endif MHMTS
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.