diff options
Diffstat (limited to 'usr.sbin/sendmail/src/err.c')
| -rw-r--r-- | usr.sbin/sendmail/src/err.c | 91 |
1 files changed, 60 insertions, 31 deletions
diff --git a/usr.sbin/sendmail/src/err.c b/usr.sbin/sendmail/src/err.c index 2e0f0b91004dd..5bec0884d02af 100644 --- a/usr.sbin/sendmail/src/err.c +++ b/usr.sbin/sendmail/src/err.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983, 1995, 1996 Eric P. Allman + * Copyright (c) 1983, 1995-1997 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -33,7 +33,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)err.c 8.52 (Berkeley) 12/1/96"; +static char sccsid[] = "@(#)err.c 8.62 (Berkeley) 6/5/97"; #endif /* not lint */ # include "sendmail.h" @@ -42,8 +42,7 @@ static char sccsid[] = "@(#)err.c 8.52 (Berkeley) 12/1/96"; /* ** SYSERR -- Print error message. ** -** Prints an error message via printf to the diagnostic -** output. If LOG is defined, it logs it also. +** Prints an error message via printf to the diagnostic output. ** ** If the first character of the syserr message is `!' it will ** log this as an ALERT message and exit immediately. This can @@ -90,16 +89,17 @@ syserr(fmt, va_alist) register char *p; int olderrno = errno; bool panic; -#ifdef LOG char *uname; struct passwd *pw; char ubuf[80]; -#endif VA_LOCAL_DECL panic = *fmt == '!'; if (panic) + { fmt++; + HoldErrs = FALSE; + } /* format and output the error message */ if (olderrno == 0) @@ -130,7 +130,6 @@ syserr(fmt, va_alist) printf("syserr: ExitStat = %d\n", ExitStat); } -# ifdef LOG pw = sm_getpwuid(getuid()); if (pw != NULL) uname = pw->pw_name; @@ -141,10 +140,9 @@ syserr(fmt, va_alist) } if (LogLevel > 0) - syslog(panic ? LOG_ALERT : LOG_CRIT, "%s: SYSERR(%s): %.900s", - CurEnv->e_id == NULL ? "NOQUEUE" : CurEnv->e_id, + sm_syslog(panic ? LOG_ALERT : LOG_CRIT, CurEnv->e_id, + "SYSERR(%s): %.900s", uname, &MsgBuf[4]); -# endif /* LOG */ switch (olderrno) { case EBADF: @@ -180,7 +178,7 @@ syserr(fmt, va_alist) exit(EX_OSERR); } errno = 0; - if (QuickAbort) + if (QuickAbort || (OnlyOneError && !HoldErrs)) longjmp(TopFrame, 2); } /* @@ -251,14 +249,12 @@ usrerr(fmt, va_alist) puterrmsg(MsgBuf); -# ifdef LOG if (LogLevel > 3 && LogUsrErrs) - syslog(LOG_NOTICE, "%s: %.900s", - CurEnv->e_id == NULL ? "NOQUEUE" : CurEnv->e_id, + sm_syslog(LOG_NOTICE, CurEnv->e_id, + "%.900s", &MsgBuf[4]); -# endif /* LOG */ - if (QuickAbort) + if (QuickAbort || (OnlyOneError && !HoldErrs)) longjmp(TopFrame, 1); } /* @@ -404,10 +400,10 @@ putoutmsg(msg, holdmsg, heldmsg) if (!heldmsg && CurEnv->e_xfp != NULL && strchr("45", msg[0]) != NULL) fprintf(CurEnv->e_xfp, "%s\n", msg); -#ifdef LOG if (LogLevel >= 15 && (OpMode == MD_SMTP || OpMode == MD_DAEMON)) - syslog(LOG_INFO, "--> %s%s", msg, holdmsg ? " (held)" : ""); -#endif + sm_syslog(LOG_INFO, CurEnv->e_id, + "--> %s%s", + msg, holdmsg ? " (held)" : ""); if (msgcode == '8') msg[0] = '0'; @@ -450,14 +446,11 @@ putoutmsg(msg, holdmsg, heldmsg) /* can't call syserr, 'cause we are using MsgBuf */ HoldErrs = TRUE; -#ifdef LOG if (LogLevel > 0) - syslog(LOG_CRIT, - "%s: SYSERR: putoutmsg (%s): error on output channel sending \"%s\": %s", - CurEnv->e_id == NULL ? "NOQUEUE" : CurEnv->e_id, + sm_syslog(LOG_CRIT, CurEnv->e_id, + "SYSERR: putoutmsg (%s): error on output channel sending \"%s\": %s", CurHostName == NULL ? "NO-HOST" : CurHostName, shortenstring(msg, 203), errstring(errno)); -#endif } /* ** PUTERRMSG -- like putoutmsg, but does special processing for error messages @@ -522,7 +515,6 @@ fmtmsg(eb, to, num, eno, fmt, ap) va_list ap; { char del; - char *meb; int l; int spaceleft = sizeof MsgBuf; @@ -559,8 +551,6 @@ fmtmsg(eb, to, num, eno, fmt, ap) *eb++ &= 0177; } - meb = eb; - /* output the message */ (void) vsnprintf(eb, spaceleft, fmt, ap); spaceleft -= strlen(eb); @@ -627,7 +617,7 @@ errstring(errnum) char *dnsmsg; char *bp; static char buf[MAXLINE]; -# ifndef ERRLIST_PREDEFINED +# if !HASSTRERROR && !defined(ERRLIST_PREDEFINED) extern char *sys_errlist[]; extern int sys_nerr; # endif @@ -648,7 +638,11 @@ errstring(errnum) case ETIMEDOUT: case ECONNRESET: bp = buf; +#if HASSTRERROR + snprintf(bp, SPACELEFT(buf, bp), "%s", strerror(errnum)); +#else snprintf(bp, SPACELEFT(buf, bp), "%s", sys_errlist[errnum]); +#endif bp += strlen(bp); if (CurHostName != NULL) { @@ -690,9 +684,6 @@ errstring(errnum) return (buf); # endif - case EOPENTIMEOUT: - return "Timeout on file open"; - # if NAMED_BIND case HOST_NOT_FOUND + E_DNSBASE: dnsmsg = "host not found"; @@ -714,6 +705,40 @@ errstring(errnum) case EPERM: /* SunOS gives "Not owner" -- this is the POSIX message */ return "Operation not permitted"; + + /* + ** Error messages used internally in sendmail. + */ + + case E_SM_OPENTIMEOUT: + return "Timeout on file open"; + + case E_SM_NOSLINK: + return "Symbolic links not allowed"; + + case E_SM_NOHLINK: + return "Hard links not allowed"; + + case E_SM_REGONLY: + return "Regular files only"; + + case E_SM_ISEXEC: + return "Executable files not allowed"; + + case E_SM_WWDIR: + return "World writable directory"; + + case E_SM_GWDIR: + return "Group writable directory"; + + case E_SM_FILECHANGE: + return "File changed after open"; + + case E_SM_WWFILE: + return "World writable file"; + + case E_SM_GWFILE: + return "Group writable file"; } if (dnsmsg != NULL) @@ -731,9 +756,13 @@ errstring(errnum) return buf; } +#if HASSTRERROR + return strerror(errnum); +#else if (errnum > 0 && errnum < sys_nerr) return (sys_errlist[errnum]); (void) snprintf(buf, sizeof buf, "Error %d", errnum); return (buf); +#endif } |
