tNetBuf functions now update the "Error" field when an error occurs - vaccinewa… | |
git clone git://src.adamsgaard.dk/vaccinewars | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 322ccf9499188e8f8bf6bd047e326d5fe57cc197 | |
parent b60ede18a023484b718a3eb509d999cba892589c | |
Author: Ben Webb <[email protected]> | |
Date: Thu, 13 Sep 2001 18:48:33 +0000 | |
NetBuf functions now update the "Error" field when an error occurs | |
Diffstat: | |
M src/dopewars.h | 1 + | |
M src/message.c | 33 ++++++++++++++---------------… | |
2 files changed, 16 insertions(+), 18 deletions(-) | |
--- | |
diff --git a/src/dopewars.h b/src/dopewars.h | |
t@@ -276,6 +276,7 @@ struct _NetworkBuffer { | |
ConnBuf ReadBuf; /* New data, waiting for the application */ | |
ConnBuf WriteBuf; /* Data waiting to be written to the wire */ | |
gboolean WaitConnect; /* TRUE if a non-blocking connect is in progress */ | |
+ gint Error; /* If non-NULL, any error from the last operation */ | |
}; | |
struct PLAYER_T { | |
diff --git a/src/message.c b/src/message.c | |
t@@ -530,7 +530,7 @@ gboolean ReadDataFromWire(NetworkBuffer *NetBuf) { | |
/* into the read buffer. Returns FALSE if the connection was closed, or */ | |
/* if the read buffer's maximum size was reached. */ | |
ConnBuf *conn; | |
- int CurrentPosition,BytesRead; | |
+ int CurrentPosition,BytesRead,Error; | |
conn=&NetBuf->ReadBuf; | |
CurrentPosition=conn->DataPresent; | |
while(1) { | |
t@@ -545,10 +545,13 @@ gboolean ReadDataFromWire(NetworkBuffer *NetBuf) { | |
BytesRead=recv(NetBuf->fd,&conn->Data[CurrentPosition], | |
conn->Length-CurrentPosition,0); | |
if (BytesRead==SOCKET_ERROR) { | |
+ Error = GetSocketError(); | |
#ifdef CYGWIN | |
- if (GetSocketError()==WSAEWOULDBLOCK) break; else return FALSE; | |
+ if (Error==WSAEWOULDBLOCK) break; | |
+ else { NetBuf->Error = Error; return FALSE; } | |
#else | |
- if (GetSocketError()==EAGAIN) break; else return FALSE; | |
+ if (Error==EAGAIN) break; | |
+ else if (Error!=EINTR) { NetBuf->Error = Error; return FALSE; } | |
#endif | |
} else if (BytesRead==0) { | |
return FALSE; | |
t@@ -1105,8 +1108,6 @@ char *StartConnect(int *fd,gchar *RemoteHost,unsigned Re… | |
struct sockaddr_in ClientAddr; | |
struct hostent *he; | |
static char NoHost[]= N_("Could not find host"); | |
- static char NoSocket[]= N_("Could not create network socket"); | |
- static char NoConnect[]= N_("Connection refused or no server present"); | |
if ((he=gethostbyname(RemoteHost))==NULL) { | |
return NoHost; | |
t@@ -1114,7 +1115,6 @@ char *StartConnect(int *fd,gchar *RemoteHost,unsigned Re… | |
*fd=socket(AF_INET,SOCK_STREAM,0); | |
if (*fd==SOCKET_ERROR) { | |
return strerror(errno); | |
-/* return NoSocket;*/ | |
} | |
ClientAddr.sin_family=AF_INET; | |
t@@ -1132,7 +1132,6 @@ char *StartConnect(int *fd,gchar *RemoteHost,unsigned Re… | |
#endif | |
CloseSocket(*fd); *fd=-1; | |
return strerror(errno); | |
-/* return NoConnect;*/ | |
} else { | |
fcntl(*fd,F_SETFL,O_NONBLOCK); | |
} | |
t@@ -1140,26 +1139,24 @@ char *StartConnect(int *fd,gchar *RemoteHost,unsigned … | |
} | |
char *FinishConnect(int fd) { | |
- static char NoConnect[]= N_("Connection refused or no server present"); | |
+ int Error; | |
#ifdef CYGWIN | |
- if (GetSocketError()!=0) return NoConnect; | |
- else return NULL; | |
+ Error = GetSocketError(); | |
+ if (Error==0) return NULL; | |
+ else return strerror(Error); | |
#else | |
- int optval; | |
#ifdef HAVE_SOCKLEN_T | |
socklen_t optlen; | |
#else | |
int optlen; | |
#endif | |
- optlen=sizeof(optval); | |
- if (getsockopt(fd,SOL_SOCKET,SO_ERROR,&optval,&optlen)==-1) { | |
- return strerror(errno); | |
-/* return NoConnect;*/ | |
+ optlen=sizeof(Error); | |
+ if (getsockopt(fd,SOL_SOCKET,SO_ERROR,&Error,&optlen)==-1) { | |
+ Error = errno; | |
} | |
- if (optval==0) return NULL; | |
- else return strerror(optval); | |
-/* else return NoConnect;*/ | |
+ if (Error==0) return NULL; | |
+ else return strerror(Error); | |
#endif /* CYGWIN */ | |
} | |