summaryrefslogtreecommitdiffstats
path: root/Modules/socketmodule.c
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2007-11-16 00:24:44 (GMT)
committerGuido van Rossum <guido@python.org>2007-11-16 00:24:44 (GMT)
commit5397fd1a51d2f5bbb9ca1f5a385538e6072ced26 (patch)
tree958f4896779a17524d123d0ef0e7aadbc9237639 /Modules/socketmodule.c
parent414c2b0819f908e87373cc7200fdfaa8a324b2b6 (diff)
downloadcpython-5397fd1a51d2f5bbb9ca1f5a385538e6072ced26.zip
cpython-5397fd1a51d2f5bbb9ca1f5a385538e6072ced26.tar.gz
cpython-5397fd1a51d2f5bbb9ca1f5a385538e6072ced26.tar.bz2
A patch from issue 1378 by roudkerk:
Currently on Windows set_error() make use of a large array which maps socket error numbers to error messages. This patch removes that array and just lets PyErr_SetExcFromWindowsErr() generate the message by using the Win32 function FormatMessage().
Diffstat (limited to 'Modules/socketmodule.c')
-rw-r--r--Modules/socketmodule.c86
1 files changed, 5 insertions, 81 deletions
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index 410398e..0a71a50 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -461,87 +461,11 @@ set_error(void)
{
#ifdef MS_WINDOWS
int err_no = WSAGetLastError();
- static struct {
- int no;
- const char *msg;
- } *msgp, msgs[] = {
- {WSAEINTR, "Interrupted system call"},
- {WSAEBADF, "Bad file descriptor"},
- {WSAEACCES, "Permission denied"},
- {WSAEFAULT, "Bad address"},
- {WSAEINVAL, "Invalid argument"},
- {WSAEMFILE, "Too many open files"},
- {WSAEWOULDBLOCK,
- "The socket operation could not complete "
- "without blocking"},
- {WSAEINPROGRESS, "Operation now in progress"},
- {WSAEALREADY, "Operation already in progress"},
- {WSAENOTSOCK, "Socket operation on non-socket"},
- {WSAEDESTADDRREQ, "Destination address required"},
- {WSAEMSGSIZE, "Message too long"},
- {WSAEPROTOTYPE, "Protocol wrong type for socket"},
- {WSAENOPROTOOPT, "Protocol not available"},
- {WSAEPROTONOSUPPORT, "Protocol not supported"},
- {WSAESOCKTNOSUPPORT, "Socket type not supported"},
- {WSAEOPNOTSUPP, "Operation not supported"},
- {WSAEPFNOSUPPORT, "Protocol family not supported"},
- {WSAEAFNOSUPPORT, "Address family not supported"},
- {WSAEADDRINUSE, "Address already in use"},
- {WSAEADDRNOTAVAIL, "Can't assign requested address"},
- {WSAENETDOWN, "Network is down"},
- {WSAENETUNREACH, "Network is unreachable"},
- {WSAENETRESET, "Network dropped connection on reset"},
- {WSAECONNABORTED, "Software caused connection abort"},
- {WSAECONNRESET, "Connection reset by peer"},
- {WSAENOBUFS, "No buffer space available"},
- {WSAEISCONN, "Socket is already connected"},
- {WSAENOTCONN, "Socket is not connected"},
- {WSAESHUTDOWN, "Can't send after socket shutdown"},
- {WSAETOOMANYREFS, "Too many references: can't splice"},
- {WSAETIMEDOUT, "Operation timed out"},
- {WSAECONNREFUSED, "Connection refused"},
- {WSAELOOP, "Too many levels of symbolic links"},
- {WSAENAMETOOLONG, "File name too long"},
- {WSAEHOSTDOWN, "Host is down"},
- {WSAEHOSTUNREACH, "No route to host"},
- {WSAENOTEMPTY, "Directory not empty"},
- {WSAEPROCLIM, "Too many processes"},
- {WSAEUSERS, "Too many users"},
- {WSAEDQUOT, "Disc quota exceeded"},
- {WSAESTALE, "Stale NFS file handle"},
- {WSAEREMOTE, "Too many levels of remote in path"},
- {WSASYSNOTREADY, "Network subsystem is unvailable"},
- {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
- {WSANOTINITIALISED,
- "Successful WSAStartup() not yet performed"},
- {WSAEDISCON, "Graceful shutdown in progress"},
- /* Resolver errors */
- {WSAHOST_NOT_FOUND, "No such host is known"},
- {WSATRY_AGAIN, "Host not found, or server failed"},
- {WSANO_RECOVERY, "Unexpected server error encountered"},
- {WSANO_DATA, "Valid name without requested data"},
- {WSANO_ADDRESS, "No address, look for MX record"},
- {0, NULL}
- };
- if (err_no) {
- PyObject *v;
- const char *msg = "winsock error";
-
- for (msgp = msgs; msgp->msg; msgp++) {
- if (err_no == msgp->no) {
- msg = msgp->msg;
- break;
- }
- }
-
- v = Py_BuildValue("(is)", err_no, msg);
- if (v != NULL) {
- PyErr_SetObject(socket_error, v);
- Py_DECREF(v);
- }
- return NULL;
- }
- else
+ /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
+ recognizes the error codes used by both GetLastError() and
+ WSAGetLastError */
+ if (err_no)
+ return PyErr_SetExcFromWindowsErr(socket_error, err_no);
#endif
#if defined(PYOS_OS2) && !defined(PYCC_GCC)