GNUnet  0.10.x
Functions
gnunet-peerinfo_plugins.h File Reference

plugin management API More...

#include "gnunet_util_lib.h"
Include dependency graph for gnunet-peerinfo_plugins.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

void GPI_plugins_load (const struct GNUNET_CONFIGURATION_Handle *cfg)
 Load transport plugins. More...
 
void GPI_plugins_unload (void)
 Unload all plugins. More...
 
struct GNUNET_TRANSPORT_PluginFunctionsGPI_plugins_find (const char *name)
 Obtain the plugin API based on a plugin name. More...
 

Detailed Description

plugin management API

Author
Christian Grothoff

Definition in file gnunet-peerinfo_plugins.h.

Function Documentation

◆ GPI_plugins_load()

void GPI_plugins_load ( const struct GNUNET_CONFIGURATION_Handle cfg)

Load transport plugins.

Parameters
cfgconfiguration to use

Load transport plugins.

The respective functions will be invoked by the plugins when the respective events happen. The closure will be set to a 'const char*' containing the name of the plugin that caused the call.

Parameters
cfgconfiguration to use

Definition at line 89 of file gnunet-peerinfo_plugins.c.

References _, TransportPlugin::api, cfg, GNUNET_TRANSPORT_PluginEnvironment::cfg, GNUNET_TRANSPORT_PluginEnvironment::cls, TransportPlugin::env, GNUNET_asprintf(), GNUNET_CONFIGURATION_get_value_string(), GNUNET_CONTAINER_DLL_insert, GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_INFO, GNUNET_free, GNUNET_log, GNUNET_new, GNUNET_OK, GNUNET_PLUGIN_load(), GNUNET_strdup, TransportPlugin::lib_name, TransportPlugin::next, plugins_head, and TransportPlugin::short_name.

Referenced by state_machine().

90 {
91  struct TransportPlugin *plug;
92  struct TransportPlugin *next;
93  char *libname;
94  char *plugs;
95  char *pos;
96 
97  if (NULL != plugins_head)
98  return; /* already loaded */
99  if (GNUNET_OK !=
100  GNUNET_CONFIGURATION_get_value_string(cfg, "TRANSPORT", "PLUGINS",
101  &plugs))
102  return;
103  GNUNET_log(GNUNET_ERROR_TYPE_INFO, _("Starting transport plugins `%s'\n"),
104  plugs);
105  for (pos = strtok(plugs, " "); pos != NULL; pos = strtok(NULL, " "))
106  {
107  GNUNET_log(GNUNET_ERROR_TYPE_INFO, _("Loading `%s' transport plugin\n"),
108  pos);
109  GNUNET_asprintf(&libname, "libgnunet_plugin_transport_%s", pos);
110  plug = GNUNET_new(struct TransportPlugin);
111  plug->short_name = GNUNET_strdup(pos);
112  plug->lib_name = libname;
113  plug->env.cfg = cfg;
114  plug->env.cls = plug->short_name;
116  }
117  GNUNET_free(plugs);
118  next = plugins_head;
119  while (next != NULL)
120  {
121  plug = next;
122  next = plug->next;
123  plug->api = GNUNET_PLUGIN_load(plug->lib_name, &plug->env);
124  if (plug->api == NULL)
125  {
127  _("Failed to load transport plugin for `%s'\n"),
128  plug->lib_name);
130  GNUNET_free(plug->short_name);
131  GNUNET_free(plug->lib_name);
132  GNUNET_free(plug);
133  }
134  }
135 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
char * short_name
Short name for the plugin (i.e.
#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.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
static struct TransportPlugin * plugins_tail
Head of DLL of all loaded plugins.
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.
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
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's initialization function.
static struct TransportPlugin * plugins_head
Head of DLL of all loaded plugins.
#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:206
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GPI_plugins_unload()

void GPI_plugins_unload ( void  )

Unload all plugins.

Definition at line 142 of file gnunet-peerinfo_plugins.c.

References TransportPlugin::api, GNUNET_break, GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_PLUGIN_unload(), TransportPlugin::lib_name, and TransportPlugin::short_name.

Referenced by shutdown_task().

143 {
144  struct TransportPlugin *plug;
145 
146  while (NULL != (plug = plugins_head))
147  {
148  GNUNET_break(NULL == GNUNET_PLUGIN_unload(plug->lib_name, plug->api));
149  GNUNET_free(plug->lib_name);
150  GNUNET_free(plug->short_name);
152  GNUNET_free(plug);
153  }
154 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
char * short_name
Short name for the plugin (i.e.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
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:255
char * lib_name
Name of the library (i.e.
Entry in doubly-linked list of all of our plugins.
struct GNUNET_TRANSPORT_PluginFunctions * api
API of the transport as returned by the plugin's initialization function.
static struct TransportPlugin * plugins_head
Head of DLL of all loaded plugins.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GPI_plugins_find()

struct GNUNET_TRANSPORT_PluginFunctions* GPI_plugins_find ( const char *  name)

Obtain the plugin API based on a plugin name.

Parameters
namename of the plugin
Returns
the plugin's API, NULL if the plugin is not loaded

Definition at line 164 of file gnunet-peerinfo_plugins.c.

References TransportPlugin::api, GNUNET_free, GNUNET_strdup, head, TransportPlugin::next, plugins_head, and TransportPlugin::short_name.

Referenced by parse_hello_uri(), and print_my_uri().

165 {
167 
168  char *stripped = GNUNET_strdup(name);
169  char *head_stripped;
170  char *sep = strchr(stripped, '_');
171 
172  if (NULL != sep)
173  sep[0] = '\0';
174 
175  while (head != NULL)
176  {
177  head_stripped = GNUNET_strdup(head->short_name);
178  char *head_sep = strchr(head_stripped, '_');
179  if (NULL != head_sep)
180  head_sep[0] = '\0';
181  if (0 == strcmp(head_stripped, stripped))
182  {
183  GNUNET_free(head_stripped);
184  break;
185  }
186  GNUNET_free(head_stripped);
187  head = head->next;
188  }
189  GNUNET_free(stripped);
190  if (NULL == head)
191  return NULL;
192  return head->api;
193 }
char * short_name
Short name for the plugin (i.e.
struct TransportPlugin * next
This is a doubly-linked list.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
const char * name
Entry in doubly-linked list of all of our plugins.
struct GNUNET_TRANSPORT_PluginFunctions * api
API of the transport as returned by the plugin's initialization function.
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:228
#define GNUNET_free(ptr)
Wrapper around free.
Here is the caller graph for this function: