Home | History | Annotate | Download | only in lib
      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