Ensure all backends _remember_ the connection has closed after
[u/mdw/putty] / winnet.c
index 53a40e8..fb27616 100644 (file)
--- a/winnet.c
+++ b/winnet.c
@@ -423,6 +423,8 @@ Socket sk_new(SockAddr addr, int port, int privport, sk_receiver_t receiver) {
 }
 
 void sk_close(Socket s) {
+    extern char *do_select(SOCKET skt, int startup);
+
     del234(sktree, s);
     do_select(s->s, 0);
     closesocket(s->s);
@@ -567,7 +569,11 @@ int select_result(WPARAM wParam, LPARAM lParam) {
        return 1;                      /* boggle */
 
     if ((err = WSAGETSELECTERROR(lParam)) != 0) {
-       fatalbox(winsock_error_string(err));
+        /*
+         * An error has occurred on this socket. Pass it to the
+         * receiver function.
+         */
+        return s->receiver(s, 3, winsock_error_string(err), err);
     }
 
     noise_ultralight(lParam);
@@ -582,7 +588,7 @@ int select_result(WPARAM wParam, LPARAM lParam) {
            }
        }
        if (ret < 0) {
-           fatalbox(winsock_error_string(err));
+           return s->receiver(s, 3, winsock_error_string(err), err);
        } else {
             int type = s->in_oob ? 2 : 0;
             s->in_oob = FALSE;