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

1.1       root        1: # include "sendmail.h"
                      2: 
                      3: SCCSID(@(#)err.c       4.2             9/5/83);
                      4: 
                      5: /*
                      6: **  SYSERR -- Print error message.
                      7: **
                      8: **     Prints an error message via printf to the diagnostic
                      9: **     output.  If LOG is defined, it logs it also.
                     10: **
                     11: **     Parameters:
                     12: **             f -- the format string
                     13: **             a, b, c, d, e -- parameters
                     14: **
                     15: **     Returns:
                     16: **             none
                     17: **             Through TopFrame if QuickAbort is set.
                     18: **
                     19: **     Side Effects:
                     20: **             increments Errors.
                     21: **             sets ExitStat.
                     22: */
                     23: 
                     24: # ifdef lint
                     25: int    sys_nerr;
                     26: char   *sys_errlist[];
                     27: # endif lint
                     28: char   MsgBuf[BUFSIZ*2];       /* text of most recent message */
                     29: 
                     30: /*VARARGS1*/
                     31: syserr(fmt, a, b, c, d, e)
                     32:        char *fmt;
                     33: {
                     34:        extern char Arpa_PSyserr[];
                     35:        extern char Arpa_TSyserr[];
                     36:        register char *p;
                     37: 
                     38:        /* format and output the error message */
                     39:        if (errno == 0)
                     40:                p = Arpa_PSyserr;
                     41:        else
                     42:                p = Arpa_TSyserr;
                     43:        fmtmsg(MsgBuf, (char *) NULL, p, fmt, a, b, c, d, e);
                     44:        puterrmsg(MsgBuf);
                     45: 
                     46:        /* determine exit status if not already set */
                     47:        if (ExitStat == EX_OK)
                     48:        {
                     49:                if (errno == 0)
                     50:                        ExitStat = EX_SOFTWARE;
                     51:                else
                     52:                        ExitStat = EX_OSERR;
                     53:        }
                     54: 
                     55:        /* insure that we have a queue id for logging */
                     56:        (void) queuename(CurEnv, '\0');
                     57: # ifdef LOG
                     58:        if (LogLevel > 0)
                     59:                syslog(LOG_ERR, "%s: SYSERR: %s", CurEnv->e_id, &MsgBuf[4]);
                     60: # endif LOG
                     61:        errno = 0;
                     62:        if (QuickAbort)
                     63:                longjmp(TopFrame, 2);
                     64: }
                     65: /*
                     66: **  USRERR -- Signal user error.
                     67: **
                     68: **     This is much like syserr except it is for user errors.
                     69: **
                     70: **     Parameters:
                     71: **             fmt, a, b, c, d -- printf strings
                     72: **
                     73: **     Returns:
                     74: **             none
                     75: **             Through TopFrame if QuickAbort is set.
                     76: **
                     77: **     Side Effects:
                     78: **             increments Errors.
                     79: */
                     80: 
                     81: /*VARARGS1*/
                     82: usrerr(fmt, a, b, c, d, e)
                     83:        char *fmt;
                     84: {
                     85:        extern char SuprErrs;
                     86:        extern char Arpa_Usrerr[];
                     87: 
                     88:        if (SuprErrs)
                     89:                return;
                     90: 
                     91:        fmtmsg(MsgBuf, CurEnv->e_to, Arpa_Usrerr, fmt, a, b, c, d, e);
                     92:        puterrmsg(MsgBuf);
                     93: 
                     94:        if (QuickAbort)
                     95:                longjmp(TopFrame, 1);
                     96: }
                     97: /*
                     98: **  MESSAGE -- print message (not necessarily an error)
                     99: **
                    100: **     Parameters:
                    101: **             num -- the default ARPANET error number (in ascii)
                    102: **             msg -- the message (printf fmt) -- if it begins
                    103: **                     with a digit, this number overrides num.
                    104: **             a, b, c, d, e -- printf arguments
                    105: **
                    106: **     Returns:
                    107: **             none
                    108: **
                    109: **     Side Effects:
                    110: **             none.
                    111: */
                    112: 
                    113: /*VARARGS2*/
                    114: message(num, msg, a, b, c, d, e)
                    115:        register char *num;
                    116:        register char *msg;
                    117: {
                    118:        errno = 0;
                    119:        fmtmsg(MsgBuf, CurEnv->e_to, num, msg, a, b, c, d, e);
                    120:        putmsg(MsgBuf, FALSE);
                    121: }
                    122: /*
                    123: **  NMESSAGE -- print message (not necessarily an error)
                    124: **
                    125: **     Just like "message" except it never puts the to... tag on.
                    126: **
                    127: **     Parameters:
                    128: **             num -- the default ARPANET error number (in ascii)
                    129: **             msg -- the message (printf fmt) -- if it begins
                    130: **                     with a digit, this number overrides num.
                    131: **             a, b, c, d, e -- printf arguments
                    132: **
                    133: **     Returns:
                    134: **             none
                    135: **
                    136: **     Side Effects:
                    137: **             none.
                    138: */
                    139: 
                    140: /*VARARGS2*/
                    141: nmessage(num, msg, a, b, c, d, e)
                    142:        register char *num;
                    143:        register char *msg;
                    144: {
                    145:        errno = 0;
                    146:        fmtmsg(MsgBuf, (char *) NULL, num, msg, a, b, c, d, e);
                    147:        putmsg(MsgBuf, FALSE);
                    148: }
                    149: /*
                    150: **  PUTMSG -- output error message to transcript and channel
                    151: **
                    152: **     Parameters:
                    153: **             msg -- message to output (in SMTP format).
                    154: **             holdmsg -- if TRUE, don't output a copy of the message to
                    155: **                     our output channel.
                    156: **
                    157: **     Returns:
                    158: **             none.
                    159: **
                    160: **     Side Effects:
                    161: **             Outputs msg to the transcript.
                    162: **             If appropriate, outputs it to the channel.
                    163: **             Deletes SMTP reply code number as appropriate.
                    164: */
                    165: 
                    166: putmsg(msg, holdmsg)
                    167:        char *msg;
                    168:        bool holdmsg;
                    169: {
                    170:        /* output to transcript if serious */
                    171:        if (CurEnv->e_xfp != NULL && (msg[0] == '4' || msg[0] == '5'))
                    172:                fprintf(CurEnv->e_xfp, "%s\n", msg);
                    173: 
                    174:        /* output to channel if appropriate */
                    175:        if (!holdmsg && (Verbose || msg[0] != '0'))
                    176:        {
                    177:                (void) fflush(stdout);
                    178:                if (OpMode == MD_SMTP || OpMode == MD_ARPAFTP)
                    179:                        fprintf(OutChannel, "%s\r\n", msg);
                    180:                else
                    181:                        fprintf(OutChannel, "%s\n", &msg[4]);
                    182:                (void) fflush(OutChannel);
                    183:        }
                    184: }
                    185: /*
                    186: **  PUTERRMSG -- like putmsg, but does special processing for error messages
                    187: **
                    188: **     Parameters:
                    189: **             msg -- the message to output.
                    190: **
                    191: **     Returns:
                    192: **             none.
                    193: **
                    194: **     Side Effects:
                    195: **             Sets the fatal error bit in the envelope as appropriate.
                    196: */
                    197: 
                    198: puterrmsg(msg)
                    199:        char *msg;
                    200: {
                    201:        /* output the message as usual */
                    202:        putmsg(msg, HoldErrs);
                    203: 
                    204:        /* signal the error */
                    205:        Errors++;
                    206:        if (msg[0] == '5')
                    207:                CurEnv->e_flags |= EF_FATALERRS;
                    208: }
                    209: /*
                    210: **  FMTMSG -- format a message into buffer.
                    211: **
                    212: **     Parameters:
                    213: **             eb -- error buffer to get result.
                    214: **             to -- the recipient tag for this message.
                    215: **             num -- arpanet error number.
                    216: **             fmt -- format of string.
                    217: **             a, b, c, d, e -- arguments.
                    218: **
                    219: **     Returns:
                    220: **             none.
                    221: **
                    222: **     Side Effects:
                    223: **             none.
                    224: */
                    225: 
                    226: /*VARARGS4*/
                    227: static
                    228: fmtmsg(eb, to, num, fmt, a, b, c, d, e)
                    229:        register char *eb;
                    230:        char *to;
                    231:        char *num;
                    232:        char *fmt;
                    233: {
                    234:        char del;
                    235: 
                    236:        /* output the reply code */
                    237:        if (isdigit(*fmt))
                    238:        {
                    239:                num = fmt;
                    240:                fmt += 4;
                    241:        }
                    242:        if (num[3] == '-')
                    243:                del = '-';
                    244:        else
                    245:                del = ' ';
                    246:        (void) sprintf(eb, "%3.3s%c", num, del);
                    247:        eb += 4;
                    248: 
                    249:        /* output the file name and line number */
                    250:        if (FileName != NULL)
                    251:        {
                    252:                (void) sprintf(eb, "%s: line %d: ", FileName, LineNumber);
                    253:                eb += strlen(eb);
                    254:        }
                    255: 
                    256:        /* output the "to" person */
                    257:        if (to != NULL && to[0] != '\0')
                    258:        {
                    259:                (void) sprintf(eb, "%s... ", to);
                    260:                while (*eb != '\0')
                    261:                        *eb++ &= 0177;
                    262:        }
                    263: 
                    264:        /* output the message */
                    265:        (void) sprintf(eb, fmt, a, b, c, d, e);
                    266:        while (*eb != '\0')
                    267:                *eb++ &= 0177;
                    268: 
                    269:        /* output the error code, if any */
                    270:        if (errno != 0)
                    271:        {
                    272:                extern int sys_nerr;
                    273:                extern char *sys_errlist[];
                    274:                if (errno < sys_nerr && errno > 0)
                    275:                        (void) sprintf(eb, ": %s", sys_errlist[errno]);
                    276:                else
                    277:                        (void) sprintf(eb, ": error %d", errno);
                    278:                eb += strlen(eb);
                    279:        }
                    280: }

unix.superglobalmegacorp.com

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