gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r5203 - in GNUnet/src: include transports util/network util


From: gnunet
Subject: [GNUnet-SVN] r5203 - in GNUnet/src: include transports util/network util/threads
Date: Sun, 1 Jul 2007 06:26:27 -0600 (MDT)

Author: grothoff
Date: 2007-07-01 06:26:27 -0600 (Sun, 01 Jul 2007)
New Revision: 5203

Modified:
   GNUnet/src/include/gnunet_util_network.h
   GNUnet/src/transports/tcp_helper.c
   GNUnet/src/util/network/select.c
   GNUnet/src/util/threads/mutex.c
Log:
also prevent multiple incoming connections

Modified: GNUnet/src/include/gnunet_util_network.h
===================================================================
--- GNUnet/src/include/gnunet_util_network.h    2007-07-01 11:33:58 UTC (rev 
5202)
+++ GNUnet/src/include/gnunet_util_network.h    2007-07-01 12:26:27 UTC (rev 
5203)
@@ -493,6 +493,13 @@
                   void * sock_ctx);
 
 /**
+ */
+int select_update_closure(struct SelectHandle * sh,
+                         struct SocketHandle * sock,
+                         void * old_sock_ctx,
+                         void * new_sock_ctx);
+
+/**
  * Close the associated socket and remove it from the
  * set of sockets managed by select.
  */

Modified: GNUnet/src/transports/tcp_helper.c
===================================================================
--- GNUnet/src/transports/tcp_helper.c  2007-07-01 11:33:58 UTC (rev 5202)
+++ GNUnet/src/transports/tcp_helper.c  2007-07-01 12:26:27 UTC (rev 5203)
@@ -122,6 +122,8 @@
   TCPSession * pos;
   TCPSession * prev;
   
+  printf("FTCP: %p\n",
+        tcpsession->lock);
   MUTEX_DESTROY(tcpsession->lock);
   FREENONNULL(tcpsession->accept_addr);
   pos = sessions;
@@ -162,14 +164,9 @@
 #endif
   select_disconnect(selector,
                    tcpsession->sock);
-  if (tcpsession->in_select == NO) {
-    MUTEX_UNLOCK(tcpsession->lock);
-    freeTCPSession(tcpsession);
-    MUTEX_UNLOCK(tcplock);
-  } else {
-    MUTEX_UNLOCK(tcpsession->lock);
-    MUTEX_UNLOCK(tcplock);
-  }
+  MUTEX_UNLOCK(tcpsession->lock);
+  freeTCPSession(tcpsession);
+  MUTEX_UNLOCK(tcplock);
   return OK;
 }
 
@@ -216,6 +213,7 @@
                                  const MESSAGE_HEADER * msg) {
   TSession * tsession = sock_ctx;
   TCPSession * tcpSession;
+  TCPSession * pos;
   unsigned int len;
   P2P_PACKET * mp;
   const TCPWelcome * welcome;
@@ -246,6 +244,55 @@
       setIPaddressFromPID(&welcome->clientIdentity,
                          tcpSession->accept_addr,
                          tcpSession->addr_len);
+    /* check that we do not already have
+       a connection from this peer; if so,
+       close the old one! */
+    MUTEX_LOCK(tcplock);
+    pos = sessions;
+    while (pos != NULL) {
+      if (pos == tcpSession) {
+       pos = pos->next;
+       continue;
+      }
+      if (0 == memcmp(&pos->sender,
+                     &tcpSession->sender,
+                     sizeof(PeerIdentity))) {
+       /* replace existing socket in pos with
+          the new socket in tcpSession; then
+          delete the new tcpSession -- we have
+          the old one! */
+       MUTEX_LOCK(pos->lock);
+       if (SYSERR == tcpAssociate(pos->tsession)) {
+         GE_BREAK(ectx, 0);
+         MUTEX_UNLOCK(pos->lock);
+         MUTEX_UNLOCK(tcplock);
+         return SYSERR;
+       }       
+       if (pos->in_select) 
+         select_disconnect(sh,
+                           pos->sock);
+       pos->in_select = YES;
+       pos->sock = tcpSession->sock;
+       select_update_closure(sh,
+                             pos->sock,
+                             tsession,
+                             pos->tsession);
+       FREENONNULL(pos->accept_addr);
+       pos->accept_addr = tcpSession->accept_addr;
+       pos->addr_len = tcpSession->addr_len;
+       tcpSession->accept_addr = NULL;
+       tcpSession->addr_len = 0;
+       tcpDisconnect(tsession);
+       tcpSession->in_select = NO; 
+       freeTCPSession(tcpSession);
+       tcpSession = pos;
+       tsession = pos->tsession;
+       MUTEX_UNLOCK(pos->lock);
+      }    
+      pos = pos->next;
+    }  
+    MUTEX_UNLOCK(tcplock);
+
   } else {
     /* send msg to core! */
     if (len <= sizeof(MESSAGE_HEADER)) {

Modified: GNUnet/src/util/network/select.c
===================================================================
--- GNUnet/src/util/network/select.c    2007-07-01 11:33:58 UTC (rev 5202)
+++ GNUnet/src/util/network/select.c    2007-07-01 12:26:27 UTC (rev 5203)
@@ -1073,7 +1073,35 @@
   return YES;
 }
 
+
 /**
+ */
+int select_update_closure(struct SelectHandle * sh,
+                         struct SocketHandle * sock,
+                         void * old_sock_ctx,
+                         void * new_sock_ctx) {
+  Session * session;   
+  int i;
+
+  session = NULL;
+  MUTEX_LOCK(sh->lock);
+  for (i=0;i<sh->sessionCount;i++)
+    if (sh->sessions[i]->sock == sock) {
+      session = sh->sessions[i];
+      break;
+    }
+  if (session == NULL) {
+    MUTEX_UNLOCK(sh->lock);
+    return SYSERR;
+  }
+  GE_ASSERT(NULL,
+           session->sock_ctx == old_sock_ctx);
+  session->sock_ctx = new_sock_ctx;
+  MUTEX_UNLOCK(sh->lock);  
+  return OK;
+}
+
+/**
  * Add another (already connected) socket to the set of
  * sockets managed by the select.
  */

Modified: GNUnet/src/util/threads/mutex.c
===================================================================
--- GNUnet/src/util/threads/mutex.c     2007-07-01 11:33:58 UTC (rev 5202)
+++ GNUnet/src/util/threads/mutex.c     2007-07-01 12:26:27 UTC (rev 5203)
@@ -119,10 +119,11 @@
 }
 
 void MUTEX_DESTROY(Mutex * mutex) {
+  int ret;
   GE_ASSERT(NULL, mutex != NULL);
   errno = 0;
-  GE_ASSERT(NULL,
-           0 == pthread_mutex_destroy(&mutex->pt));
+  ret = pthread_mutex_destroy(&mutex->pt);
+  GE_ASSERT(NULL, 0 == ret);
   FREE(mutex);
 }
 





reply via email to

[Prev in Thread] Current Thread [Next in Thread]