diff options
Diffstat (limited to 'gl/strerror.c')
| -rw-r--r-- | gl/strerror.c | 242 |
1 files changed, 233 insertions, 9 deletions
diff --git a/gl/strerror.c b/gl/strerror.c index 9fe437db..787575fd 100644 --- a/gl/strerror.c +++ b/gl/strerror.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* strerror.c --- POSIX compatible system error routine | 1 | /* strerror.c --- POSIX compatible system error routine |
| 2 | 2 | ||
| 3 | Copyright (C) 2007 Free Software Foundation, Inc. | 3 | Copyright (C) 2007-2008 Free Software Foundation, Inc. |
| 4 | 4 | ||
| 5 | This program is free software: you can redistribute it and/or modify | 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 | 6 | it under the terms of the GNU General Public License as published by |
| @@ -21,8 +21,15 @@ | |||
| 21 | 21 | ||
| 22 | #if REPLACE_STRERROR | 22 | #if REPLACE_STRERROR |
| 23 | 23 | ||
| 24 | # include <errno.h> | ||
| 24 | # include <stdio.h> | 25 | # include <stdio.h> |
| 25 | 26 | ||
| 27 | # if GNULIB_defined_ESOCK /* native Windows platforms */ | ||
| 28 | # if HAVE_WINSOCK2_H | ||
| 29 | # include <winsock2.h> | ||
| 30 | # endif | ||
| 31 | # endif | ||
| 32 | |||
| 26 | # include "intprops.h" | 33 | # include "intprops.h" |
| 27 | 34 | ||
| 28 | # undef strerror | 35 | # undef strerror |
| @@ -33,17 +40,234 @@ | |||
| 33 | char * | 40 | char * |
| 34 | rpl_strerror (int n) | 41 | rpl_strerror (int n) |
| 35 | { | 42 | { |
| 36 | char *result = strerror (n); | 43 | /* These error messages are taken from glibc/sysdeps/gnu/errlist.c. */ |
| 37 | 44 | switch (n) | |
| 38 | if (result == NULL || result[0] == '\0') | ||
| 39 | { | 45 | { |
| 40 | static char const fmt[] = "Unknown error (%d)"; | 46 | # if GNULIB_defined_ETXTBSY |
| 41 | static char mesg[sizeof fmt + INT_STRLEN_BOUND (n)]; | 47 | case ETXTBSY: |
| 42 | sprintf (mesg, fmt, n); | 48 | return "Text file busy"; |
| 43 | return mesg; | 49 | # endif |
| 50 | |||
| 51 | # if GNULIB_defined_ESOCK /* native Windows platforms */ | ||
| 52 | /* EWOULDBLOCK is the same as EAGAIN. */ | ||
| 53 | case EINPROGRESS: | ||
| 54 | return "Operation now in progress"; | ||
| 55 | case EALREADY: | ||
| 56 | return "Operation already in progress"; | ||
| 57 | case ENOTSOCK: | ||
| 58 | return "Socket operation on non-socket"; | ||
| 59 | case EDESTADDRREQ: | ||
| 60 | return "Destination address required"; | ||
| 61 | case EMSGSIZE: | ||
| 62 | return "Message too long"; | ||
| 63 | case EPROTOTYPE: | ||
| 64 | return "Protocol wrong type for socket"; | ||
| 65 | case ENOPROTOOPT: | ||
| 66 | return "Protocol not available"; | ||
| 67 | case EPROTONOSUPPORT: | ||
| 68 | return "Protocol not supported"; | ||
| 69 | case ESOCKTNOSUPPORT: | ||
| 70 | return "Socket type not supported"; | ||
| 71 | case EOPNOTSUPP: | ||
| 72 | return "Operation not supported"; | ||
| 73 | case EPFNOSUPPORT: | ||
| 74 | return "Protocol family not supported"; | ||
| 75 | case EAFNOSUPPORT: | ||
| 76 | return "Address family not supported by protocol"; | ||
| 77 | case EADDRINUSE: | ||
| 78 | return "Address already in use"; | ||
| 79 | case EADDRNOTAVAIL: | ||
| 80 | return "Cannot assign requested address"; | ||
| 81 | case ENETDOWN: | ||
| 82 | return "Network is down"; | ||
| 83 | case ENETUNREACH: | ||
| 84 | return "Network is unreachable"; | ||
| 85 | case ENETRESET: | ||
| 86 | return "Network dropped connection on reset"; | ||
| 87 | case ECONNABORTED: | ||
| 88 | return "Software caused connection abort"; | ||
| 89 | case ECONNRESET: | ||
| 90 | return "Connection reset by peer"; | ||
| 91 | case ENOBUFS: | ||
| 92 | return "No buffer space available"; | ||
| 93 | case EISCONN: | ||
| 94 | return "Transport endpoint is already connected"; | ||
| 95 | case ENOTCONN: | ||
| 96 | return "Transport endpoint is not connected"; | ||
| 97 | case ESHUTDOWN: | ||
| 98 | return "Cannot send after transport endpoint shutdown"; | ||
| 99 | case ETOOMANYREFS: | ||
| 100 | return "Too many references: cannot splice"; | ||
| 101 | case ETIMEDOUT: | ||
| 102 | return "Connection timed out"; | ||
| 103 | case ECONNREFUSED: | ||
| 104 | return "Connection refused"; | ||
| 105 | case ELOOP: | ||
| 106 | return "Too many levels of symbolic links"; | ||
| 107 | case EHOSTDOWN: | ||
| 108 | return "Host is down"; | ||
| 109 | case EHOSTUNREACH: | ||
| 110 | return "No route to host"; | ||
| 111 | case EPROCLIM: | ||
| 112 | return "Too many processes"; | ||
| 113 | case EUSERS: | ||
| 114 | return "Too many users"; | ||
| 115 | case EDQUOT: | ||
| 116 | return "Disk quota exceeded"; | ||
| 117 | case ESTALE: | ||
| 118 | return "Stale NFS file handle"; | ||
| 119 | case EREMOTE: | ||
| 120 | return "Object is remote"; | ||
| 121 | # if HAVE_WINSOCK2_H | ||
| 122 | /* WSA_INVALID_HANDLE maps to EBADF */ | ||
| 123 | /* WSA_NOT_ENOUGH_MEMORY maps to ENOMEM */ | ||
| 124 | /* WSA_INVALID_PARAMETER maps to EINVAL */ | ||
| 125 | case WSA_OPERATION_ABORTED: | ||
| 126 | return "Overlapped operation aborted"; | ||
| 127 | case WSA_IO_INCOMPLETE: | ||
| 128 | return "Overlapped I/O event object not in signaled state"; | ||
| 129 | case WSA_IO_PENDING: | ||
| 130 | return "Overlapped operations will complete later"; | ||
| 131 | /* WSAEINTR maps to EINTR */ | ||
| 132 | /* WSAEBADF maps to EBADF */ | ||
| 133 | /* WSAEACCES maps to EACCES */ | ||
| 134 | /* WSAEFAULT maps to EFAULT */ | ||
| 135 | /* WSAEINVAL maps to EINVAL */ | ||
| 136 | /* WSAEMFILE maps to EMFILE */ | ||
| 137 | /* WSAEWOULDBLOCK maps to EWOULDBLOCK */ | ||
| 138 | /* WSAEINPROGRESS is EINPROGRESS */ | ||
| 139 | /* WSAEALREADY is EALREADY */ | ||
| 140 | /* WSAENOTSOCK is ENOTSOCK */ | ||
| 141 | /* WSAEDESTADDRREQ is EDESTADDRREQ */ | ||
| 142 | /* WSAEMSGSIZE is EMSGSIZE */ | ||
| 143 | /* WSAEPROTOTYPE is EPROTOTYPE */ | ||
| 144 | /* WSAENOPROTOOPT is ENOPROTOOPT */ | ||
| 145 | /* WSAEPROTONOSUPPORT is EPROTONOSUPPORT */ | ||
| 146 | /* WSAESOCKTNOSUPPORT is ESOCKTNOSUPPORT */ | ||
| 147 | /* WSAEOPNOTSUPP is EOPNOTSUPP */ | ||
| 148 | /* WSAEPFNOSUPPORT is EPFNOSUPPORT */ | ||
| 149 | /* WSAEAFNOSUPPORT is EAFNOSUPPORT */ | ||
| 150 | /* WSAEADDRINUSE is EADDRINUSE */ | ||
| 151 | /* WSAEADDRNOTAVAIL is EADDRNOTAVAIL */ | ||
| 152 | /* WSAENETDOWN is ENETDOWN */ | ||
| 153 | /* WSAENETUNREACH is ENETUNREACH */ | ||
| 154 | /* WSAENETRESET is ENETRESET */ | ||
| 155 | /* WSAECONNABORTED is ECONNABORTED */ | ||
| 156 | /* WSAECONNRESET is ECONNRESET */ | ||
| 157 | /* WSAENOBUFS is ENOBUFS */ | ||
| 158 | /* WSAEISCONN is EISCONN */ | ||
| 159 | /* WSAENOTCONN is ENOTCONN */ | ||
| 160 | /* WSAESHUTDOWN is ESHUTDOWN */ | ||
| 161 | /* WSAETOOMANYREFS is ETOOMANYREFS */ | ||
| 162 | /* WSAETIMEDOUT is ETIMEDOUT */ | ||
| 163 | /* WSAECONNREFUSED is ECONNREFUSED */ | ||
| 164 | /* WSAELOOP is ELOOP */ | ||
| 165 | /* WSAENAMETOOLONG maps to ENAMETOOLONG */ | ||
| 166 | /* WSAEHOSTDOWN is EHOSTDOWN */ | ||
| 167 | /* WSAEHOSTUNREACH is EHOSTUNREACH */ | ||
| 168 | /* WSAENOTEMPTY maps to ENOTEMPTY */ | ||
| 169 | /* WSAEPROCLIM is EPROCLIM */ | ||
| 170 | /* WSAEUSERS is EUSERS */ | ||
| 171 | /* WSAEDQUOT is EDQUOT */ | ||
| 172 | /* WSAESTALE is ESTALE */ | ||
| 173 | /* WSAEREMOTE is EREMOTE */ | ||
| 174 | case WSASYSNOTREADY: | ||
| 175 | return "Network subsystem is unavailable"; | ||
| 176 | case WSAVERNOTSUPPORTED: | ||
| 177 | return "Winsock.dll version out of range"; | ||
| 178 | case WSANOTINITIALISED: | ||
| 179 | return "Successful WSAStartup not yet performed"; | ||
| 180 | case WSAEDISCON: | ||
| 181 | return "Graceful shutdown in progress"; | ||
| 182 | case WSAENOMORE: case WSA_E_NO_MORE: | ||
| 183 | return "No more results"; | ||
| 184 | case WSAECANCELLED: case WSA_E_CANCELLED: | ||
| 185 | return "Call was canceled"; | ||
| 186 | case WSAEINVALIDPROCTABLE: | ||
| 187 | return "Procedure call table is invalid"; | ||
| 188 | case WSAEINVALIDPROVIDER: | ||
| 189 | return "Service provider is invalid"; | ||
| 190 | case WSAEPROVIDERFAILEDINIT: | ||
| 191 | return "Service provider failed to initialize"; | ||
| 192 | case WSASYSCALLFAILURE: | ||
| 193 | return "System call failure"; | ||
| 194 | case WSASERVICE_NOT_FOUND: | ||
| 195 | return "Service not found"; | ||
| 196 | case WSATYPE_NOT_FOUND: | ||
| 197 | return "Class type not found"; | ||
| 198 | case WSAEREFUSED: | ||
| 199 | return "Database query was refused"; | ||
| 200 | case WSAHOST_NOT_FOUND: | ||
| 201 | return "Host not found"; | ||
| 202 | case WSATRY_AGAIN: | ||
| 203 | return "Nonauthoritative host not found"; | ||
| 204 | case WSANO_RECOVERY: | ||
| 205 | return "Nonrecoverable error"; | ||
| 206 | case WSANO_DATA: | ||
| 207 | return "Valid name, no data record of requested type"; | ||
| 208 | /* WSA_QOS_* omitted */ | ||
| 209 | # endif | ||
| 210 | # endif | ||
| 211 | |||
| 212 | # if GNULIB_defined_ENOMSG | ||
| 213 | case ENOMSG: | ||
| 214 | return "No message of desired type"; | ||
| 215 | # endif | ||
| 216 | |||
| 217 | # if GNULIB_defined_EIDRM | ||
| 218 | case EIDRM: | ||
| 219 | return "Identifier removed"; | ||
| 220 | # endif | ||
| 221 | |||
| 222 | # if GNULIB_defined_ENOLINK | ||
| 223 | case ENOLINK: | ||
| 224 | return "Link has been severed"; | ||
| 225 | # endif | ||
| 226 | |||
| 227 | # if GNULIB_defined_EPROTO | ||
| 228 | case EPROTO: | ||
| 229 | return "Protocol error"; | ||
| 230 | # endif | ||
| 231 | |||
| 232 | # if GNULIB_defined_EMULTIHOP | ||
| 233 | case EMULTIHOP: | ||
| 234 | return "Multihop attempted"; | ||
| 235 | # endif | ||
| 236 | |||
| 237 | # if GNULIB_defined_EBADMSG | ||
| 238 | case EBADMSG: | ||
| 239 | return "Bad message"; | ||
| 240 | # endif | ||
| 241 | |||
| 242 | # if GNULIB_defined_EOVERFLOW | ||
| 243 | case EOVERFLOW: | ||
| 244 | return "Value too large for defined data type"; | ||
| 245 | # endif | ||
| 246 | |||
| 247 | # if GNULIB_defined_ENOTSUP | ||
| 248 | case ENOTSUP: | ||
| 249 | return "Not supported"; | ||
| 250 | # endif | ||
| 251 | |||
| 252 | # if GNULIB_defined_ | ||
| 253 | case ECANCELED: | ||
| 254 | return "Operation canceled"; | ||
| 255 | # endif | ||
| 44 | } | 256 | } |
| 45 | 257 | ||
| 46 | return result; | 258 | { |
| 259 | char *result = strerror (n); | ||
| 260 | |||
| 261 | if (result == NULL || result[0] == '\0') | ||
| 262 | { | ||
| 263 | static char const fmt[] = "Unknown error (%d)"; | ||
| 264 | static char mesg[sizeof fmt + INT_STRLEN_BOUND (n)]; | ||
| 265 | sprintf (mesg, fmt, n); | ||
| 266 | return mesg; | ||
| 267 | } | ||
| 268 | |||
| 269 | return result; | ||
| 270 | } | ||
| 47 | } | 271 | } |
| 48 | 272 | ||
| 49 | #endif | 273 | #endif |
