GNUnet  0.10.x
Data Structures | Functions | Variables
gnunet-peerinfo_plugins.c File Reference

plugin management More...

#include "platform.h"
#include "gnunet-peerinfo_plugins.h"
#include "gnunet_transport_plugin.h"
#include "gnunet_hello_lib.h"
Include dependency graph for gnunet-peerinfo_plugins.c:

Go to the source code of this file.

Data Structures

struct  TransportPlugin
 Entry in doubly-linked list of all of our plugins. More...
 

Functions

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

Variables

static struct TransportPluginplugins_head
 Head of DLL of all loaded plugins. More...
 
static struct TransportPluginplugins_tail
 Head of DLL of all loaded plugins. More...
 

Detailed Description

plugin management

Author
Christian Grothoff

Definition in file gnunet-peerinfo_plugins.c.

Function Documentation

◆ GPI_plugins_load()

void GPI_plugins_load ( const struct GNUNET_CONFIGURATION_Handle cfg)

Load and initialize all plugins.

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:

Variable Documentation

◆ plugins_head

struct TransportPlugin* plugins_head
static

Head of DLL of all loaded plugins.

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

Referenced by GPI_plugins_find(), and GPI_plugins_load().

◆ plugins_tail

struct TransportPlugin* plugins_tail
static

Head of DLL of all loaded plugins.

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