aboutsummaryrefslogtreecommitdiff
path: root/src/transport/gnunet-service-transport_plugins.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/transport/gnunet-service-transport_plugins.c')
-rw-r--r--src/transport/gnunet-service-transport_plugins.c111
1 files changed, 48 insertions, 63 deletions
diff --git a/src/transport/gnunet-service-transport_plugins.c b/src/transport/gnunet-service-transport_plugins.c
index 7fcc6f80d..87901d2cc 100644
--- a/src/transport/gnunet-service-transport_plugins.c
+++ b/src/transport/gnunet-service-transport_plugins.c
@@ -90,10 +90,10 @@ static struct TransportPlugin *plugins_tail;
90 * @param traffic_cb function to call for flow control 90 * @param traffic_cb function to call for flow control
91 * @param session_end_cb function to call when a session was terminated 91 * @param session_end_cb function to call when a session was terminated
92 */ 92 */
93void 93void
94GST_plugins_load (GNUNET_TRANSPORT_PluginReceiveCallback recv_cb, 94GST_plugins_load (GNUNET_TRANSPORT_PluginReceiveCallback recv_cb,
95 GNUNET_TRANSPORT_AddressNotification address_cb, 95 GNUNET_TRANSPORT_AddressNotification address_cb,
96 GNUNET_TRANSPORT_SessionEnd session_end_cb) 96 GNUNET_TRANSPORT_SessionEnd session_end_cb)
97{ 97{
98 struct TransportPlugin *plug; 98 struct TransportPlugin *plug;
99 unsigned long long tneigh; 99 unsigned long long tneigh;
@@ -103,57 +103,48 @@ GST_plugins_load (GNUNET_TRANSPORT_PluginReceiveCallback recv_cb,
103 103
104 if (GNUNET_OK != 104 if (GNUNET_OK !=
105 GNUNET_CONFIGURATION_get_value_number (GST_cfg, 105 GNUNET_CONFIGURATION_get_value_number (GST_cfg,
106 "TRANSPORT", 106 "TRANSPORT",
107 "NEIGHBOUR_LIMIT", 107 "NEIGHBOUR_LIMIT", &tneigh))
108 &tneigh)) 108 {
109 { 109 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
110 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 110 _("Transport service is lacking NEIGHBOUR_LIMIT option.\n"));
111 _("Transport service is lacking NEIGHBOUR_LIMIT option.\n")); 111 return;
112 return; 112 }
113 }
114 if (GNUNET_OK != 113 if (GNUNET_OK !=
115 GNUNET_CONFIGURATION_get_value_string (GST_cfg, 114 GNUNET_CONFIGURATION_get_value_string (GST_cfg,
116 "TRANSPORT", "PLUGINS", &plugs)) 115 "TRANSPORT", "PLUGINS", &plugs))
117 return; 116 return;
118 GNUNET_log (GNUNET_ERROR_TYPE_INFO, 117 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
119 _("Starting transport plugins `%s'\n"), 118 _("Starting transport plugins `%s'\n"), plugs);
120 plugs);
121 for (pos = strtok (plugs, " "); pos != NULL; pos = strtok (NULL, " ")) 119 for (pos = strtok (plugs, " "); pos != NULL; pos = strtok (NULL, " "))
122 { 120 {
123 GNUNET_log (GNUNET_ERROR_TYPE_INFO, 121 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
124 _("Loading `%s' transport plugin\n"), pos); 122 _("Loading `%s' transport plugin\n"), pos);
125 GNUNET_asprintf (&libname, 123 GNUNET_asprintf (&libname, "libgnunet_plugin_transport_%s", pos);
126 "libgnunet_plugin_transport_%s", 124 plug = GNUNET_malloc (sizeof (struct TransportPlugin));
127 pos); 125 plug->short_name = GNUNET_strdup (pos);
128 plug = GNUNET_malloc (sizeof (struct TransportPlugin)); 126 plug->lib_name = libname;
129 plug->short_name = GNUNET_strdup (pos); 127 plug->env.cfg = GST_cfg;
130 plug->lib_name = libname; 128 plug->env.my_identity = &GST_my_identity;
131 plug->env.cfg = GST_cfg; 129 plug->env.get_our_hello = &GST_hello_get;
132 plug->env.my_identity = &GST_my_identity; 130 plug->env.cls = plug->short_name;
133 plug->env.get_our_hello = &GST_hello_get; 131 plug->env.receive = recv_cb;
134 plug->env.cls = plug->short_name; 132 plug->env.notify_address = address_cb;
135 plug->env.receive = recv_cb; 133 plug->env.session_end = session_end_cb;
136 plug->env.notify_address = address_cb; 134 plug->env.max_connections = tneigh;
137 plug->env.session_end = session_end_cb; 135 plug->env.stats = GST_stats;
138 plug->env.max_connections = tneigh; 136 GNUNET_CONTAINER_DLL_insert (plugins_head, plugins_tail, plug);
139 plug->env.stats = GST_stats; 137 plug->api = GNUNET_PLUGIN_load (libname, &plug->env);
140 GNUNET_CONTAINER_DLL_insert (plugins_head, 138 if (plug->api == NULL)
141 plugins_tail, 139 {
142 plug); 140 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
143 plug->api = GNUNET_PLUGIN_load (libname, &plug->env); 141 _("Failed to load transport plugin for `%s'\n"), pos);
144 if (plug->api == NULL) 142 GNUNET_CONTAINER_DLL_remove (plugins_head, plugins_tail, plug);
145 { 143 GNUNET_free (plug->short_name);
146 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 144 GNUNET_free (plug->lib_name);
147 _("Failed to load transport plugin for `%s'\n"), 145 GNUNET_free (plug);
148 pos);
149 GNUNET_CONTAINER_DLL_remove (plugins_head,
150 plugins_tail,
151 plug);
152 GNUNET_free (plug->short_name);
153 GNUNET_free (plug->lib_name);
154 GNUNET_free (plug);
155 }
156 } 146 }
147 }
157 GNUNET_free (plugs); 148 GNUNET_free (plugs);
158} 149}
159 150
@@ -167,15 +158,13 @@ GST_plugins_unload ()
167 struct TransportPlugin *plug; 158 struct TransportPlugin *plug;
168 159
169 while (NULL != (plug = plugins_head)) 160 while (NULL != (plug = plugins_head))
170 { 161 {
171 GNUNET_break (NULL == GNUNET_PLUGIN_unload (plug->lib_name, plug->api)); 162 GNUNET_break (NULL == GNUNET_PLUGIN_unload (plug->lib_name, plug->api));
172 GNUNET_free (plug->lib_name); 163 GNUNET_free (plug->lib_name);
173 GNUNET_free (plug->short_name); 164 GNUNET_free (plug->short_name);
174 GNUNET_CONTAINER_DLL_remove (plugins_head, 165 GNUNET_CONTAINER_DLL_remove (plugins_head, plugins_tail, plug);
175 plugins_tail, 166 GNUNET_free (plug);
176 plug); 167 }
177 GNUNET_free (plug);
178 }
179} 168}
180 169
181 170
@@ -208,20 +197,16 @@ GST_plugins_find (const char *name)
208 * @return statically allocated (!) human-readable address 197 * @return statically allocated (!) human-readable address
209 */ 198 */
210const char * 199const char *
211GST_plugins_a2s (const char *name, 200GST_plugins_a2s (const char *name, const void *addr, size_t addrlen)
212 const void *addr,
213 size_t addrlen)
214{ 201{
215 struct GNUNET_TRANSPORT_PluginFunctions *api; 202 struct GNUNET_TRANSPORT_PluginFunctions *api;
216 203
217 if (name == NULL) 204 if (name == NULL)
218 return NULL; 205 return NULL;
219 api = GST_plugins_find (name); 206 api = GST_plugins_find (name);
220 if ( (api == NULL) || (addrlen == 0) || (addr == NULL) ) 207 if ((api == NULL) || (addrlen == 0) || (addr == NULL))
221 return NULL; 208 return NULL;
222 return api->address_to_string (NULL, 209 return api->address_to_string (NULL, addr, addrlen);
223 addr,
224 addrlen);
225} 210}
226 211
227 212