1/*
2 * Copyright (c) 2001 Proofpoint, Inc. and its suppliers.
3 *	All rights reserved.
4 *
5 * By using this file, you agree to the terms and conditions set
6 * forth in the LICENSE file which can be found at the top level of
7 * the sendmail distribution.
8 */
9
10#include <sm/gen.h>
11SM_RCSID("@(#)$Id: strexit.c,v 1.6 2013-11-22 20:51:43 ca Exp $")
12#include <sm/string.h>
13#include <sm/sysexits.h>
14
15/*
16**  SM_STREXIT -- convert EX_* value from <sm/sysexits.h> to a character string
17**
18**	This function is analogous to strerror(), except that it
19**	operates on EX_* values from <sm/sysexits.h>.
20**
21**	Parameters:
22**		ex -- EX_* value
23**
24**	Results:
25**		pointer to a static message string
26*/
27
28char *
29sm_strexit(ex)
30	int ex;
31{
32	char *msg;
33	static char buf[64];
34
35	msg = sm_sysexitmsg(ex);
36	if (msg == NULL)
37	{
38		(void) sm_snprintf(buf, sizeof buf, "Unknown exit status %d",
39				   ex);
40		msg = buf;
41	}
42	return msg;
43}
44
45/*
46**  SM_SYSEXITMSG -- convert an EX_* value to a character string, or NULL
47**
48**	Parameters:
49**		ex -- EX_* value
50**
51**	Results:
52**		If ex is a known exit value, then a pointer to a static
53**		message string is returned.  Otherwise NULL is returned.
54*/
55
56char *
57sm_sysexitmsg(ex)
58	int ex;
59{
60	char *msg;
61
62	msg = sm_sysexmsg(ex);
63	if (msg != NULL)
64		return &msg[11];
65	else
66		return msg;
67}
68
69/*
70**  SM_SYSEXMSG -- convert an EX_* value to a character string, or NULL
71**
72**	Parameters:
73**		ex -- EX_* value
74**
75**	Results:
76**		If ex is a known exit value, then a pointer to a static
77**		string is returned.  Otherwise NULL is returned.
78**		The string contains the following fixed width fields:
79**		 [0]	':' if there is an errno value associated with this
80**			exit value, otherwise ' '.
81**		 [1,3]	3 digit SMTP error code
82**		 [4]	' '
83**		 [5,9]	3 digit SMTP extended error code
84**		 [10]	' '
85**		 [11,]	message string
86*/
87
88char *
89sm_sysexmsg(ex)
90	int ex;
91{
92	switch (ex)
93	{
94	  case EX_USAGE:
95		return " 500 5.0.0 Command line usage error";
96	  case EX_DATAERR:
97		return " 501 5.6.0 Data format error";
98	  case EX_NOINPUT:
99		return ":550 5.3.0 Cannot open input";
100	  case EX_NOUSER:
101		return " 550 5.1.1 User unknown";
102	  case EX_NOHOST:
103		return " 550 5.1.2 Host unknown";
104	  case EX_UNAVAILABLE:
105		return " 554 5.0.0 Service unavailable";
106	  case EX_SOFTWARE:
107		return ":554 5.3.0 Internal error";
108	  case EX_OSERR:
109		return ":451 4.0.0 Operating system error";
110	  case EX_OSFILE:
111		return ":554 5.3.5 System file missing";
112	  case EX_CANTCREAT:
113		return ":550 5.0.0 Can't create output";
114	  case EX_IOERR:
115		return ":451 4.0.0 I/O error";
116	  case EX_TEMPFAIL:
117		return " 450 4.0.0 Deferred";
118	  case EX_PROTOCOL:
119		return " 554 5.5.0 Remote protocol error";
120	  case EX_NOPERM:
121		return ":550 5.0.0 Insufficient permission";
122	  case EX_CONFIG:
123		return " 554 5.3.5 Local configuration error";
124	  default:
125		return NULL;
126	}
127}
128