xref: /illumos-gate/usr/src/cmd/sendmail/src/sysexits.c (revision 581cede61ac9c14d8d4ea452562a567189eead78)
1 /*
2  * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
3  *	All rights reserved.
4  * Copyright (c) 1983, 1995-1997 Eric P. Allman.  All rights reserved.
5  * Copyright (c) 1988, 1993
6  *	The Regents of the University of California.  All rights reserved.
7  *
8  * By using this file, you agree to the terms and conditions set
9  * forth in the LICENSE file which can be found at the top level of
10  * the sendmail distribution.
11  *
12  */
13 
14 #pragma ident	"%Z%%M%	%I%	%E% SMI"
15 
16 #include <sendmail.h>
17 
18 SM_RCSID("@(#)$Id: sysexits.c,v 8.33.4.1 2002/09/09 02:42:37 gshapiro Exp $")
19 
20 /*
21 **  DSNTOEXITSTAT -- convert DSN-style error code to EX_ style.
22 **
23 **	Parameters:
24 **		dsncode -- the text of the DSN-style code.
25 **
26 **	Returns:
27 **		The corresponding exit status.
28 */
29 
30 int
31 dsntoexitstat(dsncode)
32 	char *dsncode;
33 {
34 	int code2, code3;
35 
36 	/* first the easy cases.... */
37 	if (*dsncode == '2')
38 		return EX_OK;
39 	if (*dsncode == '4')
40 		return EX_TEMPFAIL;
41 
42 	/* reject other illegal values */
43 	if (*dsncode != '5')
44 		return EX_CONFIG;
45 
46 	/* now decode the other two field parts */
47 	if (*++dsncode == '.')
48 		dsncode++;
49 	code2 = atoi(dsncode);
50 	while (*dsncode != '\0' && *dsncode != '.')
51 		dsncode++;
52 	if (*dsncode != '\0')
53 		dsncode++;
54 	code3 = atoi(dsncode);
55 
56 	/* and do a nested switch to work them out */
57 	switch (code2)
58 	{
59 	  case 0:	/* Other or Undefined status */
60 		return EX_UNAVAILABLE;
61 
62 	  case 1:	/* Address Status */
63 		switch (code3)
64 		{
65 		  case 0:	/* Other Address Status */
66 			return EX_DATAERR;
67 
68 		  case 1:	/* Bad destination mailbox address */
69 		  case 6:	/* Mailbox has moved, No forwarding address */
70 			return EX_NOUSER;
71 
72 		  case 2:	/* Bad destination system address */
73 		  case 8:	/* Bad senders system address */
74 			return EX_NOHOST;
75 
76 		  case 3:	/* Bad destination mailbox address syntax */
77 		  case 7:	/* Bad senders mailbox address syntax */
78 			return EX_USAGE;
79 
80 		  case 4:	/* Destination mailbox address ambiguous */
81 			return EX_UNAVAILABLE;
82 
83 		  case 5:	/* Destination address valid */
84 			/* According to RFC1893, this can't happen */
85 			return EX_CONFIG;
86 		}
87 		break;
88 
89 	  case 2:	/* Mailbox Status */
90 		switch (code3)
91 		{
92 		  case 0:	/* Other or Undefined mailbox status */
93 		  case 1:	/* Mailbox disabled, not accepting messages */
94 		  case 2:	/* Mailbox full */
95 		  case 4:	/* Mailing list expansion problem */
96 			return EX_UNAVAILABLE;
97 
98 		  case 3:	/* Message length exceeds administrative lim */
99 			return EX_DATAERR;
100 		}
101 		break;
102 
103 	  case 3:	/* System Status */
104 		return EX_OSERR;
105 
106 	  case 4:	/* Network and Routing Status */
107 		switch (code3)
108 		{
109 		  case 0:	/* Other or undefined network or routing stat */
110 			return EX_IOERR;
111 
112 		  case 1:	/* No answer from host */
113 		  case 3:	/* Routing server failure */
114 		  case 5:	/* Network congestion */
115 			return EX_TEMPFAIL;
116 
117 		  case 2:	/* Bad connection */
118 			return EX_IOERR;
119 
120 		  case 4:	/* Unable to route */
121 			return EX_PROTOCOL;
122 
123 		  case 6:	/* Routing loop detected */
124 			return EX_CONFIG;
125 
126 		  case 7:	/* Delivery time expired */
127 			return EX_UNAVAILABLE;
128 		}
129 		break;
130 
131 	  case 5:	/* Protocol Status */
132 		return EX_PROTOCOL;
133 
134 	  case 6:	/* Message Content or Media Status */
135 		return EX_UNAVAILABLE;
136 
137 	  case 7:	/* Security Status */
138 		return EX_DATAERR;
139 	}
140 	return EX_UNAVAILABLE;
141 }
142 /*
143 **  EXITSTAT -- convert EX_ value to error text.
144 **
145 **	Parameters:
146 **		excode -- rstatus which might consists of an EX_* value.
147 **
148 **	Returns:
149 **		The corresponding error text or the original string.
150 */
151 
152 char *
153 exitstat(excode)
154 	char *excode;
155 {
156 	char *c;
157 	int i;
158 	char *exitmsg;
159 
160 	if (excode == NULL || *excode == '\0')
161 		return excode;
162 	i = (int) strtol(excode, &c, 10);
163 	if (*c != '\0')
164 		return excode;
165 	exitmsg = sm_sysexitmsg(i);
166 	if (exitmsg != NULL)
167 		return exitmsg;
168 	return excode;
169 }
170