|
@@ -44,6 +44,80 @@
|
|
|
// However lots of PGA's may mean more
|
|
// However lots of PGA's may mean more
|
|
|
#define QUEUE 100
|
|
#define QUEUE 100
|
|
|
|
|
|
|
|
|
|
+#if defined WIN32
|
|
|
|
|
+static char WSAbuf[1024];
|
|
|
|
|
+
|
|
|
|
|
+struct WSAERRORS {
|
|
|
|
|
+ int id;
|
|
|
|
|
+ char *code;
|
|
|
|
|
+} WSAErrors[] = {
|
|
|
|
|
+ { 0, "No error" },
|
|
|
|
|
+ { WSAEINTR, "Interrupted system call" },
|
|
|
|
|
+ { WSAEBADF, "Bad file number" },
|
|
|
|
|
+ { WSAEACCES, "Permission denied" },
|
|
|
|
|
+ { WSAEFAULT, "Bad address" },
|
|
|
|
|
+ { WSAEINVAL, "Invalid argument" },
|
|
|
|
|
+ { WSAEMFILE, "Too many open sockets" },
|
|
|
|
|
+ { WSAEWOULDBLOCK, "Operation would block" },
|
|
|
|
|
+ { 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, "Bad protocol option" },
|
|
|
|
|
+ { WSAEPROTONOSUPPORT, "Protocol not supported" },
|
|
|
|
|
+ { WSAESOCKTNOSUPPORT, "Socket type not supported" },
|
|
|
|
|
+ { WSAEOPNOTSUPP, "Operation not supported on socket" },
|
|
|
|
|
+ { 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, "Net connection 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, "Connection 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 system is unavailable" },
|
|
|
|
|
+ { WSAVERNOTSUPPORTED, "Winsock version out of range" },
|
|
|
|
|
+ { WSANOTINITIALISED, "WSAStartup not yet called" },
|
|
|
|
|
+ { WSAEDISCON, "Graceful shutdown in progress" },
|
|
|
|
|
+ { WSAHOST_NOT_FOUND, "Host not found" },
|
|
|
|
|
+ { WSANO_DATA, "No host data of that type was found" },
|
|
|
|
|
+ { -1, "Unknown error code" }
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+char *WSAErrorMsg(void) {
|
|
|
|
|
+ int i;
|
|
|
|
|
+ int id = WSAGetLastError();
|
|
|
|
|
+
|
|
|
|
|
+ /* Assume none of them are actually -1 */
|
|
|
|
|
+ for (i = 0; WSAErrors[i].id != -1; i++)
|
|
|
|
|
+ if (WSAErrors[i].id == id)
|
|
|
|
|
+ break;
|
|
|
|
|
+
|
|
|
|
|
+ sprintf(WSAbuf, "Socket Error: (%d) %s", id, WSAErrors[i].code);
|
|
|
|
|
+
|
|
|
|
|
+ return &(WSAbuf[0]);
|
|
|
|
|
+}
|
|
|
|
|
+#endif
|
|
|
static char *io_buffer = NULL;
|
|
static char *io_buffer = NULL;
|
|
|
static char *msg_buffer = NULL;
|
|
static char *msg_buffer = NULL;
|
|
|
static SOCKETTYPE sock = INVSOCK;
|
|
static SOCKETTYPE sock = INVSOCK;
|