Changed the way the plugin interface version is fetched by the plugin loader. This...
[olsrd.git] / src / plugin_loader.c
1 /*
2  * OLSR ad-hoc routing table management protocol
3  * Copyright (C) 2004 Andreas T√łnnesen (andreto@ifi.uio.no)
4  *
5  * This file is part of the olsr.org OLSR daemon.
6  *
7  * olsr.org is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * olsr.org is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with olsr.org; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  * 
21  * 
22  * $Id: plugin_loader.c,v 1.11 2004/11/06 12:18:51 kattemat Exp $
23  *
24  */
25
26 #include "plugin_loader.h"
27 #include "defs.h"
28 #include "plugin.h"
29
30 /* Local functions */
31
32 static void
33 init_olsr_plugin(struct olsr_plugin *);
34
35 static int
36 olsr_load_dl(char *, struct plugin_param *);
37
38
39
40
41 /**
42  *Function that loads all registered plugins
43  *
44  *@return the number of plugins loaded
45  */
46 int
47 olsr_load_plugins()
48 {
49   struct plugin_entry *entry;
50   int loaded;
51
52   entry = olsr_cnf->plugins;
53   loaded = 0;
54
55   olsr_printf(1, "Loading plugins...\n\n");
56
57   while(entry)
58     {  
59       if(olsr_load_dl(entry->name, entry->params) < 0)
60         olsr_printf(1, "-- PLUGIN LOADING FAILED! --\n\n");
61       else
62         loaded ++;
63
64       entry = entry->next;
65     }
66   return loaded;
67 }
68
69
70 /**
71  *Try to load a shared library and extract
72  *the required information
73  *
74  *@param libname the name of the library(file)
75  *
76  *@return negative on error
77  */
78 int
79 olsr_load_dl(char *libname, struct plugin_param *params)
80 {
81   struct olsr_plugin new_entry, *entry;
82   int (*interface_version)(void);
83
84
85   olsr_printf(1, "---------- Plugin loader ----------\nLibrary: %s\n", libname);
86
87   if((new_entry.dlhandle = dlopen(libname, RTLD_NOW)) == NULL)
88     {
89       olsr_printf(1, "DL loading failed: \"%s\"!\n", dlerror());
90       return -1;
91     }
92
93   /* Fetch the interface version function */
94   olsr_printf(1, "Checking plugin interface version....");
95   if((interface_version = dlsym(new_entry.dlhandle, "plugin_interface_version")) == NULL)
96     {
97       olsr_printf(1, "FAILED: \"%s\"\n", dlerror());
98       dlclose(new_entry.dlhandle);
99       return -1;
100     }
101   else
102     {
103       olsr_printf(1, " %d - ", interface_version());
104       if(interface_version() != PLUGIN_INTERFACE_VERSION)
105         olsr_printf(1, "WARNING: VERSION MISSMATCH!\n");
106       else
107         olsr_printf(1, "OK\n");
108     }
109
110   olsr_printf(1, "Trying to fetch register function....");
111   
112   if((new_entry.register_olsr_data = dlsym(new_entry.dlhandle, "register_olsr_data")) == NULL)
113     {
114       /* This function must be present */
115       olsr_printf(1, "\nCould not find function registration function in plugin!\n%s\nCRITICAL ERROR - aborting!\n", dlerror());
116       dlclose(new_entry.dlhandle);
117       return -1;
118     }
119   olsr_printf(1, "OK\n");
120
121
122   /* Fetch the multipurpose function */
123   olsr_printf(1, "Trying to fetch plugin IO function....");
124   if((new_entry.plugin_io = dlsym(new_entry.dlhandle, "plugin_io")) == NULL)
125     olsr_printf(1, "FAILED: \"%s\"\n", dlerror());
126   else
127     olsr_printf(1, "OK\n");
128
129   /* Fetch the parameter function */
130   olsr_printf(1, "Trying to fetch param function....");
131   if((new_entry.register_param = dlsym(new_entry.dlhandle, "register_olsr_param")) == NULL)
132     olsr_printf(1, "FAILED: \"%s\"\n", dlerror());
133   else
134     olsr_printf(1, "OK\n");
135
136
137   entry = olsr_malloc(sizeof(struct olsr_plugin), "Plugin entry");
138
139   memcpy(entry, &new_entry, sizeof(struct olsr_plugin));
140
141   entry->params = params;
142
143   /* Initialize the plugin */
144   init_olsr_plugin(entry);
145
146   /* queue */
147   entry->next = olsr_plugins;
148   olsr_plugins = entry;
149
150   olsr_printf(1, "---------- LIBRARY LOADED ----------\n\n");
151
152   return 0;
153 }
154
155
156
157 /**
158  *Initialize a loaded plugin
159  *This includes sending information
160  *from olsrd to the plugin and
161  *register the functions from the flugin with olsrd
162  *
163  *@param entry the plugin to initialize
164  *
165  *@return nada
166  */
167 void
168 init_olsr_plugin(struct olsr_plugin *entry)
169 {
170   struct olsr_plugin_data plugin_data;
171   struct plugin_param *params = entry->params;
172   int retval;
173
174   if(entry->register_param)
175     {
176       olsr_printf(1, "Sending parameters...\n");
177       while(params)
178         {
179           olsr_printf(1, "\"%s\"/\"%s\".... ", params->key, params->value);
180           if((retval = entry->register_param(params->key, params->value)) < 0)
181             {
182               fprintf(stderr, "\nFatal error in plugin parameter \"%s\"/\"%s\"\n", params->key, params->value);
183               exit(EXIT_FAILURE);
184             }
185           retval == 0 ? olsr_printf(1, "FAILED\n") : olsr_printf(1, "OK\n");
186
187           params = params->next;
188         }
189     }
190
191   olsr_printf(1, "Running registration function...\n");
192   /* Fill struct */
193   plugin_data.ipversion = olsr_cnf->ip_version;
194   plugin_data.main_addr = &main_addr;
195
196   plugin_data.olsr_plugin_io = &olsr_plugin_io;
197
198   /* Register data with plugin */
199   entry->register_olsr_data(&plugin_data);
200
201 }
202
203
204
205 /**
206  *Close all loaded plugins
207  */
208 void
209 olsr_close_plugins()
210 {
211   struct olsr_plugin *entry;
212
213   olsr_printf(1, "Closing plugins...\n");
214   for(entry = olsr_plugins; 
215       entry != NULL ; 
216       entry = entry->next)
217     {
218       dlclose(&entry->dlhandle);
219     }
220
221 }