Annotation of 43BSDTahoe/usr.lib/sendmail/src/err.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1983 Eric P. Allman
        !             3:  * Copyright (c) 1988 Regents of the University of California.
        !             4:  * All rights reserved.
        !             5:  *
        !             6:  * Redistribution and use in source and binary forms are permitted
        !             7:  * provided that the above copyright notice and this paragraph are
        !             8:  * duplicated in all such forms and that any documentation,
        !             9:  * advertising materials, and other materials related to such
        !            10:  * distribution and use acknowledge that the software was developed
        !            11:  * by the University of California, Berkeley.  The name of the
        !            12:  * University may not be used to endorse or promote products derived
        !            13:  * from this software without specific prior written permission.
        !            14:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !            15:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !            16:  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            17:  */
        !            18: 
        !            19: #ifndef lint
        !            20: static char sccsid[] = "@(#)err.c      5.9 (Berkeley) 6/30/88";
        !            21: #endif /* not lint */
        !            22: 
        !            23: # include "sendmail.h"
        !            24: # include <errno.h>
        !            25: # include <netdb.h>
        !            26: 
        !            27: /*
        !            28: **  SYSERR -- Print error message.
        !            29: **
        !            30: **     Prints an error message via printf to the diagnostic
        !            31: **     output.  If LOG is defined, it logs it also.
        !            32: **
        !            33: **     Parameters:
        !            34: **             f -- the format string
        !            35: **             a, b, c, d, e -- parameters
        !            36: **
        !            37: **     Returns:
        !            38: **             none
        !            39: **             Through TopFrame if QuickAbort is set.
        !            40: **
        !            41: **     Side Effects:
        !            42: **             increments Errors.
        !            43: **             sets ExitStat.
        !            44: */
        !            45: 
        !            46: # ifdef lint
        !            47: int    sys_nerr;
        !            48: char   *sys_errlist[];
        !            49: # endif lint
        !            50: char   MsgBuf[BUFSIZ*2];       /* text of most recent message */
        !            51: 
        !            52: /*VARARGS1*/
        !            53: syserr(fmt, a, b, c, d, e)
        !            54:        char *fmt;
        !            55: {
        !            56:        register char *p;
        !            57:        int olderrno = errno;
        !            58:        extern char Arpa_PSyserr[];
        !            59:        extern char Arpa_TSyserr[];
        !            60: 
        !            61:        /* format and output the error message */
        !            62:        if (olderrno == 0)
        !            63:                p = Arpa_PSyserr;
        !            64:        else
        !            65:                p = Arpa_TSyserr;
        !            66:        fmtmsg(MsgBuf, (char *) NULL, p, olderrno, fmt, a, b, c, d, e);
        !            67:        puterrmsg(MsgBuf);
        !            68: 
        !            69:        /* determine exit status if not already set */
        !            70:        if (ExitStat == EX_OK)
        !            71:        {
        !            72:                if (olderrno == 0)
        !            73:                        ExitStat = EX_SOFTWARE;
        !            74:                else
        !            75:                        ExitStat = EX_OSERR;
        !            76:        }
        !            77: 
        !            78: # ifdef LOG
        !            79:        if (LogLevel > 0)
        !            80:                syslog(LOG_CRIT, "%s: SYSERR: %s",
        !            81:                        CurEnv->e_id == NULL ? "NOQUEUE" : CurEnv->e_id,
        !            82:                        &MsgBuf[4]);
        !            83: # endif LOG
        !            84:        errno = 0;
        !            85:        if (QuickAbort)
        !            86:                longjmp(TopFrame, 2);
        !            87: }
        !            88: /*
        !            89: **  USRERR -- Signal user error.
        !            90: **
        !            91: **     This is much like syserr except it is for user errors.
        !            92: **
        !            93: **     Parameters:
        !            94: **             fmt, a, b, c, d -- printf strings
        !            95: **
        !            96: **     Returns:
        !            97: **             none
        !            98: **             Through TopFrame if QuickAbort is set.
        !            99: **
        !           100: **     Side Effects:
        !           101: **             increments Errors.
        !           102: */
        !           103: 
        !           104: /*VARARGS1*/
        !           105: usrerr(fmt, a, b, c, d, e)
        !           106:        char *fmt;
        !           107: {
        !           108:        extern char SuprErrs;
        !           109:        extern char Arpa_Usrerr[];
        !           110:        extern int errno;
        !           111: 
        !           112:        if (SuprErrs)
        !           113:                return;
        !           114: 
        !           115:        fmtmsg(MsgBuf, CurEnv->e_to, Arpa_Usrerr, errno, fmt, a, b, c, d, e);
        !           116:        puterrmsg(MsgBuf);
        !           117: 
        !           118:        if (QuickAbort)
        !           119:                longjmp(TopFrame, 1);
        !           120: }
        !           121: /*
        !           122: **  MESSAGE -- print message (not necessarily an error)
        !           123: **
        !           124: **     Parameters:
        !           125: **             num -- the default ARPANET error number (in ascii)
        !           126: **             msg -- the message (printf fmt) -- if it begins
        !           127: **                     with a digit, this number overrides num.
        !           128: **             a, b, c, d, e -- printf arguments
        !           129: **
        !           130: **     Returns:
        !           131: **             none
        !           132: **
        !           133: **     Side Effects:
        !           134: **             none.
        !           135: */
        !           136: 
        !           137: /*VARARGS2*/
        !           138: message(num, msg, a, b, c, d, e)
        !           139:        register char *num;
        !           140:        register char *msg;
        !           141: {
        !           142:        errno = 0;
        !           143:        fmtmsg(MsgBuf, CurEnv->e_to, num, 0, msg, a, b, c, d, e);
        !           144:        putmsg(MsgBuf, FALSE);
        !           145: }
        !           146: /*
        !           147: **  NMESSAGE -- print message (not necessarily an error)
        !           148: **
        !           149: **     Just like "message" except it never puts the to... tag on.
        !           150: **
        !           151: **     Parameters:
        !           152: **             num -- the default ARPANET error number (in ascii)
        !           153: **             msg -- the message (printf fmt) -- if it begins
        !           154: **                     with three digits, this number overrides num.
        !           155: **             a, b, c, d, e -- printf arguments
        !           156: **
        !           157: **     Returns:
        !           158: **             none
        !           159: **
        !           160: **     Side Effects:
        !           161: **             none.
        !           162: */
        !           163: 
        !           164: /*VARARGS2*/
        !           165: nmessage(num, msg, a, b, c, d, e)
        !           166:        register char *num;
        !           167:        register char *msg;
        !           168: {
        !           169:        errno = 0;
        !           170:        fmtmsg(MsgBuf, (char *) NULL, num, 0, msg, a, b, c, d, e);
        !           171:        putmsg(MsgBuf, FALSE);
        !           172: }
        !           173: /*
        !           174: **  PUTMSG -- output error message to transcript and channel
        !           175: **
        !           176: **     Parameters:
        !           177: **             msg -- message to output (in SMTP format).
        !           178: **             holdmsg -- if TRUE, don't output a copy of the message to
        !           179: **                     our output channel.
        !           180: **
        !           181: **     Returns:
        !           182: **             none.
        !           183: **
        !           184: **     Side Effects:
        !           185: **             Outputs msg to the transcript.
        !           186: **             If appropriate, outputs it to the channel.
        !           187: **             Deletes SMTP reply code number as appropriate.
        !           188: */
        !           189: 
        !           190: putmsg(msg, holdmsg)
        !           191:        char *msg;
        !           192:        bool holdmsg;
        !           193: {
        !           194:        /* output to transcript if serious */
        !           195:        if (CurEnv->e_xfp != NULL && (msg[0] == '4' || msg[0] == '5'))
        !           196:                fprintf(CurEnv->e_xfp, "%s\n", msg);
        !           197: 
        !           198:        /* output to channel if appropriate */
        !           199:        if (!holdmsg && (Verbose || msg[0] != '0'))
        !           200:        {
        !           201:                (void) fflush(stdout);
        !           202:                if (OpMode == MD_SMTP || OpMode == MD_ARPAFTP)
        !           203:                        fprintf(OutChannel, "%s\r\n", msg);
        !           204:                else
        !           205:                        fprintf(OutChannel, "%s\n", &msg[4]);
        !           206:                (void) fflush(OutChannel);
        !           207:        }
        !           208: }
        !           209: /*
        !           210: **  PUTERRMSG -- like putmsg, but does special processing for error messages
        !           211: **
        !           212: **     Parameters:
        !           213: **             msg -- the message to output.
        !           214: **
        !           215: **     Returns:
        !           216: **             none.
        !           217: **
        !           218: **     Side Effects:
        !           219: **             Sets the fatal error bit in the envelope as appropriate.
        !           220: */
        !           221: 
        !           222: puterrmsg(msg)
        !           223:        char *msg;
        !           224: {
        !           225:        /* output the message as usual */
        !           226:        putmsg(msg, HoldErrs);
        !           227: 
        !           228:        /* signal the error */
        !           229:        Errors++;
        !           230:        if (msg[0] == '5')
        !           231:                CurEnv->e_flags |= EF_FATALERRS;
        !           232: }
        !           233: /*
        !           234: **  FMTMSG -- format a message into buffer.
        !           235: **
        !           236: **     Parameters:
        !           237: **             eb -- error buffer to get result.
        !           238: **             to -- the recipient tag for this message.
        !           239: **             num -- arpanet error number.
        !           240: **             en -- the error number to display.
        !           241: **             fmt -- format of string.
        !           242: **             a, b, c, d, e -- arguments.
        !           243: **
        !           244: **     Returns:
        !           245: **             none.
        !           246: **
        !           247: **     Side Effects:
        !           248: **             none.
        !           249: */
        !           250: 
        !           251: /*VARARGS5*/
        !           252: static
        !           253: fmtmsg(eb, to, num, eno, fmt, a, b, c, d, e)
        !           254:        register char *eb;
        !           255:        char *to;
        !           256:        char *num;
        !           257:        int eno;
        !           258:        char *fmt;
        !           259: {
        !           260:        char del;
        !           261: 
        !           262:        /* output the reply code */
        !           263:        if (isdigit(fmt[0]) && isdigit(fmt[1]) && isdigit(fmt[2]))
        !           264:        {
        !           265:                num = fmt;
        !           266:                fmt += 4;
        !           267:        }
        !           268:        if (num[3] == '-')
        !           269:                del = '-';
        !           270:        else
        !           271:                del = ' ';
        !           272:        (void) sprintf(eb, "%3.3s%c", num, del);
        !           273:        eb += 4;
        !           274: 
        !           275:        /* output the file name and line number */
        !           276:        if (FileName != NULL)
        !           277:        {
        !           278:                (void) sprintf(eb, "%s: line %d: ", FileName, LineNumber);
        !           279:                eb += strlen(eb);
        !           280:        }
        !           281: 
        !           282:        /* output the "to" person */
        !           283:        if (to != NULL && to[0] != '\0')
        !           284:        {
        !           285:                (void) sprintf(eb, "%s... ", to);
        !           286:                while (*eb != '\0')
        !           287:                        *eb++ &= 0177;
        !           288:        }
        !           289: 
        !           290:        /* output the message */
        !           291:        (void) sprintf(eb, fmt, a, b, c, d, e);
        !           292:        while (*eb != '\0')
        !           293:                *eb++ &= 0177;
        !           294: 
        !           295:        /* output the error code, if any */
        !           296:        if (eno != 0)
        !           297:        {
        !           298:                extern char *errstring();
        !           299: 
        !           300:                (void) sprintf(eb, ": %s", errstring(eno));
        !           301:                eb += strlen(eb);
        !           302:        }
        !           303: }
        !           304: /*
        !           305: **  ERRSTRING -- return string description of error code
        !           306: **
        !           307: **     Parameters:
        !           308: **             errno -- the error number to translate
        !           309: **
        !           310: **     Returns:
        !           311: **             A string description of errno.
        !           312: **
        !           313: **     Side Effects:
        !           314: **             none.
        !           315: */
        !           316: 
        !           317: char *
        !           318: errstring(errno)
        !           319:        int errno;
        !           320: {
        !           321:        extern char *sys_errlist[];
        !           322:        extern int sys_nerr;
        !           323:        static char buf[100];
        !           324: # ifdef SMTP
        !           325:        extern char *SmtpPhase;
        !           326: # endif SMTP
        !           327: 
        !           328: # ifdef DAEMON
        !           329: # ifdef VMUNIX
        !           330:        /*
        !           331:        **  Handle special network error codes.
        !           332:        **
        !           333:        **      These are 4.2/4.3bsd specific; they should be in daemon.c.
        !           334:        */
        !           335: 
        !           336:        switch (errno)
        !           337:        {
        !           338:          case ETIMEDOUT:
        !           339:          case ECONNRESET:
        !           340:                (void) strcpy(buf, sys_errlist[errno]);
        !           341:                if (SmtpPhase != NULL)
        !           342:                {
        !           343:                        (void) strcat(buf, " during ");
        !           344:                        (void) strcat(buf, SmtpPhase);
        !           345:                }
        !           346:                if (CurHostName != NULL)
        !           347:                {
        !           348:                        (void) strcat(buf, " with ");
        !           349:                        (void) strcat(buf, CurHostName);
        !           350:                }
        !           351:                return (buf);
        !           352: 
        !           353:          case EHOSTDOWN:
        !           354:                if (CurHostName == NULL)
        !           355:                        break;
        !           356:                (void) sprintf(buf, "Host %s is down", CurHostName);
        !           357:                return (buf);
        !           358: 
        !           359:          case ECONNREFUSED:
        !           360:                if (CurHostName == NULL)
        !           361:                        break;
        !           362:                (void) sprintf(buf, "Connection refused by %s", CurHostName);
        !           363:                return (buf);
        !           364: 
        !           365:          case (TRY_AGAIN+MAX_ERRNO):
        !           366:                (void) sprintf(buf, "Host Name Lookup Failure");
        !           367:                return (buf);
        !           368:        }
        !           369: # endif VMUNIX
        !           370: # endif DAEMON
        !           371: 
        !           372:        if (errno > 0 && errno < sys_nerr)
        !           373:                return (sys_errlist[errno]);
        !           374: 
        !           375:        (void) sprintf(buf, "Error %d", errno);
        !           376:        return (buf);
        !           377: }

unix.superglobalmegacorp.com

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