1 /* strerror.c --- POSIX compatible system error routine 2 3 Copyright (C) 2007-2009 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 348