[IOMultiplexerV2] fixed win32 EWOULDBLOCK error
authorpk910 <philipp@zoelle1.de>
Wed, 28 Jan 2015 01:15:57 +0000 (02:15 +0100)
committerpk910 <philipp@zoelle1.de>
Wed, 28 Jan 2015 01:15:57 +0000 (02:15 +0100)
src/IOHandler/IOSockets.c
src/IOHandler/IOSockets.h

index d67da512dfb0ae654179fe6eb1b2b378d29e6df0..7c3c50a8f7e8b8770afd72a77f12acaed628d27d 100644 (file)
@@ -47,7 +47,7 @@
 #include <stdarg.h>
 
 #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)) \r
                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) {\r
+                               if(bytes <= 0) {
+                                       int errcode;
+                                       #ifdef WIN32
+                                       errcode = WSAGetLastError();
+                                       #else
+                                       errcode = errno;
+                                       #endif\r
                                        if((iosock->socket_flags & (IOSOCKETFLAG_SSLSOCKET | IOSOCKETFLAG_SSL_READHS)) == (IOSOCKETFLAG_SSLSOCKET | IOSOCKETFLAG_SSL_READHS)) {\r
                                                ssl_rehandshake = 1;\r
-                                       } 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;
index 8a9048a3f8f4ff3741a6d40f167f6670b7ea6fb6..7ec23b33d33bdd8afe11a62b5a9cd4ac213f1cf4 100644 (file)
@@ -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