Apply improved WinSock error handling to the few situations it still
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Mon, 18 Dec 2000 09:20:26 +0000 (09:20 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Mon, 18 Dec 2000 09:20:26 +0000 (09:20 +0000)
hadn't been applied to.

git-svn-id: svn://svn.tartarus.org/sgt/putty@827 cda61777-01e9-0310-a592-d414129be87e

winnet.c

index 2be9233..287b178 100644 (file)
--- a/winnet.c
+++ b/winnet.c
@@ -56,6 +56,47 @@ void sk_init(void) {
     sktree = newtree234(cmpfortree);
 }
 
+char *winsock_error_string(int error) {
+    switch (error) {
+      case WSAEACCES: return "Network error: Permission denied";
+      case WSAEADDRINUSE: return "Network error: Address already in use";
+      case WSAEADDRNOTAVAIL: return "Network error: Cannot assign requested address";
+      case WSAEAFNOSUPPORT: return "Network error: Address family not supported by protocol family";
+      case WSAEALREADY: return "Network error: Operation already in progress";
+      case WSAECONNABORTED: return "Network error: Software caused connection abort";
+      case WSAECONNREFUSED: return "Network error: Connection refused";
+      case WSAECONNRESET: return "Network error: Connection reset by peer";
+      case WSAEDESTADDRREQ: return "Network error: Destination address required";
+      case WSAEFAULT: return "Network error: Bad address";
+      case WSAEHOSTDOWN: return "Network error: Host is down";
+      case WSAEHOSTUNREACH: return "Network error: No route to host";
+      case WSAEINPROGRESS: return "Network error: Operation now in progress";
+      case WSAEINTR: return "Network error: Interrupted function call";
+      case WSAEINVAL: return "Network error: Invalid argument";
+      case WSAEISCONN: return "Network error: Socket is already connected";
+      case WSAEMFILE: return "Network error: Too many open files";
+      case WSAEMSGSIZE: return "Network error: Message too long";
+      case WSAENETDOWN: return "Network error: Network is down";
+      case WSAENETRESET: return "Network error: Network dropped connection on reset";
+      case WSAENETUNREACH: return "Network error: Network is unreachable";
+      case WSAENOBUFS: return "Network error: No buffer space available";
+      case WSAENOPROTOOPT: return "Network error: Bad protocol option";
+      case WSAENOTCONN: return "Network error: Socket is not connected";
+      case WSAENOTSOCK: return "Network error: Socket operation on non-socket";
+      case WSAEOPNOTSUPP: return "Network error: Operation not supported";
+      case WSAEPFNOSUPPORT: return "Network error: Protocol family not supported";
+      case WSAEPROCLIM: return "Network error: Too many processes";
+      case WSAEPROTONOSUPPORT: return "Network error: Protocol not supported";
+      case WSAEPROTOTYPE: return "Network error: Protocol wrong type for socket";
+      case WSAESHUTDOWN: return "Network error: Cannot send after socket shutdown";
+      case WSAESOCKTNOSUPPORT: return "Network error: Socket type not supported";
+      case WSAETIMEDOUT: return "Network error: Connection timed out";
+      case WSAEWOULDBLOCK: return "Network error: Resource temporarily unavailable";
+      case WSAEDISCON: return "Network error: Graceful shutdown in progress";
+      default: return "Unknown network error";
+    }
+}
+
 SockAddr sk_namelookup(char *host, char **canonicalname) {
     SockAddr ret = smalloc(sizeof(struct SockAddr_tag));
     unsigned long a;
@@ -65,10 +106,7 @@ SockAddr sk_namelookup(char *host, char **canonicalname) {
     if ( (a = inet_addr(host)) == (unsigned long) INADDR_NONE) {
        if ( (h = gethostbyname(host)) == NULL) {
            DWORD err = WSAGetLastError();
-           ret->error = (err == WSAENETDOWN ? "Network is down" :
-                         err == WSAHOST_NOT_FOUND ? "Host does not exist" :
-                         err == WSATRY_AGAIN ? "Host not found" :
-                         "gethostbyname: unknown error");
+           ret->error = winsock_error_string(err);
        } else {
            memcpy (&a, h->h_addr, sizeof(a));
            *canonicalname = h->h_name;
@@ -112,9 +150,7 @@ Socket sk_new(SockAddr addr, int port, sk_receiver_t receiver) {
 
     if (s == INVALID_SOCKET) {
        err = WSAGetLastError();
-       ret->error = (err == WSAENETDOWN ? "Network is down" :
-                     err == WSAEAFNOSUPPORT ? "TCP/IP support not present" :
-                     "socket(): unknown error");
+        ret->error = winsock_error_string(err);
        return ret;
     }
 
@@ -126,8 +162,7 @@ Socket sk_new(SockAddr addr, int port, sk_receiver_t receiver) {
     a.sin_port = htons(0);
     if (bind (s, (struct sockaddr *)&a, sizeof(a)) == SOCKET_ERROR) {
        err = WSAGetLastError();
-       ret->error = (err == WSAENETDOWN ? "Network is down" :
-                     "bind(): unknown error");
+        ret->error = winsock_error_string(err);
        return ret;
     }
 
@@ -138,11 +173,7 @@ Socket sk_new(SockAddr addr, int port, sk_receiver_t receiver) {
     a.sin_port = htons((short)port);
     if (connect (s, (struct sockaddr *)&a, sizeof(a)) == SOCKET_ERROR) {
        err = WSAGetLastError();
-       ret->error = (err == WSAENETDOWN ? "Network is down" :
-                     err == WSAECONNREFUSED ? "Connection refused" :
-                     err == WSAENETUNREACH ? "Network is unreachable" :
-                     err == WSAEHOSTUNREACH ? "No route to host" :
-                     "connect(): unknown error");
+        ret->error = winsock_error_string(err);
        return ret;
     }
 
@@ -166,47 +197,6 @@ void sk_close(Socket s) {
     sfree(s);
 }
 
-char *winsock_error_string(int error) {
-    switch (error) {
-      case WSAEACCES: return "Network error: Permission denied";
-      case WSAEADDRINUSE: return "Network error: Address already in use";
-      case WSAEADDRNOTAVAIL: return "Network error: Cannot assign requested address";
-      case WSAEAFNOSUPPORT: return "Network error: Address family not supported by protocol family";
-      case WSAEALREADY: return "Network error: Operation already in progress";
-      case WSAECONNABORTED: return "Network error: Software caused connection abort";
-      case WSAECONNREFUSED: return "Network error: Connection refused";
-      case WSAECONNRESET: return "Network error: Connection reset by peer";
-      case WSAEDESTADDRREQ: return "Network error: Destination address required";
-      case WSAEFAULT: return "Network error: Bad address";
-      case WSAEHOSTDOWN: return "Network error: Host is down";
-      case WSAEHOSTUNREACH: return "Network error: No route to host";
-      case WSAEINPROGRESS: return "Network error: Operation now in progress";
-      case WSAEINTR: return "Network error: Interrupted function call";
-      case WSAEINVAL: return "Network error: Invalid argument";
-      case WSAEISCONN: return "Network error: Socket is already connected";
-      case WSAEMFILE: return "Network error: Too many open files";
-      case WSAEMSGSIZE: return "Network error: Message too long";
-      case WSAENETDOWN: return "Network error: Network is down";
-      case WSAENETRESET: return "Network error: Network dropped connection on reset";
-      case WSAENETUNREACH: return "Network error: Network is unreachable";
-      case WSAENOBUFS: return "Network error: No buffer space available";
-      case WSAENOPROTOOPT: return "Network error: Bad protocol option";
-      case WSAENOTCONN: return "Network error: Socket is not connected";
-      case WSAENOTSOCK: return "Network error: Socket operation on non-socket";
-      case WSAEOPNOTSUPP: return "Network error: Operation not supported";
-      case WSAEPFNOSUPPORT: return "Network error: Protocol family not supported";
-      case WSAEPROCLIM: return "Network error: Too many processes";
-      case WSAEPROTONOSUPPORT: return "Network error: Protocol not supported";
-      case WSAEPROTOTYPE: return "Network error: Protocol wrong type for socket";
-      case WSAESHUTDOWN: return "Network error: Cannot send after socket shutdown";
-      case WSAESOCKTNOSUPPORT: return "Network error: Socket type not supported";
-      case WSAETIMEDOUT: return "Network error: Connection timed out";
-      case WSAEWOULDBLOCK: return "Network error: Resource temporarily unavailable";
-      case WSAEDISCON: return "Network error: Graceful shutdown in progress";
-      default: return "Unknown network error";
-    }
-}
-
 /*
  * The function which tries to send on a socket once it's deemed
  * writable.