tWin32 non-blocking connect() now should test properly for failure - vaccinewar… | |
git clone git://src.adamsgaard.dk/vaccinewars | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit c31fa3d09f2d3758cb7f5544bdb3fb3f92534ce3 | |
parent 536f83dc641355f75758ab293c669e39c903d1a1 | |
Author: Ben Webb <[email protected]> | |
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(-) | |
--- | |
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_… | |
} | |
#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,¶m); | |
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 */ | |
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 wPara… | |
} | |
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 hPrevInstanc… | |
hInst=hInstance; | |
hFont=(HFONT)GetStockObject(DEFAULT_GUI_FONT); | |
WindowList=NULL; | |
+ AsyncSocketError=0; | |
if (!hPrevInstance) { | |
wc.style = CS_HREDRAW|CS_VREDRAW; | |
wc.lpfnWndProc = MainWndProc; | |
diff --git a/src/gtk.h b/src/gtk.h | |
t@@ -633,4 +633,6 @@ void gtk_spin_button_set_value(GtkSpinButton *spin_button,… | |
void gtk_spin_button_set_adjustment(GtkSpinButton *spin_button, | |
GtkAdjustment *adjustment); | |
+extern long AsyncSocketError; | |
+ | |
#endif | |
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; |