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

unix.superglobalmegacorp.com

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