Annotation of 43BSD/usr.lib/sendmail/src/err.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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