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