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