Fixed plugin loading for new config
[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.7 2004/10/20 18:21:00 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 /**
37  *Function that loads all registered plugins
38  *
39  *@return the number of plugins loaded
40  */
41 int
42 olsr_load_plugins()
43 {
44   struct plugin_entry *entry;
45   int loaded;
46
47   entry = olsr_cnf->plugins;
48   loaded = 0;
49
50   olsr_printf(1, "Loading plugins...\n\n");
51
52   while(entry)
53     {  
54       if(olsr_load_dl(entry->name) < 0)
55         olsr_printf(1, "-- PLUGIN LOADING FAILED! --\n\n");
56       else
57         loaded ++; /* I'm loaded! */
58
59       entry = entry->next;
60     }
61   return loaded;
62 }
63
64
65 /**
66  *Try to load a shared library and extract
67  *the required information
68  *
69  *@param libname the name of the library(file)
70  *
71  *@return negative on error
72  */
73 int
74 olsr_load_dl(char *libname)
75 {
76   struct olsr_plugin new_entry, *entry;
77   int *interface_version;
78
79   olsr_printf(1, "---------- Plugin loader ----------\nLibrary: %s\n", libname);
80
81   if((new_entry.dlhandle = dlopen(libname, RTLD_NOW)) == NULL)
82     {
83       olsr_printf(1, "DL loading failed: %s!\n", dlerror());
84       return -1;
85     }
86
87
88   /* Fetch the multipurpose function */
89   olsr_printf(1, "Checking plugin interface version....");
90   /* Register mp function */
91   if((interface_version = dlsym(new_entry.dlhandle, "plugin_interface_version")) == NULL)
92     {
93       olsr_printf(1, "\nPlug-in interface version location failed!\n%s\n", dlerror());
94       dlclose(new_entry.dlhandle);
95       return -1;
96     }
97   else
98     {
99       olsr_printf(1, " %d - ", *interface_version);
100       if(*interface_version != PLUGIN_INTERFACE_VERSION)
101         {
102           olsr_printf(1, "VERSION MISSMATCH!\n");
103           dlclose(new_entry.dlhandle);
104           return -1;
105         }
106       else
107         olsr_printf(1, "OK\n");
108     }
109
110
111   /* Fetch the multipurpose function */
112   olsr_printf(1, "Trying to fetch plugin IO function....");
113   /* Register mp function */
114   if((new_entry.plugin_io = dlsym(new_entry.dlhandle, "plugin_io")) == NULL)
115     {
116       olsr_printf(1, "\nPlug-in IO function location %s failed!\n%s\n", libname, dlerror());
117       dlclose(new_entry.dlhandle);
118       return -1;
119     }
120   olsr_printf(1, "OK\n");
121
122
123   olsr_printf(1, "Trying to fetch register function....");
124
125   if((new_entry.register_olsr_data = dlsym(new_entry.dlhandle, "register_olsr_data")) == NULL)
126     {
127       olsr_printf(1, "\nCould not find function registration function in plugin!\n", dlerror());
128       dlclose(new_entry.dlhandle);
129       return -1;
130     }
131   olsr_printf(1, "OK\n");
132
133   entry = olsr_malloc(sizeof(struct olsr_plugin), "Plugin entry");
134
135   memcpy(entry, &new_entry, sizeof(struct olsr_plugin));
136
137   /* Initialize the plugin */
138   init_olsr_plugin(entry);
139
140   /* queue */
141   entry->next = olsr_plugins;
142   olsr_plugins = entry;
143
144   olsr_printf(1, "---------- LIBRARY LOADED ----------\n\n");
145
146   return 0;
147 }
148
149
150
151 /**
152  *Initialize a loaded plugin
153  *This includes sending information
154  *from olsrd to the plugin and
155  *register the functions from the flugin with olsrd
156  *
157  *@param entry the plugin to initialize
158  *
159  *@return nada
160  */
161 void
162 init_olsr_plugin(struct olsr_plugin *entry)
163 {
164   struct olsr_plugin_data plugin_data;
165
166   olsr_printf(1, "Running registration function...\n");
167   /* Fill struct */
168   plugin_data.ipversion = olsr_cnf->ip_version;
169   plugin_data.main_addr = &main_addr;
170
171   plugin_data.olsr_plugin_io = &olsr_plugin_io;
172
173   /* Register data with plugin */
174   entry->register_olsr_data(&plugin_data);
175
176 }
177
178
179
180 /**
181  *Close all loaded plugins
182  */
183 void
184 olsr_close_plugins()
185 {
186   struct olsr_plugin *entry;
187   
188   for(entry = olsr_plugins; 
189       entry != NULL ; 
190       entry = entry->next)
191     {
192       dlclose(entry->dlhandle);
193     }
194
195 }