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