From: pk910 Date: Wed, 28 Jan 2015 01:15:57 +0000 (+0100) Subject: [IOMultiplexerV2] fixed win32 EWOULDBLOCK error X-Git-Url: http://git.pk910.de/?p=NextIRCd.git;a=commitdiff_plain;h=0f7daad2c06bc06a9d66fc5d6b6e65585b767866 [IOMultiplexerV2] fixed win32 EWOULDBLOCK error --- diff --git a/src/IOHandler/IOSockets.c b/src/IOHandler/IOSockets.c index d67da51..7c3c50a 100644 --- a/src/IOHandler/IOSockets.c +++ b/src/IOHandler/IOSockets.c @@ -47,7 +47,7 @@ #include #ifndef EWOULDBLOCK -#define EWOULDBLOCK EAGAIN +#define EWOULDBLOCK WSAEWOULDBLOCK #endif struct _IOSocket *iosocket_first = NULL; @@ -825,6 +825,32 @@ void iosocket_close(struct IOSocket *iosocket) { iogc_add(iosocket); } +struct IODNSAddress *iosocket_get_remote_addr(struct IOSocket *iosocket) { + struct _IOSocket *iosock = iosocket->iosocket; + if(iosock == NULL) { + iolog_trigger(IOLOG_WARNING, "called iosocket_get_remote_addr for destroyed IOSocket in %s:%d", __FILE__, __LINE__); + return NULL; + } + if(iosock->socket_flags & IOSOCKETFLAG_PENDING_DESTDNS) + return NULL; + if(!iosock->dest.addr.addresslen) + return NULL; + return &iosock->dest.addr; +} + +struct IODNSAddress *iosocket_get_local_addr(struct IOSocket *iosocket) { + struct _IOSocket *iosock = iosocket->iosocket; + if(iosock == NULL) { + iolog_trigger(IOLOG_WARNING, "called iosocket_get_local_addr for destroyed IOSocket in %s:%d", __FILE__, __LINE__); + return NULL; + } + if(iosock->socket_flags & IOSOCKETFLAG_PENDING_BINDDNS) + return NULL; + if(!iosock->bind.addr.addresslen) + return NULL; + return &iosock->bind.addr; +} + static int iosocket_try_write(struct _IOSocket *iosock) { if(!iosock->writebuf.bufpos && !(iosock->socket_flags & IOSOCKETFLAG_SSL_WRITEHS)) return 0; @@ -1046,14 +1072,20 @@ void iosocket_events_callback(struct _IOSocket *iosock, int readable, int writea else bytes = recv(iosock->fd, iosock->readbuf.buffer + iosock->readbuf.bufpos, iosock->readbuf.buflen - iosock->readbuf.bufpos, 0); - if(bytes <= 0) { + if(bytes <= 0) { + int errcode; + #ifdef WIN32 + errcode = WSAGetLastError(); + #else + errcode = errno; + #endif if((iosock->socket_flags & (IOSOCKETFLAG_SSLSOCKET | IOSOCKETFLAG_SSL_READHS)) == (IOSOCKETFLAG_SSLSOCKET | IOSOCKETFLAG_SSL_READHS)) { ssl_rehandshake = 1; - } else if (errno != EAGAIN || errno != EWOULDBLOCK) { + } else if (errcode != EAGAIN && errcode != EWOULDBLOCK) { iosock->socket_flags |= IOSOCKETFLAG_DEAD; callback_event.type = IOSOCKETEVENT_CLOSED; - callback_event.data.errid = errno; + callback_event.data.errid = errcode; } } else { int i; diff --git a/src/IOHandler/IOSockets.h b/src/IOHandler/IOSockets.h index 8a9048a..7ec23b3 100644 --- a/src/IOHandler/IOSockets.h +++ b/src/IOHandler/IOSockets.h @@ -213,5 +213,8 @@ void iosocket_send(struct IOSocket *iosocket, const char *data, size_t datalen); void iosocket_printf(struct IOSocket *iosocket, const char *text, ...); void iosocket_close(struct IOSocket *iosocket); +struct IODNSAddress *iosocket_get_remote_addr(struct IOSocket *iosocket); +struct IODNSAddress *iosocket_get_local_addr(struct IOSocket *iosocket); + #endif #endif