📄 err.c
字号:
/* * Copyright (c) 1988 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that this notice is preserved and that due credit is given * to the University of California at Berkeley. The name of the University * may not be used to endorse or promote products derived from this * software without specific prior written permission. This software * is provided ``as is'' without express or implied warranty. * * Sendmail * Copyright (c) 1983 Eric P. Allman * Berkeley, California */# include "sendmail.h"# include <errno.h>SCCSID(@(#)err.c 1.1 92/07/30 SMI); /* from UCB 5.8 3/13/88 *//*** SYSERR -- Print error message.**** Prints an error message via printf to the diagnostic** output. If LOG is defined, it logs it also.**** Parameters:** f -- the format string** a, b, c, d, e -- parameters**** Returns:** none** Through TopFrame if QuickAbort is set.**** Side Effects:** increments Errors.** sets ExitStat.*/# ifdef lintint sys_nerr;char *sys_errlist[];# endif lintchar MsgBuf[BUFSIZ*2]; /* text of most recent message *//*VARARGS1*/syserr(fmt, a, b, c, d, e) char *fmt;{ register char *p; int olderrno = errno; extern char Arpa_PSyserr[]; extern char Arpa_TSyserr[]; /* format and output the error message */ if (olderrno == 0) p = Arpa_PSyserr; else p = Arpa_TSyserr; fmtmsg(MsgBuf, (char *) NULL, p, olderrno, fmt, a, b, c, d, e); puterrmsg(MsgBuf); /* determine exit status if not already set */ if (ExitStat == EX_OK) { if (olderrno == 0) ExitStat = EX_SOFTWARE; else ExitStat = EX_OSERR; }# ifdef LOG if (LogLevel > 0) syslog(LOG_CRIT, "%s: SYSERR: %s", CurEnv->e_id == NULL ? "NOQUEUE" : CurEnv->e_id, &MsgBuf[4]);# endif LOG errno = 0; if (QuickAbort) longjmp(TopFrame, 2);}/*** USRERR -- Signal user error.**** This is much like syserr except it is for user errors.**** Parameters:** fmt, a, b, c, d -- printf strings**** Returns:** none** Through TopFrame if QuickAbort is set.**** Side Effects:** increments Errors.*//*VARARGS1*/usrerr(fmt, a, b, c, d, e) char *fmt;{ extern char SuprErrs; extern char Arpa_Usrerr[]; extern int errno; if (SuprErrs) return; fmtmsg(MsgBuf, CurEnv->e_to, Arpa_Usrerr, errno, fmt, a, b, c, d, e); puterrmsg(MsgBuf); if (QuickAbort) longjmp(TopFrame, 1);}/*** MESSAGE -- print message (not necessarily an error)**** Parameters:** num -- the default ARPANET error number (in ascii)** msg -- the message (printf fmt) -- if it begins** with a digit, this number overrides num.** a, b, c, d, e -- printf arguments**** Returns:** none**** Side Effects:** none.*//*VARARGS2*/message(num, msg, a, b, c, d, e) register char *num; register char *msg;{ errno = 0; fmtmsg(MsgBuf, CurEnv->e_to, num, 0, msg, a, b, c, d, e); putmsg(MsgBuf, FALSE);}/*** NMESSAGE -- print message (not necessarily an error)**** Just like "message" except it never puts the to... tag on.**** Parameters:** num -- the default ARPANET error number (in ascii)** msg -- the message (printf fmt) -- if it begins** with three digits, this number overrides num.** a, b, c, d, e -- printf arguments**** Returns:** none**** Side Effects:** none.*//*VARARGS2*/nmessage(num, msg, a, b, c, d, e) register char *num; register char *msg;{ errno = 0; fmtmsg(MsgBuf, (char *) NULL, num, 0, msg, a, b, c, d, e); putmsg(MsgBuf, FALSE);}/*** PUTMSG -- output error message to transcript and channel**** Parameters:** msg -- message to output (in SMTP format).** holdmsg -- if TRUE, don't output a copy of the message to** our output channel.**** Returns:** none.**** Side Effects:** Outputs msg to the transcript.** If appropriate, outputs it to the channel.** Deletes SMTP reply code number as appropriate.*/putmsg(msg, holdmsg) char *msg; bool holdmsg;{ /* output to transcript if serious */ if (CurEnv->e_xfp != NULL && (msg[0] == '4' || msg[0] == '5')) fprintf(CurEnv->e_xfp, "%s\n", msg); /* output to channel if appropriate */ if (!holdmsg && (Verbose || msg[0] != '0')) { (void) fflush(stdout); if (OpMode == MD_SMTP || OpMode == MD_ARPAFTP) fprintf(OutChannel, "%s\r\n", msg); else fprintf(OutChannel, "%s\n", &msg[4]); (void) fflush(OutChannel); }}/*** PUTERRMSG -- like putmsg, but does special processing for error messages**** Parameters:** msg -- the message to output.**** Returns:** none.**** Side Effects:** Sets the fatal error bit in the envelope as appropriate.*/puterrmsg(msg) char *msg;{ /* output the message as usual */ putmsg(msg, HoldErrs); /* signal the error */ Errors++; if (msg[0] == '5') CurEnv->e_flags |= EF_FATALERRS;}/*** FMTMSG -- format a message into buffer.**** Parameters:** eb -- error buffer to get result.** to -- the recipient tag for this message.** num -- arpanet error number.** en -- the error number to display.** fmt -- format of string.** a, b, c, d, e -- arguments.**** Returns:** none.**** Side Effects:** none.*//*VARARGS5*/staticfmtmsg(eb, to, num, eno, fmt, a, b, c, d, e) register char *eb; char *to; char *num; int eno; char *fmt;{ char del; /* output the reply code */ if (isdigit(fmt[0]) && isdigit(fmt[1]) && isdigit(fmt[2])) { num = fmt; fmt += 4; } if (num[3] == '-') del = '-'; else del = ' '; (void) sprintf(eb, "%3.3s%c", num, del); eb += 4; /* output the file name and line number */ if (FileName != NULL) { (void) sprintf(eb, "%s: line %d: ", FileName, LineNumber); eb += strlen(eb); } /* output the "to" person */ if (to != NULL && to[0] != '\0') { (void) sprintf(eb, "%s... ", to); while (*eb != '\0') *eb++ &= 0177; } /* output the message */ (void) sprintf(eb, fmt, a, b, c, d, e); while (*eb != '\0') *eb++ &= 0177; /* output the error code, if any */ if (eno != 0) { extern char *errstring(); (void) sprintf(eb, ": %s", errstring(eno)); eb += strlen(eb); }}/*** ERRSTRING -- return string description of error code**** Parameters:** errno -- the error number to translate**** Returns:** A string description of errno.**** Side Effects:** none.*/char *errstring(errno) int errno;{ extern char *sys_errlist[]; extern int sys_nerr; static char buf[100];# ifdef SMTP extern char *SmtpPhase;# endif SMTP# ifdef DAEMON# ifdef VMUNIX /* ** Handle special network error codes. ** ** These are 4.2/4.3bsd specific; they should be in daemon.c. */ switch (errno) { case ETIMEDOUT: case ECONNRESET: (void) strcpy(buf, sys_errlist[errno]); if (SmtpPhase != NULL) { (void) strcat(buf, " during "); (void) strcat(buf, SmtpPhase); } if (CurHostName != NULL) { (void) strcat(buf, " with "); (void) strcat(buf, CurHostName); } return (buf); case EHOSTDOWN: if (CurHostName == NULL) break; (void) sprintf(buf, "Host %s is down", CurHostName); return (buf); case ECONNREFUSED: if (CurHostName == NULL) break; (void) sprintf(buf, "Connection refused by %s", CurHostName); return (buf); case ENAMESER: if (CurHostName == NULL) break; (void) sprintf(buf, "Name Server Failure for %s", CurHostName); return (buf); }# endif VMUNIX# endif DAEMON if (errno > 0 && errno < sys_nerr) return (sys_errlist[errno]); (void) sprintf(buf, "Error %d", errno); return (buf);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -