[Top][All Lists]
[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);
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r5203 - in GNUnet/src: include transports util/network util/threads,
gnunet <=