File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / libiconv / srclib / strerror.c
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 22:57:48 2012 UTC (12 years, 5 months ago) by misho
CVS tags: MAIN, HEAD
Initial revision

    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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>