~peter-pearse/ubuntu/natty/diffutils/prop001

« back to all changes in this revision

Viewing changes to lib/strerror.c

  • Committer: Bazaar Package Importer
  • Author(s): Santiago Vila
  • Date: 2010-05-04 20:38:00 UTC
  • mfrom: (2.1.7 sid)
  • Revision ID: james.westby@ubuntu.com-20100504203800-f67xd9rsa9xl9qqj
Tags: 1:3.0-1
New upstream release.

Show diffs side-by-side

added added

removed removed

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