diff options
author | Bart Polot <bart@net.in.tum.de> | 2013-07-22 16:14:51 +0000 |
---|---|---|
committer | Bart Polot <bart@net.in.tum.de> | 2013-07-22 16:14:51 +0000 |
commit | 9b7b014287514bb123c399a4a106d608b78d6c04 (patch) | |
tree | a4630c143c5696e0688931a6e0ea2e90a98a4049 /src/mesh | |
parent | 82c9fdd6e78219478d4198c18427ef43bb5cc59a (diff) | |
download | gnunet-9b7b014287514bb123c399a4a106d608b78d6c04.tar.gz gnunet-9b7b014287514bb123c399a4a106d608b78d6c04.zip |
- unregister ports on client disconnect
Diffstat (limited to 'src/mesh')
-rw-r--r-- | src/mesh/gnunet-service-mesh.c | 34 |
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 | */ | ||
3296 | static int | ||
3297 | client_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); |