diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/transport/gnunet-service-transport_clients.c | 39 |
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 | |||
177 | transmit_to_client_callback (void *cls, size_t size, void *buf) | 181 | transmit_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 | ||