xref: /freebsd/contrib/sendmail/src/sysexits.c (revision 6e8394b8baa7d5d9153ab90de6824bcd19b3b4e1)
1 /*
2  * Copyright (c) 1998 Sendmail, Inc.  All rights reserved.
3  * Copyright (c) 1983, 1995-1997 Eric P. Allman.  All rights reserved.
4  * Copyright (c) 1988, 1993
5  *	The Regents of the University of California.  All rights reserved.
6  *
7  * By using this file, you agree to the terms and conditions set
8  * forth in the LICENSE file which can be found at the top level of
9  * the sendmail distribution.
10  *
11  */
12 
13 #ifndef lint
14 static char sccsid[] = "@(#)sysexits.c	8.13 (Berkeley) 5/24/1998";
15 #endif /* not lint */
16 
17 #include "sendmail.h"
18 
19 /*
20 **  SYSEXITS.C -- error messages corresponding to sysexits.h
21 **
22 **	If the first character of the string is a colon, interpolate
23 **	the current errno after the rest of the string.
24 */
25 
26 char *SysExMsg[] =
27 {
28 	/* 64 USAGE */		" 500 Bad usage",
29 	/* 65 DATAERR */	" 501 Data format error",
30 	/* 66 NOINPUT */	":550 Cannot open input",
31 	/* 67 NOUSER */		" 550 User unknown",
32 	/* 68 NOHOST */		" 550 Host unknown",
33 	/* 69 UNAVAILABLE */	" 554 Service unavailable",
34 	/* 70 SOFTWARE */	":554 Internal error",
35 	/* 71 OSERR */		":451 Operating system error",
36 	/* 72 OSFILE */		":554 System file missing",
37 	/* 73 CANTCREAT */	":550 Can't create output",
38 	/* 74 IOERR */		":451 I/O error",
39 	/* 75 TEMPFAIL */	" 250 Deferred",
40 	/* 76 PROTOCOL */	" 554 Remote protocol error",
41 	/* 77 NOPERM */		":550 Insufficient permission",
42 	/* 78 CONFIG */		" 554 Local configuration error",
43 };
44 
45 int N_SysEx = sizeof(SysExMsg) / sizeof(SysExMsg[0]);
46 /*
47 **  DSNTOEXITSTAT -- convert DSN-style error code to EX_ style.
48 **
49 **	Parameters:
50 **		dsncode -- the text of the DSN-style code.
51 **
52 **	Returns:
53 **		The corresponding exit status.
54 */
55 
56 int
57 dsntoexitstat(dsncode)
58 	char *dsncode;
59 {
60 	int code2, code3;
61 
62 	/* first the easy cases.... */
63 	if (*dsncode == '2')
64 		return EX_OK;
65 	if (*dsncode == '4')
66 		return EX_TEMPFAIL;
67 
68 	/* now decode the other two field parts */
69 	if (*++dsncode == '.')
70 		dsncode++;
71 	code2 = atoi(dsncode);
72 	while (*dsncode != '\0' && *dsncode != '.')
73 		dsncode++;
74 	if (*dsncode != '\0')
75 		dsncode++;
76 	code3 = atoi(dsncode);
77 
78 	/* and do a nested switch to work them out */
79 	switch (code2)
80 	{
81 	  case 0:	/* Other or Undefined status */
82 		return EX_UNAVAILABLE;
83 
84 	  case 1:	/* Address Status */
85 		switch (code3)
86 		{
87 		  case 0:	/* Other Address Status */
88 			return EX_DATAERR;
89 
90 		  case 1:	/* Bad destination mailbox address */
91 		  case 6:	/* Mailbox has moved, No forwarding address */
92 			return EX_NOUSER;
93 
94 		  case 2:	/* Bad destination system address */
95 		  case 8:	/* Bad senders system address */
96 			return EX_NOHOST;
97 
98 		  case 3:	/* Bad destination mailbox address syntax */
99 		  case 7:	/* Bad senders mailbox address syntax */
100 			return EX_USAGE;
101 
102 		  case 4:	/* Destination mailbox address ambiguous */
103 			return EX_UNAVAILABLE;
104 
105 		  case 5:	/* Destination address valid */
106 			return EX_OK;
107 		}
108 		break;
109 
110 	  case 2:	/* Mailbox Status */
111 		switch (code3)
112 		{
113 		  case 0:	/* Other or Undefined mailbox status */
114 		  case 1:	/* Mailbox disabled, not acccepting messages */
115 		  case 2:	/* Mailbox full */
116 		  case 4:	/* Mailing list expansion problem */
117 			return EX_UNAVAILABLE;
118 
119 		  case 3:	/* Message length exceeds administrative lim */
120 			return EX_DATAERR;
121 		}
122 		break;
123 
124 	  case 3:	/* System Status */
125 		return EX_OSERR;
126 
127 	  case 4:	/* Network and Routing Status */
128 		switch (code3)
129 		{
130 		  case 0:	/* Other or undefined network or routing stat */
131 			return EX_IOERR;
132 
133 		  case 1:	/* No answer from host */
134 		  case 3:	/* Routing server failure */
135 		  case 5:	/* Network congestion */
136 			return EX_TEMPFAIL;
137 
138 		  case 2:	/* Bad connection */
139 			return EX_IOERR;
140 
141 		  case 4:	/* Unable to route */
142 			return EX_PROTOCOL;
143 
144 		  case 6:	/* Routing loop detected */
145 			return EX_CONFIG;
146 
147 		  case 7:	/* Delivery time expired */
148 			return EX_UNAVAILABLE;
149 		}
150 		break;
151 
152 	  case 5:	/* Protocol Status */
153 		return EX_PROTOCOL;
154 
155 	  case 6:	/* Message Content or Media Status */
156 		return EX_UNAVAILABLE;
157 
158 	  case 7:	/* Security Status */
159 		return EX_DATAERR;
160 	}
161 	return EX_CONFIG;
162 }
163