08905923ab99f8c8fc45da1bc8d59cab3e827ecd
[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 olsr.org.
6  *
7  * UniK olsrd 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  * UniK olsrd 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
23 #include "plugin_loader.h"
24 #include "defs.h"
25 #include "olsr.h"
26 #include "scheduler.h"
27 #include "parser.h"
28 #include "duplicate_set.h"
29 #include "plugin.h"
30 #include "link_set.h"
31
32 /**
33  *Initializes the plugin loader engine
34  *
35  */
36
37 void
38 olsr_init_plugin_loader()
39 {
40   olsr_plugins = NULL;
41   plugins_to_load = NULL;
42 }
43
44
45 /**
46  *Function that loads all registered plugins
47  *
48  *@return the number of plugins loaded
49  */
50 int
51 olsr_load_plugins()
52 {
53   struct plugin_to_load *entry, *old;
54   int loaded;
55
56   entry = plugins_to_load;
57   loaded = 0;
58
59   olsr_printf(1, "Loading plugins...\n\n");
60
61   while(entry)
62     {  
63       if(olsr_load_dl(entry->name) < 0)
64         olsr_printf(1, "-- PLUGIN LOADING FAILED! --\n\n");
65       else
66         loaded ++; /* I'm loaded! */
67
68       old = entry;
69       entry = entry->next;
70       free(old);
71     }
72   return loaded;
73 }
74
75
76 /**
77  *Function to add a plugin to the set of
78  *plugins to be loaded
79  *
80  *@param name filename of the lib. Must include
81  *full path if the file is not located in the standard
82  *lib directories
83  */
84 void
85 olsr_add_plugin(char *name)
86 {
87   struct plugin_to_load *entry;
88
89   olsr_printf(3, "Adding plugin: %s\n", name);
90
91   entry = olsr_malloc(sizeof(struct plugin_to_load), "Add plugin entry");
92
93   strcpy(entry->name, name);
94   entry->next = plugins_to_load;
95   plugins_to_load = entry;
96 }
97
98
99 /**
100  *Try to load a shared library and extract
101  *the required information
102  *
103  *@param libname the name of the library(file)
104  *
105  *@return negative on error
106  */
107 int
108 olsr_load_dl(char *libname)
109 {
110   struct olsr_plugin new_entry, *entry;
111   int *interface_version;
112
113   olsr_printf(1, "---------- Plugin loader ----------\nLibrary: %s\n", libname);
114
115   if((new_entry.dlhandle = dlopen(libname, RTLD_NOW)) == NULL)
116     {
117       olsr_printf(1, "DL loading failed: %s!\n", dlerror());
118       return -1;
119     }
120
121
122   /* Fetch the multipurpose function */
123   olsr_printf(1, "Checking plugin interface version....");
124   /* Register mp function */
125   if((interface_version = dlsym(new_entry.dlhandle, "plugin_interface_version")) == NULL)
126     {
127       olsr_printf(1, "\nPlug-in interface version location failed!\n%s\n", dlerror());
128       dlclose(new_entry.dlhandle);
129       return -1;
130     }
131   else
132     {
133       olsr_printf(1, " %d - ", *interface_version);
134       if(*interface_version != PLUGIN_INTERFACE_VERSION)
135         {
136           olsr_printf(1, "VERSION MISSMATCH!\n");
137           dlclose(new_entry.dlhandle);
138           return -1;
139         }
140       else
141         olsr_printf(1, "OK\n");
142     }
143
144
145   /* Fetch the multipurpose function */
146   olsr_printf(1, "Trying to fetch plugin IO function....");
147   /* Register mp function */
148   if((new_entry.plugin_io = dlsym(new_entry.dlhandle, "plugin_io")) == NULL)
149     {
150       olsr_printf(1, "\nPlug-in IO function location %s failed!\n%s\n", libname, dlerror());
151       dlclose(new_entry.dlhandle);
152       return -1;
153     }
154   olsr_printf(1, "OK\n");
155
156
157   olsr_printf(1, "Trying to fetch register function....");
158
159   if((new_entry.register_olsr_data = dlsym(new_entry.dlhandle, "register_olsr_data")) == NULL)
160     {
161       olsr_printf(1, "\nCould not find function registration function in plugin!\n", dlerror());
162       dlclose(new_entry.dlhandle);
163       return -1;
164     }
165   olsr_printf(1, "OK\n");
166
167   entry = olsr_malloc(sizeof(struct olsr_plugin), "Plugin entry");
168
169   memcpy(entry, &new_entry, sizeof(struct olsr_plugin));
170
171   /* Initialize the plugin */
172   init_olsr_plugin(entry);
173
174   /* queue */
175   entry->next = olsr_plugins;
176   olsr_plugins = entry;
177
178   olsr_printf(1, "---------- LIBRARY LOADED ----------\n\n");
179
180   return 0;
181 }
182
183
184
185 /**
186  *Initialize a loaded plugin
187  *This includes sending information
188  *from olsrd to the plugin and
189  *register the functions from the flugin with olsrd
190  *
191  *@param entry the plugin to initialize
192  *
193  *@return nada
194  */
195 void
196 init_olsr_plugin(struct olsr_plugin *entry)
197 {
198   struct olsr_plugin_data plugin_data;
199
200   olsr_printf(1, "Running registration function...\n");
201   /* Fill struct */
202   plugin_data.ipversion = ipversion;
203   plugin_data.main_addr = &main_addr;
204
205   plugin_data.olsr_plugin_io = &olsr_plugin_io;
206
207   /* Register data with plugin */
208   entry->register_olsr_data(&plugin_data);
209
210 }
211
212
213
214 /**
215  *Close all loaded plugins
216  */
217 void
218 olsr_close_plugins()
219 {
220   struct olsr_plugin *entry;
221   
222   for(entry = olsr_plugins; 
223       entry != NULL ; 
224       entry = entry->next)
225     {
226       dlclose(entry->dlhandle);
227     }
228
229 }