Merge remote-tracking branch 'remotes/IOMultiplexer/v2'
authorpk910 <philipp@zoelle1.de>
Sun, 20 Jul 2014 23:21:00 +0000 (01:21 +0200)
committerpk910 <philipp@zoelle1.de>
Sun, 20 Jul 2014 23:21:00 +0000 (01:21 +0200)
1  2 
src/IOHandler/IOSockets.c
src/IOHandler/IOSockets.h

index a98dc5a930b94a9c4bba6701922d6124ce970cd1,9344de55a93361f0ab52d71bc2d21b124df68654..d83d0fc40b1ba879604dc0e7f52c8367c1750da4
@@@ -486,6 -486,29 +486,29 @@@ static void iosocket_prepare_fd(int soc
        #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, &iosock->bind.addr.addresslen);
+               }
+       }
+ } 
  static void iosocket_connect_finish(struct _IOSocket *iosock) {
        int sockfd;
        if((iosock->socket_flags & IOSOCKETFLAG_IPV6SOCKET))
                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);
                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);
@@@ -575,6 -598,7 +598,7 @@@ static void iosocket_listen_finish(stru
        
        listen(sockfd, 1);
        iosock->fd = sockfd;
+       iosocket_update_parent(iosock);
        
        iosocket_activate(iosock);
  }
@@@ -641,6 -665,7 +665,7 @@@ struct _IOSocket *iosocket_accept_clien
                iosocket_increase_buffer(&iosock->readbuf, 1024);
        }
        
+       iosocket_update_parent(new_iosock);
        iosocket_activate(new_iosock);
        return new_iosock;
  }
@@@ -800,32 -825,6 +825,32 @@@ void iosocket_close(struct IOSocket *io
        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;
@@@ -1014,6 -1013,8 +1039,8 @@@ void iosocket_events_callback(struct _I
                                callback_event.type = IOSOCKETEVENT_CONNECTED;
                                engine->update(iosock);
                                
+                               iosocket_update_parent(iosock);
+                               
                                //initialize readbuf
                                iosocket_increase_buffer(&iosock->readbuf, 1024);
                        }
index f804fb6216f98f66aba036eb2970c7d2f9c452e8,8a9048a3f8f4ff3741a6d40f167f6670b7ea6fb6..7ec23b33d33bdd8afe11a62b5a9cd4ac213f1cf4
@@@ -87,6 -87,9 +87,9 @@@ extern struct _IOSocket *iosocket_last
  #define IOSOCKETFLAG_OVERRIDE_WANT_R  0x00100000
  #define IOSOCKETFLAG_OVERRIDE_WANT_W  0x00200000
  
+ /* _IOSocket socket_flags */
+ #define IOSOCKETFLAG_DYNAMIC_BIND     0x00400000
  /* Parent descriptors */
  #define IOSOCKETFLAG_PARENT_PUBLIC    0x10000000
  #define IOSOCKETFLAG_PARENT_DNSENGINE 0x20000000
@@@ -173,9 -176,13 +176,13 @@@ enum IOSocketEventType 
  struct IOSocket {
        void *iosocket;
        
+       struct IODNSAddress *remoteaddr;
+       struct IODNSAddress *localaddr;
+       
        enum IOSocketStatus status;
        int listening : 1;
        int ssl : 1;
+       int ipv6 : 1;
        int parse_delimiter : 1;
        int parse_empty : 1; /* parse "empty" lines (only if parse_delimiter is set) */
        unsigned char delimiters[IOSOCKET_PARSE_DELIMITERS_COUNT];
@@@ -206,8 -213,5 +213,8 @@@ void iosocket_send(struct IOSocket *ios
  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