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,¶m);
(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;