xref: /csrg-svn/usr.sbin/sendmail/src/err.c (revision 4183)
1 # include "sendmail.h"
2 # ifdef LOG
3 # include <syslog.h>
4 # endif LOG
5 
6 static char	SccsId[] = "@(#)err.c	3.9	08/20/81";
7 
8 extern bool	HasXscrpt;
9 
10 /*
11 **  SYSERR -- Print error message.
12 **
13 **	Prints an error message via printf to the diagnostic
14 **	output.  If LOG is defined, it logs it also.
15 **
16 **	Parameters:
17 **		f -- the format string
18 **		a, b, c, d, e -- parameters
19 **
20 **	Returns:
21 **		none
22 **
23 **	Side Effects:
24 **		increments Errors.
25 **		sets ExitStat.
26 */
27 
28 # ifdef lint
29 int	sys_nerr;
30 char	*sys_errlist[];
31 # endif lint
32 
33 /*VARARGS1*/
34 syserr(fmt, a, b, c, d, e)
35 	char *fmt;
36 {
37 	static char errbuf[MAXLINE+1];
38 	extern char *sys_errlist[];
39 	extern int sys_nerr;
40 	register char *eb = errbuf;
41 	extern char Arpa_Syserr[];
42 
43 	/* add arpanet error number if not present */
44 	if (!isdigit(*fmt))
45 	{
46 		(void) strcpy(eb, Arpa_Syserr);
47 		eb[3] = ' ';
48 		eb += 4;
49 	}
50 
51 	/* put error message into buffer */
52 	(void) sprintf(eb, fmt, a, b, c, d, e);
53 	if (errno != 0)
54 	{
55 		eb += strlen(eb);
56 		if (errno < sys_nerr && errno > 0)
57 			(void) sprintf(eb, ": %s", sys_errlist[errno]);
58 		else
59 			(void) sprintf(eb, ": error %d", errno);
60 	}
61 
62 	if (ArpaMode != ARPA_NONE && !HasXscrpt)
63 		printf("%s\r\n", errbuf);
64 	else
65 		printf("sendmail: %s\n", &errbuf[4]);
66 	(void) fflush(stdout);
67 	Errors++;
68 
69 	/* determine exit status if not already set */
70 	if (ExitStat == EX_OK)
71 	{
72 		if (errno == 0)
73 			ExitStat = EX_SOFTWARE;
74 		else
75 			ExitStat = EX_OSERR;
76 	}
77 
78 # ifdef LOG
79 	syslog(LOG_ERR, "%s->%s: %s", From.q_paddr, To, errbuf);
80 # endif LOG
81 	errno = 0;
82 }
83 /*
84 **  USRERR -- Signal user error.
85 **
86 **	This is much like syserr except it is for user errors.
87 **
88 **	Parameters:
89 **		fmt, a, b, c, d -- printf strings
90 **
91 **	Returns:
92 **		none
93 **
94 **	Side Effects:
95 **		increments Errors.
96 */
97 
98 /*VARARGS1*/
99 usrerr(fmt, a, b, c, d, e)
100 	char *fmt;
101 {
102 	extern char SuprErrs;
103 	extern char Arpa_Usrerr[];
104 
105 	if (SuprErrs)
106 		return;
107 	Errors++;
108 
109 	message(Arpa_Usrerr, fmt, a, b, c, d, e);
110 }
111 /*
112 **  MESSAGE -- print message (not necessarily an error)
113 **
114 **	Parameters:
115 **		num -- the default ARPANET error number (in ascii)
116 **		msg -- the message (printf fmt) -- if it begins
117 **			with a digit, this number overrides num.
118 **		a, b, c, d, e -- printf arguments
119 **
120 **	Returns:
121 **		none
122 **
123 **	Side Effects:
124 **		none.
125 */
126 
127 /*VARARGS2*/
128 message(num, msg, a, b, c, d, e)
129 	register char *num;
130 	register char *msg;
131 {
132 	/* compute error number */
133 	if (isdigit(*msg))
134 	{
135 		num = msg;
136 		msg += 4;
137 	}
138 
139 	/* print arpa format header if needed */
140 	if (ArpaMode != ARPA_NONE && !HasXscrpt)
141 		printf("%.3s ", num);
142 
143 	if (To != NULL && To[0] != '\0')
144 		printf("%s... ", To);
145 	printf(msg, a, b, c, d, e);
146 	if (ArpaMode != ARPA_NONE && !HasXscrpt)
147 		printf("\r");
148 	printf("\n");
149 	(void) fflush(stdout);
150 }
151