tWin32 non-blocking connect() now should test properly for failure - vaccinewars - be a doctor and try to vaccinate the world
 (HTM) git clone git://src.adamsgaard.dk/vaccinewars
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit c31fa3d09f2d3758cb7f5544bdb3fb3f92534ce3
 (DIR) parent 536f83dc641355f75758ab293c669e39c903d1a1
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Wed, 20 Dec 2000 19:59:41 +0000
       
       Win32 non-blocking connect() now should test properly for failure
       
       
       Diffstat:
         M src/dopeos.c                        |      12 +++++++++++-
         M src/dopeos.h                        |       3 ---
         M src/gtk.c                           |       4 ++++
         M src/gtk.h                           |       2 ++
         M src/message.c                       |      17 +++++++++++++++--
       
       5 files changed, 32 insertions(+), 6 deletions(-)
       ---
 (DIR) diff --git a/src/dopeos.c b/src/dopeos.c
       t@@ -29,6 +29,9 @@
        #ifdef CYGWIN /* Code for native Win32 build under Cygwin */
        
        #include <conio.h>
       +#ifdef GUI_CLIENT
       +#include "gtk.h"
       +#endif
        
        CHAR_INFO RealScreen[25][80],VirtualScreen[25][80];
        HANDLE hOut,hIn;
       t@@ -274,7 +277,14 @@ int bselect(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,
        }
        
        #if NETWORKING
       -int GetSocketError() { return WSAGetLastError(); }
       +int GetSocketError() {
       +#ifdef GUI_CLIENT
       +   if (AsyncSocketError) return AsyncSocketError;
       +   else
       +#endif
       +return WSAGetLastError();
       +}
       +
        void fcntl(SOCKET s,int fsetfl,long cmd) {
           unsigned long param=1;
           ioctlsocket(s,cmd,&param);
 (DIR) diff --git a/src/dopeos.h b/src/dopeos.h
       t@@ -122,9 +122,6 @@ void fcntl(SOCKET s,int fsetfl,long cmd);
        void StartNetworking();
        void StopNetworking();
        void SetReuse(SOCKET sock);
       -#define EPIPE WSAECONNRESET 
       -#define EINPROGRESS WSAEWOULDBLOCK 
       -#define EAGAIN WSAEWOULDBLOCK 
        #endif
        
        #else /* Definitions for Unix build */
 (DIR) diff --git a/src/gtk.c b/src/gtk.c
       t@@ -554,6 +554,7 @@ static HFONT hFont;
        static GSList *WindowList=NULL;
        static GSList *GdkInputs=NULL;
        static HWND TopLevel=NULL;
       +long AsyncSocketError=0;
        
        static void gtk_set_default_font(HWND hWnd) {
           SendMessage(hWnd,WM_SETFONT,(WPARAM)hFont,MAKELPARAM(FALSE,0));
       t@@ -778,7 +779,9 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,UINT wParam,LONG lParam) {
                 }
                 break;
              case WM_SOCKETDATA:
       +         AsyncSocketError=WSAGETSELECTERROR(lParam);
                 DispatchSocketEvent((SOCKET)wParam,WSAGETSELECTEVENT(lParam));
       +         AsyncSocketError=0;
                 break;
              default:
                 return DefWindowProc(hwnd,msg,wParam,lParam);
       t@@ -791,6 +794,7 @@ void win32_init(HINSTANCE hInstance,HINSTANCE hPrevInstance) {
           hInst=hInstance;
           hFont=(HFONT)GetStockObject(DEFAULT_GUI_FONT);
           WindowList=NULL;
       +   AsyncSocketError=0;
           if (!hPrevInstance) {
              wc.style                = CS_HREDRAW|CS_VREDRAW;
              wc.lpfnWndProc        = MainWndProc;
 (DIR) diff --git a/src/gtk.h b/src/gtk.h
       t@@ -633,4 +633,6 @@ void gtk_spin_button_set_value(GtkSpinButton *spin_button,gfloat value);
        void gtk_spin_button_set_adjustment(GtkSpinButton *spin_button,
                                            GtkAdjustment *adjustment);
        
       +extern long AsyncSocketError;
       +
        #endif
 (DIR) diff --git a/src/message.c b/src/message.c
       t@@ -325,7 +325,11 @@ gboolean ReadConnectionBufferFromWire(Player *Play) {
              BytesRead=recv(Play->fd,&conn->Data[CurrentPosition],
                             conn->Length-CurrentPosition,0);
              if (BytesRead==SOCKET_ERROR) {
       +#ifdef CYGWIN
       +         if (GetSocketError()==WSAEWOULDBLOCK) break; else return FALSE;
       +#else
                 if (GetSocketError()==EAGAIN) break; else return FALSE;
       +#endif
              } else if (BytesRead==0) {
                 return FALSE;
              } else {
       t@@ -373,7 +377,11 @@ gboolean WriteConnectionBufferToWire(Player *Play) {
              BytesSent=send(Play->fd,&conn->Data[CurrentPosition],
                             conn->DataPresent-CurrentPosition,0);
              if (BytesSent==SOCKET_ERROR) {
       +#ifdef CYGWIN
       +         if (GetSocketError()==WSAEWOULDBLOCK) break; else return FALSE;
       +#else
                 if (GetSocketError()==EAGAIN) break; else return FALSE;
       +#endif
              } else {
                 CurrentPosition+=BytesSent;
              }
       t@@ -731,7 +739,11 @@ char *SetupNetwork(gboolean NonBlocking) {
           if (NonBlocking) fcntl(ClientSock,F_SETFL,O_NONBLOCK);
           if (connect(ClientSock,(struct sockaddr *)&ClientAddr,
               sizeof(struct sockaddr))==-1) {
       +#ifdef CYGWIN
       +      if (GetSocketError()==WSAEWOULDBLOCK) return NULL;
       +#else
              if (GetSocketError()==EINPROGRESS) return NULL;
       +#endif
              CloseSocket(ClientSock);
              return NoConnect;
           } else {
       t@@ -742,12 +754,13 @@ char *SetupNetwork(gboolean NonBlocking) {
        }
        
        char *FinishSetupNetwork() {
       +   static char NoConnect[]= N_("Connection refused or no server present");
        #ifdef CYGWIN
       +   if (GetSocketError()!=0) return NoConnect;
           Client=Network=TRUE;
           return NULL;
        #else
           int optval;
       -   static char NoConnect[]= N_("Connection refused or no server present");
           socklen_t optlen;
        
           optlen=sizeof(optval);
       t@@ -755,7 +768,7 @@ char *FinishSetupNetwork() {
              return NoConnect;
           }
           if (optval==0) {
       -      Client=TRUE; Network=TRUE;
       +      Client=Network=TRUE;
              return NULL;
           } else {
              return NoConnect;