|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T e
Length: 14330 (0x37fa) Types: TextFile Names: »err.c,v«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit └─⟦bfebc70e2⟧ »EurOpenD3/mail/sendmail-5.65b+IDA-1.4.3.tar.Z« └─⟦f9e35cd84⟧ └─⟦this⟧ »sendmail/src/RCS/err.c,v«
head 5.10; branch 5.10.0; access; symbols UICSO:5.10.0 VANILLA:5.10; locks; strict; comment @ * @; 5.10 date 90.06.20.08.35.48; author paul; state Exp; branches 5.10.0.1; next ; 5.10.0.1 date 90.10.25.09.13.17; author paul; state Exp; branches; next 5.10.0.2; 5.10.0.2 date 90.10.25.20.10.52; author paul; state Exp; branches; next 5.10.0.3; 5.10.0.3 date 90.11.07.13.53.44; author paul; state Exp; branches; next 5.10.0.4; 5.10.0.4 date 90.11.24.02.59.46; author paul; state Exp; branches; next 5.10.0.5; 5.10.0.5 date 90.11.26.20.41.21; author paul; state Exp; branches; next 5.10.0.6; 5.10.0.6 date 91.02.15.20.14.46; author paul; state Exp; branches; next 5.10.0.7; 5.10.0.7 date 91.03.04.21.48.23; author paul; state Exp; branches; next ; desc @@ 5.10 log @5.64 Berkeley release @ text @/* * Copyright (c) 1983 Eric P. Allman * Copyright (c) 1988 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted provided * that: (1) source distributions retain this entire copyright notice and * comment, and (2) distributions including binaries display the following * acknowledgement: ``This product includes software developed by the * University of California, Berkeley and its contributors'' in the * documentation or other materials provided with the distribution and in * all advertising materials mentioning features or use of this software. * Neither the name of the University nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef lint static char sccsid[] = "@@(#)err.c 5.10 (Berkeley) 6/1/90"; #endif /* not lint */ # include "sendmail.h" # include <errno.h> # include <netdb.h> /* ** 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 lint int sys_nerr; char *sys_errlist[]; # endif lint char 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); } \f /* ** 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); } \f /* ** 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); } \f /* ** 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); } \f /* ** 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); } } \f /* ** 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; } \f /* ** 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*/ static fmtmsg(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); } } \f /* ** 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 (TRY_AGAIN+MAX_ERRNO): (void) sprintf(buf, "Host Name Lookup Failure"); return (buf); } # endif VMUNIX # endif DAEMON if (errno > 0 && errno < sys_nerr) return (sys_errlist[errno]); (void) sprintf(buf, "Error %d", errno); return (buf); } @ 5.10.0.1 log @Bruce Lilly (bruce%balilly@@sonyd1.broadcast.sony.com) varargs code changes adapted to key off #define VSPRINTF in conf.h. @ text @d25 3 a27 3 #include "sendmail.h" #include <errno.h> #include <netdb.h> d36 1 a36 1 ** fmt -- the format string d48 1 a48 1 #ifdef lint d51 1 a51 1 #endif /* lint */ a54 8 #ifdef VSPRINTF syserr(va_alist) va_dcl { va_list ap; char *fmt; char buf[BUFSIZ*2]; #else /* !VSPRINTF */ a57 1 #endif /* VSPRINTF */ a61 1 static fmtmsg(); a67 7 #ifdef VSPRINTF va_start(ap); fmt = va_arg(ap, char *); (void) vsprintf(buf, fmt, ap); fmtmsg(MsgBuf, (char *) NULL, p, olderrno, buf); va_end(ap); #else /* !VSPRINTF */ a68 1 #endif /* VSPRINTF */ d80 1 a80 1 #ifdef LOG d85 1 a85 1 #endif /* LOG */ a106 8 #ifdef VSPRINTF usrerr(va_alist) va_dcl { va_list ap; char *fmt; char buf[BUFSIZ*2]; #else /* !VSPRINTF */ a109 1 #endif /* VSPRINTF */ a112 1 static fmtmsg(); a116 7 #ifdef VSPRINTF va_start(ap); fmt = va_arg(ap, char *); (void) vsprintf(buf, fmt, ap); fmtmsg(MsgBuf, CurEnv->e_to, Arpa_Usrerr, errno, buf); va_end(ap); #else /* !VSPRINTF */ a117 1 #endif /* VSPRINTF */ a139 22 #ifdef VSPRINTF void message(va_alist) va_dcl { va_list ap; register char *num; register char *msg; char buf[BUFSIZ*2]; static fmtmsg(); errno = 0; va_start(ap); num = va_arg(ap, char *); msg = va_arg(ap, char *); (void) vsprintf(buf, msg, ap); fmtmsg(MsgBuf, CurEnv->e_to, num, 0, buf); va_end(ap); putmsg(MsgBuf, FALSE); } #else /* !VSPRINTF */ void a143 2 static fmtmsg(); a147 1 #endif /* VSPRINTF */ a166 20 #ifdef VSPRINTF nmessage(va_alist) va_dcl { va_list ap; register char *num; register char *msg; char buf[BUFSIZ*2]; static fmtmsg(); errno = 0; va_start(ap); num = va_arg(ap, char *); msg = va_arg(ap, char *); (void) vsprintf(buf, msg, ap); fmtmsg(MsgBuf, (char *) NULL, num, 0, buf); va_end(ap); putmsg(MsgBuf, FALSE); } #else /* !VSPRINTF */ a170 2 static fmtmsg(); a174 1 #endif /* VSPRINTF */ a254 19 #ifdef VSPRINTF fmtmsg(va_alist) va_dcl { va_list ap; register char *eb; char *to; char *num; int eno; char *fmt; char del; va_start(ap); eb = va_arg(ap, char *); to = va_arg(ap, char *); num = va_arg(ap, char *); eno = va_arg(ap, int); fmt = va_arg(ap, char *); #else /* !VSPRINTF */ a262 1 #endif /* VSPRINTF */ a292 4 #ifdef VSPRINTF (void) sprintf(eb, fmt, ap); va_end(ap); #else /* !VSPRINTF */ a293 1 #endif /* VSPRINTF */ d326 1 a326 1 #ifdef SMTP d328 1 a328 1 #endif /* SMTP */ d330 2 a331 1 #if defined(DAEMON) && defined(VMUNIX) a366 1 # ifdef NAMED_BIND a369 1 # endif /* NAMED_BIND */ d371 2 a372 1 #endif /* VMUNIX && DAEMON */ @ 5.10.0.2 log @Correct bug with fmtmsg() being handed a fmt string with %-hack addresses in it and #define VSPRINTF. Reported by Steve Emmerson (steve@@unidata.ucar.edu). @ text @d61 1 d81 2 a82 1 fmtmsg(MsgBuf, (char *) NULL, p, olderrno, fmt, ap); d131 1 d148 2 a149 1 fmtmsg(MsgBuf, CurEnv->e_to, Arpa_Usrerr, errno, fmt, ap); d191 2 a192 1 fmtmsg(MsgBuf, CurEnv->e_to, num, 0, msg, ap); d235 1 d242 2 a243 1 fmtmsg(MsgBuf, (char *) NULL, num, 0, msg, ap); d328 1 a328 2 ** ap -- varargs pointer #ifdef VSPRINTF ** a, b, c, d, e -- arguments. #ifndef VSPRINTF d340 17 a356 2 fmtmsg(eb, to, num, eno, fmt, ap) va_list ap; a358 1 #endif /* VSPRINTF */ d366 1 d398 2 a399 1 (void) vsprintf(eb, fmt, ap); @ 5.10.0.3 log @More declarations to keep gcc happy. @ text @d54 1 a55 1 /*VARARGS*/ a61 1 /*VARARGS1*/ d70 1 a70 1 static fmtmsg(), puterrmsg(); d122 1 a123 1 /*VARARGS*/ a129 1 /*VARARGS1*/ d137 1 a137 1 static fmtmsg(), puterrmsg(); d171 1 a172 1 /*VARARGS*/ d180 2 a181 1 static fmtmsg(), putmsg(); a191 1 /*VARARGS2*/ d197 1 a197 1 static fmtmsg(), putmsg(); d222 1 a223 2 /*VARARGS*/ void d230 1 a230 1 static fmtmsg(), putmsg(); a240 2 /*VARARGS2*/ void d245 1 a245 1 static fmtmsg(), putmsg(); a268 1 static a300 1 static a303 2 static putmsg(); @ 5.10.0.4 log @Corrected forward declarations of putmsg(), fmtmsg(), puterrmsg(). @ text @a28 1 void fmtmsg(), putmsg(), puterrmsg(); d71 1 d139 1 d182 1 d199 2 d233 1 d250 2 d274 1 a274 1 static void d307 1 a307 1 static void d311 2 d341 1 a341 1 static void @ 5.10.0.5 log @Commented out un-needed assignment. @ text @d390 1 a390 1 /* eb += strlen(eb); un-used -pbp */ @ 5.10.0.6 log @Cast some more functions to void. @ text @a56 1 void a63 1 void a124 1 void a131 1 void @ 5.10.0.7 log @ANSIfied. @ text @d29 1 a29 14 #ifdef __STDC__ static void putmsg(const char *, int); /* bool -> int */ static void puterrmsg(const char *); # ifndef VSPRINTF static void fmtmsg(); # else /* VSPRINTF */ static void fmtmsg(char *, const char *, const char *, int, const char *, va_list); # endif /* !VSPRINTF */ #else /* !__STDC__ */ static void putmsg(); static void puterrmsg(); static void fmtmsg(); #endif /* __STDC__ */ d58 1 a58 2 syserr(fmt, va_alist) const char *fmt; d62 1 d67 1 a67 1 const char *fmt; d82 1 d128 1 a128 2 usrerr(fmt, va_alist) const char *fmt; d132 1 d137 1 a137 1 const char *fmt; d140 1 d149 1 d179 1 a179 3 message(num, msg, va_alist) register const char *num; register const char *msg; d183 2 d188 2 d198 2 a199 2 register const char *num; register const char *msg; d227 1 a227 3 nmessage(num, msg, va_alist) register const char *num; register const char *msg; d231 2 d236 2 d246 2 a247 2 register const char *num; register const char *msg; d273 1 a273 1 const char *msg; d306 1 a306 1 const char *msg; d344 2 a345 1 const char *to, *num, *fmt; d347 1 @