aboutsummaryrefslogtreecommitdiff
path: root/src/mesh
diff options
context:
space:
mode:
authorBart Polot <bart@net.in.tum.de>2013-07-22 16:14:51 +0000
committerBart Polot <bart@net.in.tum.de>2013-07-22 16:14:51 +0000
commit9b7b014287514bb123c399a4a106d608b78d6c04 (patch)
treea4630c143c5696e0688931a6e0ea2e90a98a4049 /src/mesh
parent82c9fdd6e78219478d4198c18427ef43bb5cc59a (diff)
downloadgnunet-9b7b014287514bb123c399a4a106d608b78d6c04.tar.gz
gnunet-9b7b014287514bb123c399a4a106d608b78d6c04.zip
- unregister ports on client disconnect
Diffstat (limited to 'src/mesh')
-rw-r--r--src/mesh/gnunet-service-mesh.c34
1 files changed, 33 insertions, 1 deletions
diff --git a/src/mesh/gnunet-service-mesh.c b/src/mesh/gnunet-service-mesh.c
index 4881515c9..c2f9e0060 100644
--- a/src/mesh/gnunet-service-mesh.c
+++ b/src/mesh/gnunet-service-mesh.c
@@ -3283,6 +3283,34 @@ tunnel_destroy_iterator (void *cls,
3283 return GNUNET_OK; 3283 return GNUNET_OK;
3284} 3284}
3285 3285
3286
3287/**
3288 * remove client's ports from the global hashmap on diconnect.
3289 *
3290 * @param cls Closure (unused).
3291 * @param key Port.
3292 * @param value ThClient structure.
3293 *
3294 * @return GNUNET_OK, keep iterating.
3295 */
3296static int
3297client_release_ports (void *cls,
3298 uint32_t key,
3299 void *value)
3300{
3301 int res;
3302
3303 res = GNUNET_CONTAINER_multihashmap32_remove (ports, key, value);
3304 if (GNUNET_YES != res)
3305 {
3306 GNUNET_break (0);
3307 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
3308 "Port %u by client %p was not registered.\n",
3309 key, value);
3310 }
3311 return GNUNET_OK;
3312}
3313
3286/** 3314/**
3287 * Timeout function due to lack of keepalive/traffic from the owner. 3315 * Timeout function due to lack of keepalive/traffic from the owner.
3288 * Destroys tunnel if called. 3316 * Destroys tunnel if called.
@@ -4826,12 +4854,16 @@ handle_local_client_disconnect (void *cls, struct GNUNET_SERVER_Client *client)
4826 if (NULL != c->incoming_tunnels) 4854 if (NULL != c->incoming_tunnels)
4827 { 4855 {
4828 GNUNET_CONTAINER_multihashmap32_iterate (c->incoming_tunnels, 4856 GNUNET_CONTAINER_multihashmap32_iterate (c->incoming_tunnels,
4829 &tunnel_destroy_iterator, c); 4857 &tunnel_destroy_iterator, c);
4830 GNUNET_CONTAINER_multihashmap32_destroy (c->incoming_tunnels); 4858 GNUNET_CONTAINER_multihashmap32_destroy (c->incoming_tunnels);
4831 } 4859 }
4832 4860
4833 if (NULL != c->ports) 4861 if (NULL != c->ports)
4862 {
4863 GNUNET_CONTAINER_multihashmap32_iterate (c->ports,
4864 &client_release_ports, c);
4834 GNUNET_CONTAINER_multihashmap32_destroy (c->ports); 4865 GNUNET_CONTAINER_multihashmap32_destroy (c->ports);
4866 }
4835 next = c->next; 4867 next = c->next;
4836 GNUNET_CONTAINER_DLL_remove (clients_head, clients_tail, c); 4868 GNUNET_CONTAINER_DLL_remove (clients_head, clients_tail, c);
4837 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, " CLIENT FREE at %p\n", c); 4869 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, " CLIENT FREE at %p\n", c);