Update gnulib files.
[gnutls:gnutls.git] / gl / strerror.c
1 /* strerror.c --- POSIX compatible system error routine
2
3    Copyright (C) 2007-2011 Free Software Foundation, Inc.
4
5    This program is free software: you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 3 of the License, or
8    (at your option) any later version.
9
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14
15    You should have received a copy of the GNU General Public License
16    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
17
18 #include <config.h>
19
20 #include <string.h>
21
22 #if REPLACE_STRERROR
23
24 # include <errno.h>
25 # include <stdio.h>
26
27 # if GNULIB_defined_ESOCK /* native Windows platforms */
28 #  if HAVE_WINSOCK2_H
29 #   include <winsock2.h>
30 #  endif
31 # endif
32
33 # include "intprops.h"
34
35 /* Use the system functions, not the gnulib overrides in this file.  */
36 # undef sprintf
37
38 # undef strerror
39 # if ! HAVE_DECL_STRERROR
40 #  define strerror(n) NULL
41 # endif
42
43 char *
44 rpl_strerror (int n)
45 {
46   char const *msg = NULL;
47   /* These error messages are taken from glibc/sysdeps/gnu/errlist.c.  */
48   switch (n)
49     {
50 # if GNULIB_defined_ETXTBSY
51     case ETXTBSY:
52       msg = "Text file busy";
53       break;
54 # endif
55
56 # if GNULIB_defined_ESOCK /* native Windows platforms */
57     /* EWOULDBLOCK is the same as EAGAIN.  */
58     case EINPROGRESS:
59       msg = "Operation now in progress";
60       break;
61     case EALREADY:
62       msg = "Operation already in progress";
63       break;
64     case ENOTSOCK:
65       msg = "Socket operation on non-socket";
66       break;
67     case EDESTADDRREQ:
68       msg = "Destination address required";
69       break;
70     case EMSGSIZE:
71       msg = "Message too long";
72       break;
73     case EPROTOTYPE:
74       msg = "Protocol wrong type for socket";
75       break;
76     case ENOPROTOOPT:
77       msg = "Protocol not available";
78       break;
79     case EPROTONOSUPPORT:
80       msg = "Protocol not supported";
81       break;
82     case ESOCKTNOSUPPORT:
83       msg = "Socket type not supported";
84       break;
85     case EOPNOTSUPP:
86       msg = "Operation not supported";
87       break;
88     case EPFNOSUPPORT:
89       msg = "Protocol family not supported";
90       break;
91     case EAFNOSUPPORT:
92       msg = "Address family not supported by protocol";
93       break;
94     case EADDRINUSE:
95       msg = "Address already in use";
96       break;
97     case EADDRNOTAVAIL:
98       msg = "Cannot assign requested address";
99       break;
100     case ENETDOWN:
101       msg = "Network is down";
102       break;
103     case ENETUNREACH:
104       msg = "Network is unreachable";
105       break;
106     case ENETRESET:
107       msg = "Network dropped connection on reset";
108       break;
109     case ECONNABORTED:
110       msg = "Software caused connection abort";
111       break;
112     case ECONNRESET:
113       msg = "Connection reset by peer";
114       break;
115     case ENOBUFS:
116       msg = "No buffer space available";
117       break;
118     case EISCONN:
119       msg = "Transport endpoint is already connected";
120       break;
121     case ENOTCONN:
122       msg = "Transport endpoint is not connected";
123       break;
124     case ESHUTDOWN:
125       msg = "Cannot send after transport endpoint shutdown";
126       break;
127     case ETOOMANYREFS:
128       msg = "Too many references: cannot splice";
129       break;
130     case ETIMEDOUT:
131       msg = "Connection timed out";
132       break;
133     case ECONNREFUSED:
134       msg = "Connection refused";
135       break;
136     case ELOOP:
137       msg = "Too many levels of symbolic links";
138       break;
139     case EHOSTDOWN:
140       msg = "Host is down";
141       break;
142     case EHOSTUNREACH:
143       msg = "No route to host";
144       break;
145     case EPROCLIM:
146       msg = "Too many processes";
147       break;
148     case EUSERS:
149       msg = "Too many users";
150       break;
151     case EDQUOT:
152       msg = "Disk quota exceeded";
153       break;
154     case ESTALE:
155       msg = "Stale NFS file handle";
156       break;
157     case EREMOTE:
158       msg = "Object is remote";
159       break;
160 #  if HAVE_WINSOCK2_H
161     /* WSA_INVALID_HANDLE maps to EBADF */
162     /* WSA_NOT_ENOUGH_MEMORY maps to ENOMEM */
163     /* WSA_INVALID_PARAMETER maps to EINVAL */
164     case WSA_OPERATION_ABORTED:
165       msg = "Overlapped operation aborted";
166       break;
167     case WSA_IO_INCOMPLETE:
168       msg = "Overlapped I/O event object not in signaled state";
169       break;
170     case WSA_IO_PENDING:
171       msg = "Overlapped operations will complete later";
172       break;
173     /* WSAEINTR maps to EINTR */
174     /* WSAEBADF maps to EBADF */
175     /* WSAEACCES maps to EACCES */
176     /* WSAEFAULT maps to EFAULT */
177     /* WSAEINVAL maps to EINVAL */
178     /* WSAEMFILE maps to EMFILE */
179     /* WSAEWOULDBLOCK maps to EWOULDBLOCK */
180     /* WSAEINPROGRESS is EINPROGRESS */
181     /* WSAEALREADY is EALREADY */
182     /* WSAENOTSOCK is ENOTSOCK */
183     /* WSAEDESTADDRREQ is EDESTADDRREQ */
184     /* WSAEMSGSIZE is EMSGSIZE */
185     /* WSAEPROTOTYPE is EPROTOTYPE */
186     /* WSAENOPROTOOPT is ENOPROTOOPT */
187     /* WSAEPROTONOSUPPORT is EPROTONOSUPPORT */
188     /* WSAESOCKTNOSUPPORT is ESOCKTNOSUPPORT */
189     /* WSAEOPNOTSUPP is EOPNOTSUPP */
190     /* WSAEPFNOSUPPORT is EPFNOSUPPORT */
191     /* WSAEAFNOSUPPORT is EAFNOSUPPORT */
192     /* WSAEADDRINUSE is EADDRINUSE */
193     /* WSAEADDRNOTAVAIL is EADDRNOTAVAIL */
194     /* WSAENETDOWN is ENETDOWN */
195     /* WSAENETUNREACH is ENETUNREACH */
196     /* WSAENETRESET is ENETRESET */
197     /* WSAECONNABORTED is ECONNABORTED */
198     /* WSAECONNRESET is ECONNRESET */
199     /* WSAENOBUFS is ENOBUFS */
200     /* WSAEISCONN is EISCONN */
201     /* WSAENOTCONN is ENOTCONN */
202     /* WSAESHUTDOWN is ESHUTDOWN */
203     /* WSAETOOMANYREFS is ETOOMANYREFS */
204     /* WSAETIMEDOUT is ETIMEDOUT */
205     /* WSAECONNREFUSED is ECONNREFUSED */
206     /* WSAELOOP is ELOOP */
207     /* WSAENAMETOOLONG maps to ENAMETOOLONG */
208     /* WSAEHOSTDOWN is EHOSTDOWN */
209     /* WSAEHOSTUNREACH is EHOSTUNREACH */
210     /* WSAENOTEMPTY maps to ENOTEMPTY */
211     /* WSAEPROCLIM is EPROCLIM */
212     /* WSAEUSERS is EUSERS */
213     /* WSAEDQUOT is EDQUOT */
214     /* WSAESTALE is ESTALE */
215     /* WSAEREMOTE is EREMOTE */
216     case WSASYSNOTREADY:
217       msg = "Network subsystem is unavailable";
218       break;
219     case WSAVERNOTSUPPORTED:
220       msg = "Winsock.dll version out of range";
221       break;
222     case WSANOTINITIALISED:
223       msg = "Successful WSAStartup not yet performed";
224       break;
225     case WSAEDISCON:
226       msg = "Graceful shutdown in progress";
227       break;
228     case WSAENOMORE: case WSA_E_NO_MORE:
229       msg = "No more results";
230       break;
231     case WSAECANCELLED: case WSA_E_CANCELLED:
232       msg = "Call was canceled";
233       break;
234     case WSAEINVALIDPROCTABLE:
235       msg = "Procedure call table is invalid";
236       break;
237     case WSAEINVALIDPROVIDER:
238       msg = "Service provider is invalid";
239       break;
240     case WSAEPROVIDERFAILEDINIT:
241       msg = "Service provider failed to initialize";
242       break;
243     case WSASYSCALLFAILURE:
244       msg = "System call failure";
245       break;
246     case WSASERVICE_NOT_FOUND:
247       msg = "Service not found";
248       break;
249     case WSATYPE_NOT_FOUND:
250       msg = "Class type not found";
251       break;
252     case WSAEREFUSED:
253       msg = "Database query was refused";
254       break;
255     case WSAHOST_NOT_FOUND:
256       msg = "Host not found";
257       break;
258     case WSATRY_AGAIN:
259       msg = "Nonauthoritative host not found";
260       break;
261     case WSANO_RECOVERY:
262       msg = "Nonrecoverable error";
263       break;
264     case WSANO_DATA:
265       msg = "Valid name, no data record of requested type";
266       break;
267     /* WSA_QOS_* omitted */
268 #  endif
269 # endif
270
271 # if GNULIB_defined_ENOMSG
272     case ENOMSG:
273       msg = "No message of desired type";
274       break;
275 # endif
276
277 # if GNULIB_defined_EIDRM
278     case EIDRM:
279       msg = "Identifier removed";
280       break;
281 # endif
282
283 # if GNULIB_defined_ENOLINK
284     case ENOLINK:
285       msg = "Link has been severed";
286       break;
287 # endif
288
289 # if GNULIB_defined_EPROTO
290     case EPROTO:
291       msg = "Protocol error";
292       break;
293 # endif
294
295 # if GNULIB_defined_EMULTIHOP
296     case EMULTIHOP:
297       msg = "Multihop attempted";
298       break;
299 # endif
300
301 # if GNULIB_defined_EBADMSG
302     case EBADMSG:
303       msg = "Bad message";
304       break;
305 # endif
306
307 # if GNULIB_defined_EOVERFLOW
308     case EOVERFLOW:
309       msg = "Value too large for defined data type";
310       break;
311 # endif
312
313 # if GNULIB_defined_ENOTSUP
314     case ENOTSUP:
315       msg = "Not supported";
316       break;
317 # endif
318
319 # if GNULIB_defined_ESTALE
320     case ESTALE:
321       msg = "Stale NFS file handle";
322       break;
323 # endif
324
325 # if GNULIB_defined_EDQUOT
326     case EDQUOT:
327       msg = "Disk quota exceeded";
328       break;
329 # endif
330
331 # if GNULIB_defined_ECANCELED
332     case ECANCELED:
333       msg = "Operation canceled";
334       break;
335 # endif
336     }
337
338   if (msg)
339     return (char *) msg;
340
341   {
342     char *result = strerror (n);
343
344     if (result == NULL || result[0] == '\0')
345       {
346         static char const fmt[] = "Unknown error (%d)";
347         static char msg_buf[sizeof fmt + INT_STRLEN_BOUND (n)];
348         sprintf (msg_buf, fmt, n);
349         return msg_buf;
350       }
351
352     return result;
353   }
354 }
355
356 #endif