Merge from vendor branch GCC:
[dragonfly.git] / contrib / sendmail-8.13.4 / libsm / errstring.c
1 /*
2  * Copyright (c) 2001, 2003 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 #include <sm/gen.h>
14 SM_RCSID("@(#)$Id: errstring.c,v 1.19 2003/12/10 03:53:05 gshapiro Exp $")
15
16 #include <errno.h>
17 #include <stdio.h>      /* sys_errlist, on some platforms */
18
19 #include <sm/io.h>      /* sm_snprintf */
20 #include <sm/string.h>
21 #include <sm/errstring.h>
22
23 #if NAMED_BIND
24 # include <netdb.h>
25 #endif
26
27 #if LDAPMAP
28 # include <lber.h>
29 # include <ldap.h>                      /* for LDAP error codes */
30 #endif /* LDAPMAP */
31
32 /*
33 **  Notice: this file is used by libmilter. Please try to avoid
34 **      using libsm specific functions.
35 */
36
37 /*
38 **  SM_ERRSTRING -- return string description of error code
39 **
40 **      Parameters:
41 **              errnum -- the error number to translate
42 **
43 **      Returns:
44 **              A string description of errnum.
45 **
46 **      Note: this may point to a local (static) buffer.
47 */
48
49 const char *
50 sm_errstring(errnum)
51         int errnum;
52 {
53         char *ret;
54
55
56         switch (errnum)
57         {
58           case EPERM:
59                 /* SunOS gives "Not owner" -- this is the POSIX message */
60                 return "Operation not permitted";
61
62         /*
63         **  Error messages used internally in sendmail.
64         */
65
66           case E_SM_OPENTIMEOUT:
67                 return "Timeout on file open";
68
69           case E_SM_NOSLINK:
70                 return "Symbolic links not allowed";
71
72           case E_SM_NOHLINK:
73                 return "Hard links not allowed";
74
75           case E_SM_REGONLY:
76                 return "Regular files only";
77
78           case E_SM_ISEXEC:
79                 return "Executable files not allowed";
80
81           case E_SM_WWDIR:
82                 return "World writable directory";
83
84           case E_SM_GWDIR:
85                 return "Group writable directory";
86
87           case E_SM_FILECHANGE:
88                 return "File changed after open";
89
90           case E_SM_WWFILE:
91                 return "World writable file";
92
93           case E_SM_GWFILE:
94                 return "Group writable file";
95
96           case E_SM_GRFILE:
97                 return "Group readable file";
98
99           case E_SM_WRFILE:
100                 return "World readable file";
101
102         /*
103         **  DNS error messages.
104         */
105
106 #if NAMED_BIND
107           case HOST_NOT_FOUND + E_DNSBASE:
108                 return "Name server: host not found";
109
110           case TRY_AGAIN + E_DNSBASE:
111                 return "Name server: host name lookup failure";
112
113           case NO_RECOVERY + E_DNSBASE:
114                 return "Name server: non-recoverable error";
115
116           case NO_DATA + E_DNSBASE:
117                 return "Name server: no data known";
118 #endif /* NAMED_BIND */
119
120         /*
121         **  libsmdb error messages.
122         */
123
124           case SMDBE_MALLOC:
125                 return "Memory allocation failed";
126
127           case SMDBE_GDBM_IS_BAD:
128                 return "GDBM is not supported";
129
130           case SMDBE_UNSUPPORTED:
131                 return "Unsupported action";
132
133           case SMDBE_DUPLICATE:
134                 return "Key already exists";
135
136           case SMDBE_BAD_OPEN:
137                 return "Database open failed";
138
139           case SMDBE_NOT_FOUND:
140                 return "Key not found";
141
142           case SMDBE_UNKNOWN_DB_TYPE:
143                 return "Unknown database type";
144
145           case SMDBE_UNSUPPORTED_DB_TYPE:
146                 return "Support for database type not compiled into this program";
147
148           case SMDBE_INCOMPLETE:
149                 return "DB sync did not finish";
150
151           case SMDBE_KEY_EMPTY:
152                 return "Key is empty";
153
154           case SMDBE_KEY_EXIST:
155                 return "Key already exists";
156
157           case SMDBE_LOCK_DEADLOCK:
158                 return "Locker killed to resolve deadlock";
159
160           case SMDBE_LOCK_NOT_GRANTED:
161                 return "Lock unavailable";
162
163           case SMDBE_LOCK_NOT_HELD:
164                 return "Lock not held by locker";
165
166           case SMDBE_RUN_RECOVERY:
167                 return "Database panic, run recovery";
168
169           case SMDBE_IO_ERROR:
170                 return "I/O error";
171
172           case SMDBE_READ_ONLY:
173                 return "Database opened read-only";
174
175           case SMDBE_DB_NAME_TOO_LONG:
176                 return "Name too long";
177
178           case SMDBE_INVALID_PARAMETER:
179                 return "Invalid parameter";
180
181           case SMDBE_ONLY_SUPPORTS_ONE_CURSOR:
182                 return "Only one cursor allowed";
183
184           case SMDBE_NOT_A_VALID_CURSOR:
185                 return "Invalid cursor";
186
187           case SMDBE_OLD_VERSION:
188                 return "Berkeley DB file is an old version, recreate it";
189
190           case SMDBE_VERSION_MISMATCH:
191                 return "Berkeley DB version mismatch between include file and library";
192
193 #if LDAPMAP
194
195         /*
196         **  LDAP URL error messages.
197         */
198
199         /* OpenLDAP errors */
200 # ifdef LDAP_URL_ERR_MEM
201           case E_LDAPURLBASE + LDAP_URL_ERR_MEM:
202                 return "LDAP URL can't allocate memory space";
203 # endif /* LDAP_URL_ERR_MEM */
204
205 # ifdef LDAP_URL_ERR_PARAM
206           case E_LDAPURLBASE + LDAP_URL_ERR_PARAM:
207                 return "LDAP URL parameter is bad";
208 # endif /* LDAP_URL_ERR_PARAM */
209
210 # ifdef LDAP_URL_ERR_BADSCHEME
211           case E_LDAPURLBASE + LDAP_URL_ERR_BADSCHEME:
212                 return "LDAP URL doesn't begin with \"ldap[si]://\"";
213 # endif /* LDAP_URL_ERR_BADSCHEME */
214
215 # ifdef LDAP_URL_ERR_BADENCLOSURE
216           case E_LDAPURLBASE + LDAP_URL_ERR_BADENCLOSURE:
217                 return "LDAP URL is missing trailing \">\"";
218 # endif /* LDAP_URL_ERR_BADENCLOSURE */
219
220 # ifdef LDAP_URL_ERR_BADURL
221           case E_LDAPURLBASE + LDAP_URL_ERR_BADURL:
222                 return "LDAP URL is bad";
223 # endif /* LDAP_URL_ERR_BADURL */
224
225 # ifdef LDAP_URL_ERR_BADHOST
226           case E_LDAPURLBASE + LDAP_URL_ERR_BADHOST:
227                 return "LDAP URL host port is bad";
228 # endif /* LDAP_URL_ERR_BADHOST */
229
230 # ifdef LDAP_URL_ERR_BADATTRS
231           case E_LDAPURLBASE + LDAP_URL_ERR_BADATTRS:
232                 return "LDAP URL bad (or missing) attributes";
233 # endif /* LDAP_URL_ERR_BADATTRS */
234
235 # ifdef LDAP_URL_ERR_BADSCOPE
236           case E_LDAPURLBASE + LDAP_URL_ERR_BADSCOPE:
237                 return "LDAP URL scope string is invalid (or missing)";
238 # endif /* LDAP_URL_ERR_BADSCOPE */
239
240 # ifdef LDAP_URL_ERR_BADFILTER
241           case E_LDAPURLBASE + LDAP_URL_ERR_BADFILTER:
242                 return "LDAP URL bad or missing filter";
243 # endif /* LDAP_URL_ERR_BADFILTER */
244
245 # ifdef LDAP_URL_ERR_BADEXTS
246           case E_LDAPURLBASE + LDAP_URL_ERR_BADEXTS:
247                 return "LDAP URL bad or missing extensions";
248 # endif /* LDAP_URL_ERR_BADEXTS */
249
250         /* Sun LDAP errors */
251 # ifdef LDAP_URL_ERR_NOTLDAP
252           case E_LDAPURLBASE + LDAP_URL_ERR_NOTLDAP:
253                 return "LDAP URL doesn't begin with \"ldap://\"";
254 # endif /* LDAP_URL_ERR_NOTLDAP */
255
256 # ifdef LDAP_URL_ERR_NODN
257           case E_LDAPURLBASE + LDAP_URL_ERR_NODN:
258                 return "LDAP URL has no DN (required)";
259 # endif /* LDAP_URL_ERR_NODN */
260
261 #endif /* LDAPMAP */
262         }
263
264 #if LDAPMAP
265
266         /*
267         **  LDAP error messages.
268         */
269
270         if (errnum >= E_LDAPBASE)
271                 return ldap_err2string(errnum - E_LDAPBASE);
272 #endif /* LDAPMAP */
273
274         ret = strerror(errnum);
275         if (ret == NULL)
276         {
277                 static char buf[30];
278
279                 (void) sm_snprintf(buf, sizeof buf, "Error %d", errnum);
280                 return buf;
281         }
282         return ret;
283 }