1 /* sockerror.c --- convert WinSock error number to string 2 Vince Del Vecchio <vdelvecc@spd.analog.com> 3 4 This file is part of GNU CVS. 5 6 GNU CVS is free software; you can redistribute it and/or modify it 7 under the terms of the GNU General Public License as published by the 8 Free Software Foundation; either version 2, or (at your option) any 9 later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. */ 15 16 #include <stdio.h> 17 #include <winsock.h> 18 19 struct err_strs { 20 char **strs; 21 int first; 22 int last; 23 }; 24 25 static char *errs1[] = { 26 /* EINTR */ "Interrupted system call" 27 }; 28 29 static char *errs2[] = { 30 /* EBADF */ "Bad file descriptor" 31 }; 32 33 static char *errs3[] = { 34 /* EACCES */ "Permission denied", 35 /* EFAULT */ "Bad address" 36 }; 37 38 static char *errs4[] = { 39 /* EINVAL */ "Invalid argument" 40 }; 41 42 static char *errs5[] = { 43 /* EMFILE */ "Too many open files", 44 }; 45 46 static char *errs6[] = { 47 /* EWOULDBLOCK */ "Resource temporarily unavailable", 48 /* EINPROGRESS */ "Operation now in progress", 49 /* EALREADY */ "Operation already in progress", 50 /* ENOTSOCK */ "Socket operation on non-socket", 51 /* EDESTADDRREQ */ "Destination address required", 52 /* EMSGSIZE */ "Message too long", 53 /* EPROTOTYPE */ "Protocol wrong type for socket", 54 /* ENOPROTOOPT */ "Protocol not available", 55 /* EPROTONOSUPPORT */ "Protocol not supported", 56 /* ESOCKTNOSUPPORT */ "Socket type not supported", 57 /* EOPNOTSUPP */ "Operation not supported on socket", 58 /* EPFNOSUPPORT */ "Protocol family not supported", 59 /* EAFNOSUPPORT */ "Address family not supported by protocol", 60 /* EADDRINUSE */ "Address already in use", 61 /* EADDRNOTAVAIL */ "Can't assign requested address", 62 /* ENETDOWN */ "Network is down", 63 /* ENETUNREACH */ "Network is unreachable", 64 /* ENETRESET */ "Network connection dropped on reset", 65 /* ECONNABORTED */ "Software caused connection abort", 66 /* ECONNRESET */ "Connection reset by peer", 67 /* ENOBUFS */ "No buffer space available", 68 /* EISCONN */ "Socket is already connected", 69 /* ENOTCONN */ "Socket is not connected", 70 /* ESHUTDOWN */ "Can't send after socket shutdown", 71 /* ETOOMANYREFS */ "Too many references: can't splice", 72 /* ETIMEDOUT */ "Connection timed out", 73 /* ECONNREFUSED */ "Connection refused", 74 /* ELOOP */ "Too many levels of symbolic links", 75 /* ENAMETOOLONG */ "File name too long", 76 /* EHOSTDOWN */ "Host is down", 77 /* EHOSTUNREACH */ "No route to host", 78 /* ENOTEMPTY */ "Directory not empty", 79 /* EPROCLIM */ "Too many processes", 80 /* EUSERS */ "Too many users", 81 /* EDQUOT */ "Disc quota exceeded", 82 /* ESTALE */ "Stale NFS file handle", 83 /* EREMOTE */ "Object is remote" 84 }; 85 86 static char *errs7[] = { 87 /* SYSNOTREADY */ "Network subsystem unavailable", 88 /* VERNOTSUPPORTED */ "Requested WinSock version not supported", 89 /* NOTINITIALISED */ "WinSock was not initialized" 90 }; 91 92 #ifdef WSAEDISCON 93 static char *errs8[] = { 94 /* EDISCON */ "Graceful shutdown in progress" 95 }; 96 #endif 97 98 static char *errs9[] = { 99 /* HOST_NOT_FOUND */ "Unknown host", 100 /* TRY_AGAIN */ "Host name lookup failure", 101 /* NO_RECOVERY */ "Unknown server error", 102 /* NO_DATA */ "No address associated with name", 103 }; 104 105 /* Some of these errors are defined in the winsock.h header file I have, 106 but not in the Winsock 1.1 spec. I include them some of them anyway, 107 where it is not too hard to avoid referencing the symbolic constant. */ 108 109 static struct err_strs sock_errlist[] = { 110 { errs1, WSAEINTR, WSAEINTR }, 111 { errs2, WSAEBADF, WSAEBADF }, 112 { errs3, WSAEACCES, WSAEFAULT }, 113 { errs4, WSAEINVAL, WSAEINVAL }, 114 { errs5, WSAEMFILE, WSAEMFILE }, 115 { errs6, WSAEWOULDBLOCK, WSAEHOSTUNREACH + 6 }, 116 { errs7, WSASYSNOTREADY, WSANOTINITIALISED }, 117 #ifdef WSAEDISCON 118 { errs8, WSAEDISCON, WSAEDISCON }, 119 #endif 120 { errs9, WSAHOST_NOT_FOUND, WSANO_DATA } 121 }; 122 123 char * 124 sock_strerror (int errnum) 125 { 126 static char buf[40]; 127 int i; 128 129 for (i = 0; i < (sizeof sock_errlist / sizeof *sock_errlist); i++) 130 { 131 if (errnum >= sock_errlist[i].first && errnum <= sock_errlist[i].last) 132 return sock_errlist[i].strs[errnum - sock_errlist[i].first]; 133 } 134 sprintf(buf, "Unknown socket error: %d", errnum); 135 return buf; 136 } 137