1 /* strerror-override.c --- POSIX compatible system error routine 2 3 Copyright (C) 2010-2012 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 /* Written by Bruno Haible <bruno (at) clisp.org>, 2010. */ 19 20 #include <config.h> 21 22 #include "strerror-override.h" 23 24 #include <errno.h> 25 26 #if GNULIB_defined_EWINSOCK /* native Windows platforms */ 27 # if HAVE_WINSOCK2_H 28 # include <winsock2.h> 29 # endif 30 #endif 31 32 /* If ERRNUM maps to an errno value defined by gnulib, return a string 33 describing the error. Otherwise return NULL. */ 34 const char * 35 strerror_override (int errnum) 36 { 37 /* These error messages are taken from glibc/sysdeps/gnu/errlist.c. */ 38 switch (errnum) 39 { 40 #if REPLACE_STRERROR_0 41 case 0: 42 return "Success"; 43 #endif 44 45 #if GNULIB_defined_ESOCK /* native Windows platforms with older <errno.h> */ 46 case EINPROGRESS: 47 return "Operation now in progress"; 48 case EALREADY: 49 return "Operation already in progress"; 50 case ENOTSOCK: 51 return "Socket operation on non-socket"; 52 case EDESTADDRREQ: 53 return "Destination address required"; 54 case EMSGSIZE: 55 return "Message too long"; 56 case EPROTOTYPE: 57 return "Protocol wrong type for socket"; 58 case ENOPROTOOPT: 59 return "Protocol not available"; 60 case EPROTONOSUPPORT: 61 return "Protocol not supported"; 62 case EOPNOTSUPP: 63 return "Operation not supported"; 64 case EAFNOSUPPORT: 65 return "Address family not supported by protocol"; 66 case EADDRINUSE: 67 return "Address already in use"; 68 case EADDRNOTAVAIL: 69 return "Cannot assign requested address"; 70 case ENETDOWN: 71 return "Network is down"; 72 case ENETUNREACH: 73 return "Network is unreachable"; 74 case ECONNRESET: 75 return "Connection reset by peer"; 76 case ENOBUFS: 77 return "No buffer space available"; 78 case EISCONN: 79 return "Transport endpoint is already connected"; 80 case ENOTCONN: 81 return "Transport endpoint is not connected"; 82 case ETIMEDOUT: 83 return "Connection timed out"; 84 case ECONNREFUSED: 85 return "Connection refused"; 86 case ELOOP: 87 return "Too many levels of symbolic links"; 88 case EHOSTUNREACH: 89 return "No route to host"; 90 case EWOULDBLOCK: 91 return "Operation would block"; 92 #endif 93 #if GNULIB_defined_ESTREAMS /* native Windows platforms with older <errno.h> */ 94 case ETXTBSY: 95 return "Text file busy"; 96 case ENODATA: 97 return "No data available"; 98 case ENOSR: 99 return "Out of streams resources"; 100 case ENOSTR: 101 return "Device not a stream"; 102 case ETIME: 103 return "Timer expired"; 104 case EOTHER: 105 return "Other error"; 106 #endif 107 #if GNULIB_defined_EWINSOCK /* native Windows platforms */ 108 case ESOCKTNOSUPPORT: 109 return "Socket type not supported"; 110 case EPFNOSUPPORT: 111 return "Protocol family not supported"; 112 case ESHUTDOWN: 113 return "Cannot send after transport endpoint shutdown"; 114 case ETOOMANYREFS: 115 return "Too many references: cannot splice"; 116 case EHOSTDOWN: 117 return "Host is down"; 118 case EPROCLIM: 119 return "Too many processes"; 120 case EUSERS: 121 return "Too many users"; 122 case EDQUOT: 123 return "Disk quota exceeded"; 124 case ESTALE: 125 return "Stale NFS file handle"; 126 case EREMOTE: 127 return "Object is remote"; 128 # if HAVE_WINSOCK2_H 129 /* WSA_INVALID_HANDLE maps to EBADF */ 130 /* WSA_NOT_ENOUGH_MEMORY maps to ENOMEM */ 131 /* WSA_INVALID_PARAMETER maps to EINVAL */ 132 case WSA_OPERATION_ABORTED: 133 return "Overlapped operation aborted"; 134 case WSA_IO_INCOMPLETE: 135 return "Overlapped I/O event object not in signaled state"; 136 case WSA_IO_PENDING: 137 return "Overlapped operations will complete later"; 138 /* WSAEINTR maps to EINTR */ 139 /* WSAEBADF maps to EBADF */ 140 /* WSAEACCES maps to EACCES */ 141 /* WSAEFAULT maps to EFAULT */ 142 /* WSAEINVAL maps to EINVAL */ 143 /* WSAEMFILE maps to EMFILE */ 144 /* WSAEWOULDBLOCK maps to EWOULDBLOCK */ 145 /* WSAEINPROGRESS maps to EINPROGRESS */ 146 /* WSAEALREADY maps to EALREADY */ 147 /* WSAENOTSOCK maps to ENOTSOCK */ 148 /* WSAEDESTADDRREQ maps to EDESTADDRREQ */ 149 /* WSAEMSGSIZE maps to EMSGSIZE */ 150 /* WSAEPROTOTYPE maps to EPROTOTYPE */ 151 /* WSAENOPROTOOPT maps to ENOPROTOOPT */ 152 /* WSAEPROTONOSUPPORT maps to EPROTONOSUPPORT */ 153 /* WSAESOCKTNOSUPPORT is ESOCKTNOSUPPORT */ 154 /* WSAEOPNOTSUPP maps to EOPNOTSUPP */ 155 /* WSAEPFNOSUPPORT is EPFNOSUPPORT */ 156 /* WSAEAFNOSUPPORT maps to EAFNOSUPPORT */ 157 /* WSAEADDRINUSE maps to EADDRINUSE */ 158 /* WSAEADDRNOTAVAIL maps to EADDRNOTAVAIL */ 159 /* WSAENETDOWN maps to ENETDOWN */ 160 /* WSAENETUNREACH maps to ENETUNREACH */ 161 /* WSAENETRESET maps to ENETRESET */ 162 /* WSAECONNABORTED maps to ECONNABORTED */ 163 /* WSAECONNRESET maps to ECONNRESET */ 164 /* WSAENOBUFS maps to ENOBUFS */ 165 /* WSAEISCONN maps to EISCONN */ 166 /* WSAENOTCONN maps to ENOTCONN */ 167 /* WSAESHUTDOWN is ESHUTDOWN */ 168 /* WSAETOOMANYREFS is ETOOMANYREFS */ 169 /* WSAETIMEDOUT maps to ETIMEDOUT */ 170 /* WSAECONNREFUSED maps to ECONNREFUSED */ 171 /* WSAELOOP maps to ELOOP */ 172 /* WSAENAMETOOLONG maps to ENAMETOOLONG */ 173 /* WSAEHOSTDOWN is EHOSTDOWN */ 174 /* WSAEHOSTUNREACH maps to EHOSTUNREACH */ 175 /* WSAENOTEMPTY maps to ENOTEMPTY */ 176 /* WSAEPROCLIM is EPROCLIM */ 177 /* WSAEUSERS is EUSERS */ 178 /* WSAEDQUOT is EDQUOT */ 179 /* WSAESTALE is ESTALE */ 180 /* WSAEREMOTE is EREMOTE */ 181 case WSASYSNOTREADY: 182 return "Network subsystem is unavailable"; 183 case WSAVERNOTSUPPORTED: 184 return "Winsock.dll version out of range"; 185 case WSANOTINITIALISED: 186 return "Successful WSAStartup not yet performed"; 187 case WSAEDISCON: 188 return "Graceful shutdown in progress"; 189 case WSAENOMORE: case WSA_E_NO_MORE: 190 return "No more results"; 191 case WSAECANCELLED: case WSA_E_CANCELLED: 192 return "Call was canceled"; 193 case WSAEINVALIDPROCTABLE: 194 return "Procedure call table is invalid"; 195 case WSAEINVALIDPROVIDER: 196 return "Service provider is invalid"; 197 case WSAEPROVIDERFAILEDINIT: 198 return "Service provider failed to initialize"; 199 case WSASYSCALLFAILURE: 200 return "System call failure"; 201 case WSASERVICE_NOT_FOUND: 202 return "Service not found"; 203 case WSATYPE_NOT_FOUND: 204 return "Class type not found"; 205 case WSAEREFUSED: 206 return "Database query was refused"; 207 case WSAHOST_NOT_FOUND: 208 return "Host not found"; 209 case WSATRY_AGAIN: 210 return "Nonauthoritative host not found"; 211 case WSANO_RECOVERY: 212 return "Nonrecoverable error"; 213 case WSANO_DATA: 214 return "Valid name, no data record of requested type"; 215 /* WSA_QOS_* omitted */ 216 # endif 217 #endif 218 219 #if GNULIB_defined_ENOMSG 220 case ENOMSG: 221 return "No message of desired type"; 222 #endif 223 224 #if GNULIB_defined_EIDRM 225 case EIDRM: 226 return "Identifier removed"; 227 #endif 228 229 #if GNULIB_defined_ENOLINK 230 case ENOLINK: 231 return "Link has been severed"; 232 #endif 233 234 #if GNULIB_defined_EPROTO 235 case EPROTO: 236 return "Protocol error"; 237 #endif 238 239 #if GNULIB_defined_EMULTIHOP 240 case EMULTIHOP: 241 return "Multihop attempted"; 242 #endif 243 244 #if GNULIB_defined_EBADMSG 245 case EBADMSG: 246 return "Bad message"; 247 #endif 248 249 #if GNULIB_defined_EOVERFLOW 250 case EOVERFLOW: 251 return "Value too large for defined data type"; 252 #endif 253 254 #if GNULIB_defined_ENOTSUP 255 case ENOTSUP: 256 return "Not supported"; 257 #endif 258 259 #if GNULIB_defined_ENETRESET 260 case ENETRESET: 261 return "Network dropped connection on reset"; 262 #endif 263 264 #if GNULIB_defined_ECONNABORTED 265 case ECONNABORTED: 266 return "Software caused connection abort"; 267 #endif 268 269 #if GNULIB_defined_ESTALE 270 case ESTALE: 271 return "Stale NFS file handle"; 272 #endif 273 274 #if GNULIB_defined_EDQUOT 275 case EDQUOT: 276 return "Disk quota exceeded"; 277 #endif 278 279 #if GNULIB_defined_ECANCELED 280 case ECANCELED: 281 return "Operation canceled"; 282 #endif 283 284 #if GNULIB_defined_EOWNERDEAD 285 case EOWNERDEAD: 286 return "Owner died"; 287 #endif 288 289 #if GNULIB_defined_ENOTRECOVERABLE 290 case ENOTRECOVERABLE: 291 return "State not recoverable"; 292 #endif 293 294 #if GNULIB_defined_EILSEQ 295 case EILSEQ: 296 return "Invalid or incomplete multibyte or wide character"; 297 #endif 298 299 default: 300 return NULL; 301 } 302 } 303