Annotation of 43BSD/contrib/mh/zotnet/mf/mmdfI/src/uucp/rmail.c, revision 1.1

1.1     ! root        1: #define        MFDEBUG                 /* temporarily */
        !             2: 
        !             3: #include "util.h"
        !             4: #include "mmdf.h"
        !             5: #include <pwd.h>
        !             6: #include <signal.h>
        !             7: #include "mf.h"
        !             8: #include "tws.h"
        !             9: 
        !            10: /*
        !            11:  *                             R M A I L . C
        !            12:  *
        !            13:  *     Developed from the Berkeley mail program of the same name
        !            14:  *     by Mike Obrien at RAND to run with the MMDF mail system.
        !            15:  *     Rewritten by Doug Kingston, US Army Ballistics Research Laboratory
        !            16:  *     Hacked a lot by Steve Bellovin (smb@unc)
        !            17:  *
        !            18:  *     This program runs SETUID to root so that it can set effective and
        !            19:  *     real [ug]ids to mmdflogin.
        !            20:  *
        !            21:  *    27-Oct-82        Marshall T. Rose <mrose%uci@rand-relay>
        !            22:  *             Support proper munging by using the UCI mail filtering
        !            23:  *             routines (enabled by #ifdef MF)
        !            24:  *             Also use ll_log() package (enabled by #ifdef LOG)
        !            25:  *
        !            26:  *    17-Oct-83 Marshall T. Rose <mrose%uci@rand-relay>
        !            27:  *             New interfacing.  Remove the #ifdef:s
        !            28:  */
        !            29: 
        !            30: 
        !            31: #define NAMESZ  64      /* Limit on component name size         */
        !            32: 
        !            33: #define        ADDROK  0
        !            34: #define        UUCP    1
        !            35: #define        RETURN  2
        !            36: 
        !            37: int    Syscpy = 1;
        !            38: int    Tmpmode = 0600;
        !            39: char   *Fromtmp = "/tmp/rml.f.XXXXXX";
        !            40: char   *Msgtmp = "/tmp/rml.m.XXXXXX";
        !            41: char   *Errtmp = "/tmp/rml.e.XXXXXX";
        !            42: char   *Okhosts = "/usr/mmdf/table/rmail.ok";
        !            43: char   *Okdests = "/usr/mmdf/table/rmail.okdests";
        !            44: 
        !            45: extern  char   cmddfldir[];
        !            46: extern  char    logdfldir[];
        !            47: extern char    mmdflogin[];
        !            48: extern  char    pathsubmit[];
        !            49: extern char    sitesignature[];
        !            50: extern char    supportaddr[];
        !            51: extern  struct ll_struct chanlog;
        !            52: 
        !            53: char   *dupfpath (), *index(), *rindex();
        !            54: struct  passwd *getpwnam(), *getpwuid();
        !            55: FILE   *popen();
        !            56: 
        !            57: /*  */
        !            58: 
        !            59: struct ll_struct *logptr = &chanlog;
        !            60: 
        !            61: FILE *fromf;           /* temporary out for colon-less UUCP "From" lines */
        !            62: FILE *msgf;            /* temporary out for message text */
        !            63: FILE *mmdf;            /* filtered mail file */
        !            64: FILE *pipef;           /* output to "submit" or "uux" */
        !            65: char date[LINESIZE];   /* date of origination from uucp header */
        !            66: char from[LINESIZE];   /* accumulated path of sender */
        !            67: char origsys[NAMESZ];  /* originating system */
        !            68: char origpath[LINESIZE];/* path from us to originating system */
        !            69: char usrfrm[LINESIZE];
        !            70: char Mailsys[LINESIZE];
        !            71: int pbroke;            /* broken-pipe flag */
        !            72: int rtnflag;           /* note was sent back */
        !            73: 
        !            74: int    brpipe();
        !            75: 
        !            76: /*  */
        !            77: 
        !            78: main(argc, argv)
        !            79: char **argv;
        !            80: {
        !            81:        char fromwhom[NAMESZ];          /* user on remote system */
        !            82:        char *fromptr;
        !            83:        char linebuf[LINESIZE];         /* scratchpad */
        !            84:        char sys[NAMESZ];               /* an element in the uucp path */
        !            85:        char *cp;
        !            86:        struct passwd *pw;
        !            87:        int  error;
        !            88:        int cpyback;
        !            89: 
        !            90:        if (argc < 2) {
        !            91:                fprintf(stderr, "Usage: rmail user [user ...]\n");
        !            92:                exit(1);
        !            93:        }
        !            94:        umask (0);
        !            95: 
        !            96:        ll_hdinit (logptr, "RM");
        !            97:        logptr -> ll_file = dupfpath (logptr -> ll_file, logdfldir);
        !            98: 
        !            99:        if ((pw = getpwnam (mmdflogin)) == NULL) {
        !           100:                fprintf (stderr, "Cannot find mmdflogin\n");
        !           101:                exit (99);
        !           102:        }
        !           103:        setgid (pw->pw_gid);
        !           104:        setuid (pw->pw_uid);
        !           105: 
        !           106:        sprintf (Mailsys, "%s <%s@%s>",
        !           107:            sitesignature, mmdflogin, LocalName ());
        !           108: 
        !           109: /*  */
        !           110: 
        !           111:     {                          /* BE VERY SURE... */
        !           112:        int     i;
        !           113:     
        !           114:        for (i = fileno (stdout); i <= HIGHFD; i++)
        !           115:            close (i);
        !           116:     }
        !           117: 
        !           118:        /* create file to hold stderr output.  We first open some */
        !           119:        /* null file to make sure stdout is taken.  If stdin isn't */
        !           120:        /* open either, we've got so much trouble it isn't even worth */
        !           121:        /* worrying about a little more */
        !           122:        open("/dev/null", 0);
        !           123:        mktemp(Errtmp);
        !           124:        if (freopen(Errtmp, "w", stderr) == NULL) {
        !           125:                fprintf(stderr, "Can't create %s\n", Errtmp);
        !           126:                ll_log (logptr, LLOGFAT, "Unable to create '%s'",
        !           127:                        Errtmp);
        !           128:                exit(1);
        !           129:        }
        !           130:        dup2 (fileno (stderr), fileno (stdout));
        !           131: 
        !           132:        /* Create temp file for rest of message */
        !           133:        mktemp (Msgtmp);
        !           134:        if ((msgf=fdopen(creat(Msgtmp, Tmpmode), "w")) == NULL) {
        !           135:                fprintf(stderr, "Can't create %s\n", Msgtmp);
        !           136:                ll_log (logptr, LLOGFAT, "Unable to create '%s'",
        !           137:                        Msgtmp);
        !           138:                exit(1);
        !           139:        }
        !           140: 
        !           141:        /* create temp file for colon-less UUCP "From" lines */
        !           142:        mktemp (Fromtmp);
        !           143:        if ((fromf=fdopen(creat(Fromtmp, Tmpmode), "w")) == NULL) {
        !           144:                fprintf(stderr, "Can't create %s\n", Fromtmp);
        !           145:                ll_log (logptr, LLOGFAT, "Unable to create '%s'",
        !           146:                        Fromtmp);
        !           147:                exit(1);
        !           148:        }
        !           149: 
        !           150: /*  */
        !           151: 
        !           152:        for (;;) {
        !           153:                if( fgets(linebuf, sizeof linebuf, stdin) == NULL )
        !           154:                        break;
        !           155:                if(   strncmp(linebuf, "From ", 5)
        !           156:                   && strncmp(linebuf, ">From ", 6) )
        !           157:                        break;
        !           158: 
        !           159:                if (linebuf[0] != '>')
        !           160:                        fputs (">", fromf);
        !           161:                fputs(linebuf, fromf);  /* Save, we may forward via UUCP */
        !           162:                cp = index (linebuf, ' ');      /* start of name */
        !           163:                fromptr = ++cp;
        !           164:                cp = index (cp, ' ');           /* cp at end of name */
        !           165:                *cp++ = 0;                      /* term. name, cp at date */
        !           166:                strcpy (fromwhom, fromptr);
        !           167:                strncpy (date, cp, 24);         /* Mon Nov 10 23:12:09 1981 */
        !           168: 
        !           169:                for (;;) {
        !           170:                        cp = index(cp+1, 'r');
        !           171:                        if (cp == NULL) {
        !           172:                                cp = rindex(fromwhom, '!');
        !           173:                                if (cp != NULL) {
        !           174:                                        char *p;
        !           175:                                        *cp = '\0';
        !           176:                                        p = rindex(fromwhom, '!');
        !           177:                                        if (p != NULL) strcpy(origsys, p+1);
        !           178:                                        else strcpy(origsys, fromwhom);
        !           179:                                        strcat(from, fromwhom);
        !           180:                                        strcat(from, "!");
        !           181:                                        strcpy(fromwhom, cp+1);
        !           182:                                        goto out;
        !           183:                                }
        !           184:                                strcpy (sys, SystemName ());
        !           185:                                strcat (from, sys);
        !           186:                                strcpy (origsys, sys);
        !           187:                                strcat (from, "!");
        !           188:                                goto out;
        !           189:                        }
        !           190:                        if (strncmp(cp, "remote from ", 12) == 0)
        !           191:                                break;
        !           192:                }
        !           193: 
        !           194:                sscanf(cp, "remote from %s", sys);
        !           195:                strcat(from, sys);
        !           196:                strcpy(origsys, sys);           /* Save for quick ref. */
        !           197:                strcat(from, "!");
        !           198: out:;
        !           199:        }
        !           200:        if( fromwhom[0] == '\0' )               /* No from line, illegal */
        !           201:                exit(99);
        !           202: 
        !           203: /*  */
        !           204: 
        !           205:        strcpy (origpath, from);
        !           206:        strcat (from, fromwhom);
        !           207:         mf_get_addr (from, usrfrm);
        !           208:        if ((cp = rindex (usrfrm, '<')) != NULL) {
        !           209:            strcpy (usrfrm, ++cp);/* sigh */
        !           210:            if ((cp = rindex (usrfrm, '>')) != NULL)
        !           211:                *cp = NULL;
        !           212:            }
        !           213:        if (usrfrm[0] == NULL)
        !           214:            sprintf (usrfrm, "%s!%s%%%s@%s",
        !           215:                SystemName (), from, UucpChan (), LocalName ());
        !           216:        ll_log (logptr, LLOGGEN, "Rmail from '%s' (%s)", from, usrfrm);
        !           217:        fputs (linebuf, msgf);
        !           218:        if (rp_isbad (txtcpy (stdin, msgf)))
        !           219:            fputs ("\n  *** Problem during receipt from UUCP ***\n", msgf);
        !           220: 
        !           221:        freopen (Msgtmp, "r", msgf);
        !           222:        freopen (Fromtmp, "r", fromf);
        !           223:        unlink (Msgtmp);
        !           224:        unlink (Fromtmp);
        !           225:        mmdf = NULL;
        !           226: 
        !           227:        cpyback = 0;
        !           228:        for (argv++; --argc > 0; ) {
        !           229:                rewind (fromf);
        !           230:                rewind (msgf);
        !           231:                if (mmdf != NULL)
        !           232:                    rewind (mmdf);
        !           233:                pbroke = 0;
        !           234:                rtnflag = 0;
        !           235:                signal(SIGPIPE, brpipe);
        !           236:                if (rp_isbad(deliver(*argv++)) && !rtnflag)
        !           237:                        cpyback++;
        !           238:        }
        !           239: 
        !           240:        /* Send back a copy if something nasty happened.  For now, we use */
        !           241:        /* a real kludge -- we see if we noted some error, or if we find */
        !           242:        /* anything written to stderr....  */
        !           243:        fflush(stderr);
        !           244:        fflush (stdout);
        !           245: 
        !           246:        if (cpyback) {rcpy();zcpy();}
        !           247: 
        !           248:        unlink(Errtmp);
        !           249:        ll_close (logptr);
        !           250:        exit (0);
        !           251: }
        !           252: 
        !           253: /*  */
        !           254: 
        !           255: /*
        !           256:  *     deliver() -- Handle all deliveries be they returns, automatic
        !           257:  *                     copies, or the real thing.  Based on the address
        !           258:  *                     the letter is accepted or returned with a copy
        !           259:  *                     to the system administrators
        !           260:  *
        !           261:  *                     main() has set up the "from" string and the
        !           262:  *                     "date" string.
        !           263:  */
        !           264: char   rtnend[] =
        !           265:        "  --------------- End of Returned Mail ---------------\n";
        !           266: 
        !           267: deliver(to)
        !           268: char *to;
        !           269: {
        !           270:        int     replyval;
        !           271:        int     i;
        !           272:        char    linebuf[LINESIZE];
        !           273:        char    tmpbuf[LINESIZE];
        !           274: 
        !           275:        switch (adrcheck (to)) {
        !           276:        case ADDROK:
        !           277:                ll_log (logptr, LLOGGEN, "Rmail to '%s' via MMDF", to);
        !           278:                if (rp_isbad (replyval = 
        !           279:                        xsubmit (NULL, usrfrm, NULL, NULL, to)))
        !           280:                    break;
        !           281:                if (mmdf == NULL)
        !           282:                    if (mf_get_msg () == NOTOK)
        !           283:                        mmdf = msgf;
        !           284:                replyval = txtcpy (mmdf, pipef);
        !           285: #ifndef RUNALON
        !           286:                i = (pclose(pipef) >> 8 ) & 0xff;
        !           287:                if (rp_isgood(replyval)) replyval = i;
        !           288: #endif
        !           289:                break;
        !           290: 
        !           291:        case UUCP:
        !           292:                ll_log (logptr, LLOGGEN, "Rmail to '%s' via UUCP", to);
        !           293:                if (rp_isbad (replyval = xuucp(from, to)))
        !           294:                        break;
        !           295:                replyval = txtcpy(msgf, pipef);
        !           296: #ifndef RUNALON
        !           297:                i = (pclose(pipef) >> 8 ) & 0xff;
        !           298:                if (rp_isgood(replyval)) replyval = (i == 0 ? RP_OK : RP_LIO);
        !           299: #endif
        !           300:                break;
        !           301: 
        !           302: /*  */
        !           303: 
        !           304:        case RETURN:
        !           305:                rtnflag = 1;
        !           306:                ll_log (logptr, LLOGGEN, "Illegal Rmail to '%s'", to);
        !           307:                switch (adrcheck (from)) {
        !           308:                case ADDROK:
        !           309:                case RETURN:
        !           310:                        replyval = xsubmit (dtimenow (), Mailsys,
        !           311:                                        from, supportaddr, from);
        !           312:                        rtnmesg(to);
        !           313:                        txtcpy(fromf, pipef);
        !           314:                        txtcpy(msgf, pipef);
        !           315:                        fputs (rtnend, pipef);
        !           316: #ifndef RUNALON
        !           317:                        i = (pclose(pipef) >> 8 ) & 0xff;
        !           318:                        if (rp_isgood(replyval)) replyval = i;
        !           319: #endif
        !           320:                        break;
        !           321: 
        !           322:                case UUCP:
        !           323:                        replyval = xuucp (mmdflogin, from);
        !           324:                        if (rp_isbad (replyval))
        !           325:                                break;
        !           326:                        fprintf (pipef, "To: %s\n", from);
        !           327:                        fprintf (pipef, "Cc: %s\n", supportaddr);
        !           328:                        rtnmesg(to);
        !           329:                        txtcpy(fromf, pipef);
        !           330:                        txtcpy(msgf, pipef);
        !           331:                        fputs (rtnend, pipef);
        !           332: #ifndef RUNALON
        !           333:                        i = (pclose(pipef) >> 8 ) & 0xff;
        !           334:                        if (rp_isgood(replyval))
        !           335:                            replyval = (i == 0 ? RP_OK : RP_LIO);
        !           336: #endif
        !           337:                        break;
        !           338:                }
        !           339: 
        !           340:                /* And now for the mail overseer's copy */
        !           341:                if (Syscpy) {
        !           342:                        ll_log (logptr, LLOGGEN, "Notifying %s", supportaddr);
        !           343:                        rewind (fromf);
        !           344:                        rewind (msgf);
        !           345: 
        !           346:                        replyval = xsubmit (dtimenow (), Mailsys,
        !           347:                                        usrfrm, supportaddr, supportaddr);
        !           348:                        if (rp_isbad (replyval))
        !           349:                                break;
        !           350:                        rtnmesg(to);
        !           351:                        txtcpy (fromf, pipef);
        !           352:                        txtcpy (msgf, pipef);
        !           353:                        fputs (rtnend, pipef);
        !           354: #ifndef RUNALON
        !           355:                        i = (pclose(pipef) >> 8 ) & 0xff;
        !           356:                        if (rp_isgood(replyval)) replyval = i;
        !           357: #endif
        !           358:                }
        !           359:        }
        !           360:        return (replyval);
        !           361: }
        !           362: 
        !           363: /*  */
        !           364: 
        !           365: adrcheck (adr)                             /* Gateway to Arpanet? */
        !           366: char *adr;
        !           367: {
        !           368:     char   *cp,
        !           369:             err[BUFSIZ],
        !           370:             host[BUFSIZ],
        !           371:             mbox[BUFSIZ];
        !           372:     struct adrx *adrxp;
        !           373: 
        !           374:     if ((adrxp = seekadrx (adr)) == NULL)
        !           375:        return RETURN;
        !           376:     strcpy (err, adrxp -> err ? adrxp -> err : "");
        !           377:     strcpy (host, adrxp -> host ? adrxp -> host : "");
        !           378:     strcpy (mbox, adrxp -> mbox ? adrxp -> mbox : "");
        !           379:     while (seekadrx (NULL))
        !           380:        continue;
        !           381: 
        !           382:     if (err[0] || mbox[0] == NULL)
        !           383:        return RETURN;
        !           384:     if (index (mbox, '!') || host[0] == NULL)
        !           385:        return UUCP;
        !           386:     if (rp_isgood (lookup (origsys, Okhosts)))
        !           387:        return ADDROK;
        !           388:     if (index (host, '@') || rp_isbad (okhost (host)))
        !           389:        return RETURN;
        !           390: 
        !           391:     return ADDROK;
        !           392: }
        !           393: 
        !           394: 
        !           395: okhost(host)             /* Host permitted to use mail facilities? */
        !           396: char *host;
        !           397: {
        !           398:        if (rp_isgood (lookup (origsys, Okhosts)))
        !           399:                return (RP_OK);         /* Fully privledged originator */
        !           400:        if (rp_isgood (lookup (host, Okhosts)))
        !           401:                return (RP_OK);         /* Fully privledged dest */
        !           402:        if (rp_isgood (lookup (host, Okdests)))
        !           403:                return (RP_OK);         /* Unrestricted Dest. Host, OK */
        !           404:        return(RP_NO);                  /* Not permitted; must be bad */
        !           405: }
        !           406: 
        !           407: /*  */
        !           408: 
        !           409: /*
        !           410:  *     lookup()  --    This lookup function looks for strings which
        !           411:  *                     must be the first string on a line.  Sorry Dave (dhc)
        !           412:  *                     but the MMDF channel functions are too specific
        !           413:  *                     to be easily used here without much kludging.
        !           414:  */
        !           415: 
        !           416: /*****************************************
        !           417: ****   Can this be a call to a MMDF function??
        !           418: ****   Remember I have the RHOSTs table and the OKHOSTS table.
        !           419: ******************************************/
        !           420: 
        !           421: lookup (what, where)
        !           422: char *what, *where;
        !           423: {
        !           424:        FILE *lookf;
        !           425:        char entry[LINESIZE];
        !           426:        char *cp;
        !           427: 
        !           428:        if ((lookf = fopen (where, "r")) == NULL)
        !           429:                return (RP_NO);         /* Unknown problem */
        !           430:        while (fgets (entry, sizeof entry, lookf) != NULL) {
        !           431:                cp = entry;
        !           432:                while (*cp != '\n' && *cp != ' ' && *cp != '\t')
        !           433:                        cp++;
        !           434:                *cp = 0;
        !           435:                if (lexequ (what, entry)) {
        !           436:                        fclose (lookf);
        !           437:                        return (RP_OK);
        !           438:                }
        !           439:        }
        !           440:        fclose (lookf);
        !           441:        return (RP_NO);
        !           442: }
        !           443: 
        !           444: 
        !           445: /*  */
        !           446: 
        !           447: char *rtnmessage[] = {
        !           448:        "       Your message has been intercepted trying to access\n",
        !           449:        "a restricted access host (e.g. an ARPANET host).  A copy\n",
        !           450:        "of your message has been sent to the system administrators.\n",
        !           451:        "The text of your message follows.\n\n",
        !           452:        "  --------------- Returned Mail Follows --------------\n",
        !           453:        0
        !           454: };
        !           455: 
        !           456: rtnmesg (badadr)
        !           457: char *badadr;
        !           458: {
        !           459:        char **cpp;
        !           460: 
        !           461:        fprintf (pipef, "Subject:  Illegal Address (%s)\n\n", badadr);
        !           462:        for (cpp = rtnmessage; *cpp; cpp++)
        !           463:                fputs (*cpp, pipef);
        !           464: }
        !           465: 
        !           466: txtcpy (frm, to)
        !           467: FILE *frm, *to;
        !           468: {
        !           469:        char buffer[BUFSIZ];
        !           470:        int nread;
        !           471: 
        !           472:        while (!pbroke && (nread = fread (buffer, sizeof (*buffer), BUFSIZ, frm)) > 0)
        !           473:                fwrite (buffer, sizeof (*buffer), nread, to);
        !           474:        return (ferror (frm) ? RP_LIO : RP_OK );
        !           475: }
        !           476: 
        !           477: /*  */
        !           478: 
        !           479: xsubmit (date, from, to, cc, realto)
        !           480: char *date, *from, *to, *cc, *realto;
        !           481: {
        !           482:     char    cmdstr[LINESIZE],
        !           483:             submit[LINESIZE];
        !           484: 
        !           485:     getfpath (pathsubmit, cmddfldir, submit);
        !           486:     sprintf (cmdstr, "%s '-mlti%s*'", submit, UucpChan ());
        !           487: 
        !           488: #ifndef RUNALON
        !           489:     if ((pipef = popen (cmdstr, "w")) == NULL)
        !           490:        return (RP_NO);
        !           491: #else
        !           492:     pipef = stdout;
        !           493:     printf ("%s\n", cmdstr);
        !           494: #endif
        !           495: 
        !           496:     fprintf (pipef, "%s\n%s\n!\n", from, realto);
        !           497: 
        !           498:     if (date) {
        !           499:        fprintf (pipef, "Date:     %s\n", date);
        !           500:        fprintf (pipef, "From:     %s\n", from);
        !           501:     }
        !           502:     if (to) {
        !           503:        fprintf (pipef, "To:       %s", to);
        !           504:        if (index (to, '@'))
        !           505:            fputc ('\n', pipef);/* Explicit host specified */
        !           506:        else
        !           507:            fprintf (pipef, "@%s\n", LocalName ());
        !           508:     }
        !           509:     if (cc) {
        !           510:        fprintf (pipef, "Cc:       %s\n", cc);
        !           511:     }
        !           512: 
        !           513:     return (RP_OK);
        !           514: }
        !           515: 
        !           516: /*  */
        !           517: 
        !           518: xuucp (from, to)
        !           519: char *from, *to;
        !           520: {
        !           521:        char    cmdstr[LINESIZE];
        !           522: 
        !           523:        sprintf (cmdstr, "/etc/delivermail -r%s -ep -m -s -i %s", from, to);
        !           524: 
        !           525: #ifndef RUNALON
        !           526:        if ((pipef = popen (cmdstr, "w")) == NULL)
        !           527:                return (RP_NO);
        !           528: #else
        !           529:        pipef = stdout;
        !           530:        printf ("%s\n", cmdstr);
        !           531: #endif
        !           532: 
        !           533:        return (RP_OK);
        !           534: }
        !           535: 
        !           536: /*  */
        !           537: 
        !           538: brpipe()       /* catch broken-pipe signals */
        !           539: {
        !           540:        signal(SIGPIPE, SIG_IGN);
        !           541:        pbroke = 1;
        !           542: }
        !           543: 
        !           544: char *oopsmessage[] = {
        !           545:     "\n\n\tThe system administrators (%s) have been informed of the\n",
        !           546:     "problem, but have not been given a copy of your message.\n",
        !           547:     NULL
        !           548: };
        !           549: 
        !           550: /*  */
        !           551: 
        !           552: rcpy () {
        !           553:     int     i;
        !           554:     char    buffer[BUFSIZ],
        !           555:            message[BUFSIZ];
        !           556:     FILE * fp;
        !           557: 
        !           558:     ll_log (logptr, LLOGGEN, "Advising %s of failure as %s...", from, usrfrm);
        !           559: 
        !           560:     sprintf (buffer, "Problems sending mail:\n\n");
        !           561:     if (ml_1adr (NO, NO, sitesignature, "Problems sending mail", usrfrm)
        !           562:            != OK)
        !           563:        goto ml_err;
        !           564:     ml_txt (buffer);
        !           565: 
        !           566:     if ((fp = fopen (Errtmp, "r")) != NULL) {
        !           567:        ml_file (fp);
        !           568:        if (ftell (fp) == 0L)
        !           569:            fprintf (pipef, "\tunknown problem\n");
        !           570:        fclose (fp);
        !           571:     }
        !           572:     else
        !           573:        ml_txt ("\tunknown problem\n");
        !           574: 
        !           575:     for (i = 0; oopsmessage[i]; i++) {
        !           576:        sprintf (message, oopsmessage[i], supportaddr);
        !           577:        ml_txt (message);
        !           578:     }
        !           579:     fprintf (pipef, "\n\nReturned message follows:\n\n---------------\n\n");
        !           580:     rewind (fromf);
        !           581:     ml_file (fromf);
        !           582:     rewind (msgf);
        !           583:     ml_file (msgf);
        !           584: 
        !           585:     if (ml_end (OK) != OK) {
        !           586:        char   *cp;
        !           587: 
        !           588: ml_err: ;
        !           589:        if (cp = index (buffer, '\n'))
        !           590:            *cp = NULL;
        !           591:        ll_log (logptr, LLOGFAT, "Unable to post failure notice");
        !           592:        ll_log (logptr, LLOGFAT, "info: %s", buffer);
        !           593:     }
        !           594: }
        !           595: 
        !           596: /*  */
        !           597: 
        !           598: zcpy () {
        !           599:     char    buffer[BUFSIZ];
        !           600:     FILE * fp;
        !           601: 
        !           602:     ll_log (logptr, LLOGGEN, "Advising %s of failure...", supportaddr);
        !           603: 
        !           604:     sprintf (buffer, "Problems sending mail for %s (aka %s):\n\n",
        !           605:            from, usrfrm);
        !           606:     if (ml_1adr (NO, NO, sitesignature, "Problems sending mail", supportaddr)
        !           607:            != OK)
        !           608:        goto ml_err;
        !           609:     ml_txt (buffer);
        !           610: 
        !           611:     if ((fp = fopen (Errtmp, "r")) != NULL) {
        !           612:        ml_file (fp);
        !           613:        if (ftell (fp) == 0L)
        !           614:            fprintf (pipef, "\tunknown problem\n");
        !           615:        fclose (fp);
        !           616:     }
        !           617:     else
        !           618:        ml_txt ("\tunable to open error file\n");
        !           619: 
        !           620:     if (ml_end (OK) != OK) {
        !           621:        char   *cp;
        !           622: 
        !           623: ml_err: ;
        !           624:        if (cp = index (buffer, '\n'))
        !           625:            *cp = NULL;
        !           626:        ll_log (logptr, LLOGFAT, "Unable to post failure notice");
        !           627:        ll_log (logptr, LLOGFAT, "info: %s", buffer);
        !           628:     }
        !           629: }
        !           630: 
        !           631: /*  */
        !           632: 
        !           633: mf_get_msg () {
        !           634:     int     i,
        !           635:             fd,
        !           636:             md,
        !           637:             td;
        !           638:     char    buffer[BUFSIZ],
        !           639:             tmpfil[LINESIZE],
        !           640:             mmdfil[LINESIZE];
        !           641: #ifdef MFDEBUG
        !           642:     FILE * fp;
        !           643: #endif MFDEBUG
        !           644:     FILE * out;
        !           645: 
        !           646:     strcpy (tmpfil, "/tmp/rmailXXXXXX");
        !           647:     unlink (mktemp (tmpfil));
        !           648:     if ((fd = creat (tmpfil, Tmpmode)) == NOTOK)
        !           649:        return NOTOK;
        !           650:     close (fd);
        !           651:     if ((fd = open (tmpfil, 2)) == NOTOK)
        !           652:        return NOTOK;
        !           653:     if ((out = fdopen (fd, "w")) == NULL) {
        !           654:        close (fd);
        !           655:        return NOTOK;
        !           656:     }
        !           657:     if ((td = dup (fd)) == NOTOK) {
        !           658:        close (fd);
        !           659:        return NOTOK;
        !           660:     }
        !           661: 
        !           662:     fprintf (out, "From %s %s\n", from, date);
        !           663:     if (rp_isbad (txtcpy (msgf, out))) {
        !           664:        close (fd);
        !           665:        close (td);
        !           666:        return NOTOK;
        !           667:     }
        !           668:     fclose (out);
        !           669:     lseek (td, 0L, 0);
        !           670: 
        !           671:     strcpy (mmdfil, "/tmp/mmdfXXXXXX");
        !           672:     unlink (mktemp (mmdfil));
        !           673:     if ((fd = creat (mmdfil, Tmpmode)) == NOTOK) {
        !           674:        close (td);
        !           675:        unlink (tmpfil);
        !           676:        return NOTOK;
        !           677:     }
        !           678:     if ((fd = open (mmdfil, 2)) == NOTOK) {
        !           679:        close (td);
        !           680:        unlink (tmpfil);
        !           681:        return NOTOK;
        !           682:     }
        !           683:     if ((md = dup (fd)) == NOTOK) {
        !           684:        close (td);
        !           685:        unlink (tmpfil);
        !           686:        close (fd);
        !           687:        return NOTOK;
        !           688:     }
        !           689: 
        !           690: /*  */
        !           691: 
        !           692:     switch (i = uucp_to_mmdf (td, fd, TRUE)) {
        !           693:        case OK: 
        !           694:            lseek (md, 0L, 0);
        !           695:            if ((mmdf = fdopen (md, "r")) != NULL)
        !           696:                break;
        !           697: 
        !           698:        default: 
        !           699:            close (md);
        !           700: 
        !           701:            sprintf (buffer, "rmail(%d) filtering failed(%d)\n",
        !           702:                    getpid (), i);
        !           703:            if (ml_1adr (NO, NO, sitesignature, "MF Failure", supportaddr)
        !           704:                    != OK)
        !           705:                goto ml_err;
        !           706:            ml_txt (buffer);
        !           707: #ifdef MFDEBUG
        !           708:            lseek (td, 0L, 0);
        !           709:            if ((md = dup (td)) == NOTOK)
        !           710:                ml_txt ("unable to dup() descriptor for message copy\n");
        !           711:            else
        !           712:                if ((fp = fdopen (md, "r")) == NULL) {
        !           713:                    ml_txt ("unable to fdopen() descriptor for message copy\n");
        !           714:                    close (md);
        !           715:                }
        !           716:                else {
        !           717:                    ml_txt ("\n  --Message Follows--\n");
        !           718:                    ml_file (fp);
        !           719:                    fclose (fp);
        !           720:                }
        !           721: #endif MFDEBUG
        !           722:            if (ml_end (OK) != OK) {
        !           723:                char   *cp;
        !           724: 
        !           725:        ml_err: ;
        !           726:                if (cp = index (buffer, '\n'))
        !           727:                    *cp = NULL;
        !           728:                ll_log (logptr, LLOGFAT, "Unable to post failure notice");
        !           729:                ll_log (logptr, LLOGFAT, "info: %s", buffer);
        !           730:            }
        !           731: 
        !           732:            md = NOTOK;
        !           733:            break;
        !           734:     }
        !           735:     close (td);
        !           736:     unlink (tmpfil);
        !           737:     close (fd);
        !           738:     unlink (mmdfil);
        !           739: 
        !           740:     return md;
        !           741: }
        !           742: 
        !           743: /*  */
        !           744: 
        !           745: mf_get_addr (from, to)
        !           746: char *from,
        !           747:      *to;
        !           748: {
        !           749:     struct adrx *adrxp,
        !           750:                *seekadrx ();
        !           751: 
        !           752:     *to = NULL;
        !           753:     if ((adrxp = seekadrx (from)) == NULL)
        !           754:        return;
        !           755:     addr_convert (adrxp, to, TRUE);
        !           756:     while (seekadrx (NULL))
        !           757:        continue;
        !           758:     return;
        !           759: }

unix.superglobalmegacorp.com

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