Annotation of 43BSD/contrib/mh/uip/post.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.