aboutsummaryrefslogtreecommitdiff
path: root/src/transport
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2011-09-30 09:02:12 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2011-09-30 09:02:12 +0000
commitb3aea6e39f918228baed3a1ee9ba4aa6d6a222b7 (patch)
tree283134354af54efab64c52a336b59bb2146ea1a1 /src/transport
parentaf14ddd18a8e745cb99ce00f9d2ccef46e81c113 (diff)
downloadgnunet-b3aea6e39f918228baed3a1ee9ba4aa6d6a222b7.tar.gz
gnunet-b3aea6e39f918228baed3a1ee9ba4aa6d6a222b7.zip
check if transport client is still connected before sending SEND_OK
Diffstat (limited to 'src/transport')
-rw-r--r--src/transport/gnunet-service-transport_clients.c39
1 files changed, 36 insertions, 3 deletions
diff --git a/src/transport/gnunet-service-transport_clients.c b/src/transport/gnunet-service-transport_clients.c
index 650efc8dd..6e62ae5f4 100644
--- a/src/transport/gnunet-service-transport_clients.c
+++ b/src/transport/gnunet-service-transport_clients.c
@@ -157,8 +157,12 @@ setup_client (struct GNUNET_SERVER_Client *client)
157 GNUNET_assert (lookup_client (client) == NULL); 157 GNUNET_assert (lookup_client (client) == NULL);
158 tc = GNUNET_malloc (sizeof (struct TransportClient)); 158 tc = GNUNET_malloc (sizeof (struct TransportClient));
159 tc->client = client; 159 tc->client = client;
160
161 GNUNET_CONTAINER_DLL_insert (clients_head, clients_tail, tc); 160 GNUNET_CONTAINER_DLL_insert (clients_head, clients_tail, tc);
161
162#if DEBUG_TRANSPORT
163 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
164 "Client %X connected\n", tc);
165#endif
162 return tc; 166 return tc;
163} 167}
164 168
@@ -177,12 +181,30 @@ static size_t
177transmit_to_client_callback (void *cls, size_t size, void *buf) 181transmit_to_client_callback (void *cls, size_t size, void *buf)
178{ 182{
179 struct TransportClient *tc = cls; 183 struct TransportClient *tc = cls;
184 struct TransportClient *tmp;
180 struct ClientMessageQueueEntry *q; 185 struct ClientMessageQueueEntry *q;
181 const struct GNUNET_MessageHeader *msg; 186 const struct GNUNET_MessageHeader *msg;
182 char *cbuf; 187 char *cbuf;
183 uint16_t msize; 188 uint16_t msize;
184 size_t tsize; 189 size_t tsize;
185 190
191 tmp = clients_head;
192 while (tmp != NULL)
193 {
194 if (tc == tmp)
195 break;
196 tmp = tmp->next;
197 }
198
199 if (tc == NULL)
200 {
201#if DEBUG_TRANSPORT
202 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
203 "Transmission to client failed, client already disconnected.\n");
204#endif
205 return 0;
206 }
207
186 tc->th = NULL; 208 tc->th = NULL;
187 if (buf == NULL) 209 if (buf == NULL)
188 { 210 {
@@ -455,6 +477,7 @@ handle_send_transmit_continuation (void *cls, int success)
455{ 477{
456 struct SendTransmitContinuationContext *stcc = cls; 478 struct SendTransmitContinuationContext *stcc = cls;
457 struct SendOkMessage send_ok_msg; 479 struct SendOkMessage send_ok_msg;
480 struct TransportClient *tc;
458 481
459 send_ok_msg.header.size = htons (sizeof (send_ok_msg)); 482 send_ok_msg.header.size = htons (sizeof (send_ok_msg));
460 send_ok_msg.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_OK); 483 send_ok_msg.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_OK);
@@ -462,8 +485,18 @@ handle_send_transmit_continuation (void *cls, int success)
462 send_ok_msg.latency = 485 send_ok_msg.latency =
463 GNUNET_TIME_relative_hton (GNUNET_TIME_UNIT_FOREVER_REL); 486 GNUNET_TIME_relative_hton (GNUNET_TIME_UNIT_FOREVER_REL);
464 send_ok_msg.peer = stcc->target; 487 send_ok_msg.peer = stcc->target;
465 GST_clients_unicast (stcc->client, &send_ok_msg.header, GNUNET_NO); 488 tc = lookup_client(stcc->client);
466 GNUNET_SERVER_client_drop (stcc->client); 489 if (tc != NULL)
490 {
491#if DEBUG_TRANSPORT
492 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG | GNUNET_ERROR_TYPE_BULK,
493 "Sending `%s' to client %X\n",
494 "GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_OK",
495 tc);
496#endif
497 GST_clients_unicast (stcc->client, &send_ok_msg.header, GNUNET_NO);
498 GNUNET_SERVER_client_drop (stcc->client);
499 }
467 GNUNET_free (stcc); 500 GNUNET_free (stcc);
468} 501}
469 502