aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2010-07-14 11:33:58 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2010-07-14 11:33:58 +0000
commit4f75e026024c61c1be8edf32063051b3f9e39cb8 (patch)
tree70f12df30dfce51672003e2e2717012abdf27586
parent5156df7d340440694f003a4710f63457af4c7b7e (diff)
downloadgnunet-4f75e026024c61c1be8edf32063051b3f9e39cb8.tar.gz
gnunet-4f75e026024c61c1be8edf32063051b3f9e39cb8.zip
Fixed "Bad file descriptor" error after plugin is unloaded by canceling
previously scheduled curl tasks
-rw-r--r--src/transport/plugin_transport_http.c64
1 files changed, 33 insertions, 31 deletions
diff --git a/src/transport/plugin_transport_http.c b/src/transport/plugin_transport_http.c
index f63a467e9..924bbae74 100644
--- a/src/transport/plugin_transport_http.c
+++ b/src/transport/plugin_transport_http.c
@@ -40,9 +40,9 @@
40#include <curl/curl.h> 40#include <curl/curl.h>
41 41
42 42
43#define DEBUG_CURL GNUNET_YES 43#define DEBUG_CURL GNUNET_NO
44#define DEBUG_HTTP GNUNET_NO 44#define DEBUG_HTTP GNUNET_NO
45#define DEBUG_CONNECTIONS GNUNET_YES 45#define DEBUG_CONNECTIONS GNUNET_NO
46 46
47#define INBOUND GNUNET_NO 47#define INBOUND GNUNET_NO
48#define OUTBOUND GNUNET_YES 48#define OUTBOUND GNUNET_YES
@@ -406,9 +406,11 @@ static int remove_http_message (struct Session * ps, struct HTTP_Message * msg)
406static int remove_session (struct HTTP_PeerContext * pc, struct Session * ps, int call_msg_cont, int call_msg_cont_result) 406static int remove_session (struct HTTP_PeerContext * pc, struct Session * ps, int call_msg_cont, int call_msg_cont_result)
407{ 407{
408 struct HTTP_Message * msg; 408 struct HTTP_Message * msg;
409 struct Plugin * plugin = ps->peercontext->plugin;
410
409 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"Connection %X: removing %s session %X with id %u\n", ps, (ps->direction == INBOUND) ? "inbound" : "outbound", ps, ps->session_id); 411 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"Connection %X: removing %s session %X with id %u\n", ps, (ps->direction == INBOUND) ? "inbound" : "outbound", ps, ps->session_id);
410 412 plugin->env->session_end(plugin, &pc->identity, ps);
411 413
412 GNUNET_free_non_null (ps->addr); 414 GNUNET_free_non_null (ps->addr);
413 GNUNET_SERVER_mst_destroy (ps->msgtok); 415 GNUNET_SERVER_mst_destroy (ps->msgtok);
414 GNUNET_free(ps->url); 416 GNUNET_free(ps->url);
@@ -924,8 +926,7 @@ static void http_server_daemon_v4_run (void *cls,
924 struct Plugin *plugin = cls; 926 struct Plugin *plugin = cls;
925 927
926 GNUNET_assert(cls !=NULL); 928 GNUNET_assert(cls !=NULL);
927 if (plugin->http_server_task_v4 != GNUNET_SCHEDULER_NO_TASK) 929 plugin->http_server_task_v4 = GNUNET_SCHEDULER_NO_TASK;
928 plugin->http_server_task_v4 = GNUNET_SCHEDULER_NO_TASK;
929 930
930 if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) 931 if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
931 return; 932 return;
@@ -946,8 +947,7 @@ static void http_server_daemon_v6_run (void *cls,
946 struct Plugin *plugin = cls; 947 struct Plugin *plugin = cls;
947 948
948 GNUNET_assert(cls !=NULL); 949 GNUNET_assert(cls !=NULL);
949 if (plugin->http_server_task_v6 != GNUNET_SCHEDULER_NO_TASK) 950 plugin->http_server_task_v6 = GNUNET_SCHEDULER_NO_TASK;
950 plugin->http_server_task_v6 = GNUNET_SCHEDULER_NO_TASK;
951 951
952 if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) 952 if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
953 return; 953 return;
@@ -1474,6 +1474,14 @@ static int curl_schedule(void *cls )
1474 CURLMcode mret; 1474 CURLMcode mret;
1475 1475
1476 GNUNET_assert(cls !=NULL); 1476 GNUNET_assert(cls !=NULL);
1477
1478 /* Cancel previous scheduled task */
1479 if (plugin->http_curl_task != GNUNET_SCHEDULER_NO_TASK)
1480 {
1481 GNUNET_SCHEDULER_cancel(plugin->env->sched, plugin->http_curl_task);
1482 plugin->http_curl_task = GNUNET_SCHEDULER_NO_TASK;
1483 }
1484
1477 max = -1; 1485 max = -1;
1478 FD_ZERO (&rs); 1486 FD_ZERO (&rs);
1479 FD_ZERO (&ws); 1487 FD_ZERO (&ws);
@@ -1770,10 +1778,6 @@ http_plugin_disconnect (void *cls,
1770 ps->send_active = GNUNET_NO; 1778 ps->send_active = GNUNET_NO;
1771 ps=ps->next; 1779 ps=ps->next;
1772 } 1780 }
1773 //if (plugin->http_curl_task!= GNUNET_SCHEDULER_NO_TASK)
1774// GNUNET_SCHEDULER_cancel(plugin->env->sched, plugin->http_curl_task);
1775 //curl_schedule(plugin);
1776
1777} 1781}
1778 1782
1779 1783
@@ -2009,8 +2013,7 @@ process_interfaces (void *cls,
2009 t6->u6_port = htons (plugin->port_inbound); 2013 t6->u6_port = htons (plugin->port_inbound);
2010 plugin->env->notify_address(plugin->env->cls,"http",t6,sizeof (struct IPv6HttpAddress) , GNUNET_TIME_UNIT_FOREVER_REL); 2014 plugin->env->notify_address(plugin->env->cls,"http",t6,sizeof (struct IPv6HttpAddress) , GNUNET_TIME_UNIT_FOREVER_REL);
2011 } 2015 }
2012 return GNUNET_NO; 2016 return GNUNET_OK;
2013 /* FIXME: return GNUNET_OK; */
2014} 2017}
2015 2018
2016int remove_peer_context_Iterator (void *cls, const GNUNET_HashCode *key, void *value) 2019int remove_peer_context_Iterator (void *cls, const GNUNET_HashCode *key, void *value)
@@ -2068,19 +2071,6 @@ libgnunet_plugin_transport_http_done (void *cls)
2068 CURLMcode mret; 2071 CURLMcode mret;
2069 GNUNET_assert(cls !=NULL); 2072 GNUNET_assert(cls !=NULL);
2070 2073
2071 if ( plugin->http_server_task_v4 != GNUNET_SCHEDULER_NO_TASK)
2072 {
2073 GNUNET_SCHEDULER_cancel(plugin->env->sched, plugin->http_server_task_v4);
2074 plugin->http_server_task_v4 = GNUNET_SCHEDULER_NO_TASK;
2075 }
2076
2077 if ( plugin->http_server_task_v6 != GNUNET_SCHEDULER_NO_TASK)
2078 {
2079 GNUNET_SCHEDULER_cancel(plugin->env->sched, plugin->http_server_task_v6);
2080 plugin->http_server_task_v6 = GNUNET_SCHEDULER_NO_TASK;
2081 }
2082
2083
2084 if (plugin->http_server_daemon_v4 != NULL) 2074 if (plugin->http_server_daemon_v4 != NULL)
2085 { 2075 {
2086 MHD_stop_daemon (plugin->http_server_daemon_v4); 2076 MHD_stop_daemon (plugin->http_server_daemon_v4);
@@ -2092,12 +2082,19 @@ libgnunet_plugin_transport_http_done (void *cls)
2092 plugin->http_server_daemon_v6 = NULL; 2082 plugin->http_server_daemon_v6 = NULL;
2093 } 2083 }
2094 2084
2095 if ( plugin->http_curl_task != GNUNET_SCHEDULER_NO_TASK) 2085 if ( plugin->http_server_task_v4 != GNUNET_SCHEDULER_NO_TASK)
2096 { 2086 {
2097 GNUNET_SCHEDULER_cancel(plugin->env->sched, plugin->http_curl_task); 2087 GNUNET_SCHEDULER_cancel(plugin->env->sched, plugin->http_server_task_v4);
2098 plugin->http_curl_task = GNUNET_SCHEDULER_NO_TASK; 2088 plugin->http_server_task_v4 = GNUNET_SCHEDULER_NO_TASK;
2099 } 2089 }
2100 2090
2091 if ( plugin->http_server_task_v6 != GNUNET_SCHEDULER_NO_TASK)
2092 {
2093 GNUNET_SCHEDULER_cancel(plugin->env->sched, plugin->http_server_task_v6);
2094 plugin->http_server_task_v6 = GNUNET_SCHEDULER_NO_TASK;
2095 }
2096
2097
2101 /* free all peer information */ 2098 /* free all peer information */
2102 if (plugin->peers!=NULL) 2099 if (plugin->peers!=NULL)
2103 { 2100 {
@@ -2115,6 +2112,12 @@ libgnunet_plugin_transport_http_done (void *cls)
2115 } 2112 }
2116 curl_global_cleanup(); 2113 curl_global_cleanup();
2117 2114
2115 if ( plugin->http_curl_task != GNUNET_SCHEDULER_NO_TASK)
2116 {
2117 GNUNET_SCHEDULER_cancel(plugin->env->sched, plugin->http_curl_task);
2118 plugin->http_curl_task = GNUNET_SCHEDULER_NO_TASK;
2119 }
2120
2118 GNUNET_free (plugin); 2121 GNUNET_free (plugin);
2119 GNUNET_free (api); 2122 GNUNET_free (api);
2120 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"Unload http plugin complete...\n"); 2123 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"Unload http plugin complete...\n");
@@ -2223,7 +2226,6 @@ libgnunet_plugin_transport_http_init (void *cls)
2223 /* Initializing cURL */ 2226 /* Initializing cURL */
2224 curl_global_init(CURL_GLOBAL_ALL); 2227 curl_global_init(CURL_GLOBAL_ALL);
2225 plugin->multi_handle = curl_multi_init(); 2228 plugin->multi_handle = curl_multi_init();
2226 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"curl version is: `%s'\n", curl_version());
2227 2229
2228 if ( NULL == plugin->multi_handle ) 2230 if ( NULL == plugin->multi_handle )
2229 { 2231 {