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

unix.superglobalmegacorp.com

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