[IOMultiplexerV2] fixed some WIN32 compilation issues
[NextIRCd.git] / src / IOHandler / IOSockets.c
index a361126b5540dd10a69160587c9fcfca49bc597c..d67da512dfb0ae654179fe6eb1b2b378d29e6df0 100644 (file)
 #include "IOSSLBackend.h"
 
 #ifdef WIN32
+#ifdef _WIN32_WINNT
+#undef _WIN32_WINNT
+#endif
 #define _WIN32_WINNT 0x501
-#include <windows.h>
 #include <winsock2.h>
+#include <windows.h>
 #include <ws2tcpip.h>
 #else
 #include <sys/socket.h>
@@ -483,6 +486,29 @@ static void iosocket_prepare_fd(int sockfd) {
        #endif
 }
 
+static void iosocket_update_parent(struct _IOSocket *iosock) {
+       if((iosock->socket_flags & IOSOCKETFLAG_PARENT_PUBLIC)) {
+               struct IOSocket *iosocket = iosock->parent;
+               iosocket->ipv6 = ((iosock->socket_flags & IOSOCKETFLAG_IPV6SOCKET) ? 1 : 0);
+               if(!(iosock->socket_flags & IOSOCKETFLAG_LISTENING))
+                       iosocket->remoteaddr = &iosock->dest.addr;
+               iosocket->localaddr = &iosock->bind.addr;
+               if(iosock->bind.addr.addresslen && (iosock->socket_flags & IOSOCKETFLAG_DYNAMIC_BIND)) {
+                       free(iosock->bind.addr.address);
+                       iosock->bind.addr.addresslen = 0;
+               }
+               if(!iosock->bind.addr.addresslen) {
+                       iosock->socket_flags |= IOSOCKETFLAG_DYNAMIC_BIND;
+                       if(iosocket->ipv6)
+                               iosock->bind.addr.addresslen = sizeof(struct sockaddr_in6);
+                       else
+                               iosock->bind.addr.addresslen = sizeof(struct sockaddr_in);
+                       iosock->bind.addr.address = malloc(iosock->bind.addr.addresslen);
+                       getsockname(iosock->fd, (struct sockaddr *)iosock->bind.addr.address, (socklen_t *)&iosock->bind.addr.addresslen);
+               }
+       }
+} 
+
 static void iosocket_connect_finish(struct _IOSocket *iosock) {
        int sockfd;
        if((iosock->socket_flags & IOSOCKETFLAG_IPV6SOCKET))
@@ -502,7 +528,7 @@ static void iosocket_connect_finish(struct _IOSocket *iosock) {
                ip6->sin6_family = AF_INET6;
                ip6->sin6_port = htons(iosock->port);
                
-               if(iosock->bind.addr.addresslen) {
+               if(iosock->bind.addr.addresslen && !(iosock->socket_flags & IOSOCKETFLAG_DYNAMIC_BIND)) {
                        struct sockaddr_in6 *ip6bind = (void*) iosock->bind.addr.address;
                        ip6bind->sin6_family = AF_INET6;
                        ip6bind->sin6_port = htons(0);
@@ -514,7 +540,7 @@ static void iosocket_connect_finish(struct _IOSocket *iosock) {
                ip4->sin_family = AF_INET;
                ip4->sin_port = htons(iosock->port);
                
-               if(iosock->bind.addr.addresslen) {
+               if(iosock->bind.addr.addresslen && !(iosock->socket_flags & IOSOCKETFLAG_DYNAMIC_BIND)) {
                        struct sockaddr_in *ip4bind = (void*) iosock->bind.addr.address;
                        ip4bind->sin_family = AF_INET;
                        ip4bind->sin_port = htons(0);
@@ -572,6 +598,7 @@ static void iosocket_listen_finish(struct _IOSocket *iosock) {
        
        listen(sockfd, 1);
        iosock->fd = sockfd;
+       iosocket_update_parent(iosock);
        
        iosocket_activate(iosock);
 }
@@ -633,8 +660,12 @@ struct _IOSocket *iosocket_accept_client(struct _IOSocket *iosock) {
                new_iosock->socket_flags |= IOSOCKETFLAG_SSLSOCKET;
                \r
                iossl_client_accepted(iosock, new_iosock);
+       } else {
+               //initialize readbuf
+               iosocket_increase_buffer(&iosock->readbuf, 1024);
        }
        
+       iosocket_update_parent(new_iosock);
        iosocket_activate(new_iosock);
        return new_iosock;
 }
@@ -982,6 +1013,8 @@ void iosocket_events_callback(struct _IOSocket *iosock, int readable, int writea
                                callback_event.type = IOSOCKETEVENT_CONNECTED;
                                engine->update(iosock);
                                
+                               iosocket_update_parent(iosock);
+                               
                                //initialize readbuf
                                iosocket_increase_buffer(&iosock->readbuf, 1024);
                        }
@@ -996,12 +1029,16 @@ void iosocket_events_callback(struct _IOSocket *iosock, int readable, int writea
                        iosocketevents_callback_retry_read:
                        if((readable && ssl_rehandshake == 0) || ssl_rehandshake == 1) {
                                int bytes;
-                               if(iosock->readbuf.buflen - iosock->readbuf.bufpos >= 128) {
+                               if(iosock->readbuf.buflen - iosock->readbuf.bufpos <= 128) {
                                        int addsize;
                                        if(iosock->readbuf.buflen >= 2048)
                                                addsize = 1024;
                                        else
                                                addsize = iosock->readbuf.buflen;
+                                       if(addsize == 0) {
+                                               iolog_trigger(IOLOG_WARNING, "readbuf length is 0 when trying to read from fd %d", iosock->fd);
+                                               addsize = 512;
+                                       }
                                        iosocket_increase_buffer(&iosock->readbuf, iosock->readbuf.buflen + addsize);
                                }
                                if((iosock->socket_flags & IOSOCKETFLAG_SSLSOCKET))