GNUnet  0.10.x
gnunet-peerinfo_plugins.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet.
3  Copyright (C) 2010,2011 GNUnet e.V.
4 
5  GNUnet is free software: you can redistribute it and/or modify it
6  under the terms of the GNU Affero General Public License as published
7  by the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  GNUnet is distributed in the hope that it will be useful, but
11  WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  Affero General Public License for more details.
14 
15  You should have received a copy of the GNU Affero General Public License
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
17 
18  SPDX-License-Identifier: AGPL3.0-or-later
19 */
20 
26 #include "platform.h"
29 #include "gnunet_hello_lib.h"
30 
35 {
40 
45 
51 
55  char *short_name;
56 
60  char *lib_name;
61 
67 
68 };
69 
74 
79 
80 
81 
90 void
92 {
93  struct TransportPlugin *plug;
94  struct TransportPlugin *next;
95  char *libname;
96  char *plugs;
97  char *pos;
98 
99  if (NULL != plugins_head)
100  return; /* already loaded */
101  if (GNUNET_OK !=
102  GNUNET_CONFIGURATION_get_value_string (cfg, "TRANSPORT", "PLUGINS",
103  &plugs))
104  return;
105  GNUNET_log (GNUNET_ERROR_TYPE_INFO, _("Starting transport plugins `%s'\n"),
106  plugs);
107  for (pos = strtok (plugs, " "); pos != NULL; pos = strtok (NULL, " "))
108  {
109  GNUNET_log (GNUNET_ERROR_TYPE_INFO, _("Loading `%s' transport plugin\n"),
110  pos);
111  GNUNET_asprintf (&libname, "libgnunet_plugin_transport_%s", pos);
112  plug = GNUNET_new (struct TransportPlugin);
113  plug->short_name = GNUNET_strdup (pos);
114  plug->lib_name = libname;
115  plug->env.cfg = cfg;
116  plug->env.cls = plug->short_name;
117  GNUNET_CONTAINER_DLL_insert (plugins_head, plugins_tail, plug);
118  }
119  GNUNET_free (plugs);
120  next = plugins_head;
121  while (next != NULL)
122  {
123  plug = next;
124  next = plug->next;
125  plug->api = GNUNET_PLUGIN_load (plug->lib_name, &plug->env);
126  if (plug->api == NULL)
127  {
129  _("Failed to load transport plugin for `%s'\n"),
130  plug->lib_name);
131  GNUNET_CONTAINER_DLL_remove (plugins_head, plugins_tail, plug);
132  GNUNET_free (plug->short_name);
133  GNUNET_free (plug->lib_name);
134  GNUNET_free (plug);
135  }
136  }
137 }
138 
139 
143 void
145 {
146  struct TransportPlugin *plug;
147 
148  while (NULL != (plug = plugins_head))
149  {
150  GNUNET_break (NULL == GNUNET_PLUGIN_unload (plug->lib_name, plug->api));
151  GNUNET_free (plug->lib_name);
152  GNUNET_free (plug->short_name);
153  GNUNET_CONTAINER_DLL_remove (plugins_head, plugins_tail, plug);
154  GNUNET_free (plug);
155  }
156 }
157 
158 
166 GPI_plugins_find (const char *name)
167 {
169 
170  char *stripped = GNUNET_strdup (name);
171  char *head_stripped;
172  char *sep = strchr (stripped, '_');
173  if (NULL != sep)
174  sep[0] = '\0';
175 
176  while (head != NULL)
177  {
178  head_stripped = GNUNET_strdup(head->short_name);
179  char *head_sep = strchr (head_stripped, '_');
180  if (NULL != head_sep)
181  head_sep[0] = '\0';
182  if (0 == strcmp (head_stripped, stripped))
183  {
184  GNUNET_free (head_stripped);
185  break;
186  }
187  GNUNET_free (head_stripped);
188  head = head->next;
189  }
190  GNUNET_free (stripped);
191  if (NULL == head)
192  return NULL;
193  return head->api;
194 }
195 
196 
197 /* end of file gnunet-peerinfo_plugins.c */
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
char * short_name
Short name for the plugin (i.e.
struct TransportPlugin * prev
This is a doubly-linked list.
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
struct TransportPlugin * next
This is a doubly-linked list.
Each plugin is required to return a pointer to a struct of this type as the return value from its ent...
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
#define _(String)
GNU gettext support macro.
Definition: platform.h:208
static struct TransportPlugin * plugins_tail
Head of DLL of all loaded plugins.
void * GNUNET_PLUGIN_unload(const char *library_name, void *arg)
Unload plugin (runs the "done" callback and returns whatever "done" returned).
Definition: plugin.c:258
int GNUNET_asprintf(char **buf, const char *format,...)
Like asprintf, just portable.
void * cls
Closure for the various callbacks.
struct GNUNET_TRANSPORT_PluginEnvironment env
Environment this transport service is using for this plugin.
The transport service will pass a pointer to a struct of this type as the first and only argument to ...
plugin management API
void GPI_plugins_unload()
Unload all plugins.
int GNUNET_CONFIGURATION_get_value_string(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be a string.
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition: gnunet-arm.c:104
const char * name
char * lib_name
Name of the library (i.e.
const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration to use.
Entry in doubly-linked list of all of our plugins.
struct GNUNET_TRANSPORT_PluginFunctions * api
API of the transport as returned by the plugin&#39;s initialization function.
configuration data
Definition: configuration.c:85
static struct TransportPlugin * plugins_head
Head of DLL of all loaded plugins.
static struct PendingResolutions * head
Head of list of pending resolution requests.
Definition: gnunet-ats.c:231
void GPI_plugins_load(const struct GNUNET_CONFIGURATION_Handle *cfg)
Load and initialize all plugins.
struct GNUNET_TRANSPORT_PluginFunctions * GPI_plugins_find(const char *name)
Obtain the plugin API based on a plugin name.
#define GNUNET_log(kind,...)
void * GNUNET_PLUGIN_load(const char *library_name, void *arg)
Setup plugin (runs the "init" callback and returns whatever "init" returned).
Definition: plugin.c:210
#define GNUNET_free(ptr)
Wrapper around free.