7ea08b478e1aa12eec1b14138a438adab44649ac
[olsrd.git] / lib / dot_draw / src / olsrd_plugin.c
1 /*
2  * OLSR plugin
3  * Copyright (C) 2004 Andreas T√łnnesen (andreto@olsr.org)
4  *
5  * This file is part of the olsrd dynamic gateway detection.
6  *
7  * This 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  * This plugin 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 olsrd-unik; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  *
21  */
22
23 /*
24  * Dynamic linked library example for UniK OLSRd
25  */
26
27
28 #include "olsrd_plugin.h"
29 #include <stdio.h>
30
31
32 /* Data to sent to the plugin with the register_olsr_function call 
33  * THIS STRUCT MUST MATCH ITS SIBLING IN plugin_loader.h IN OLSRD
34  */
35 struct olsr_plugin_data
36 {
37   int ipversion;
38   union olsr_ip_addr *main_addr;
39   int (*olsr_plugin_io)(int, void *, size_t);
40 };
41
42
43 /**
44  * "Private" declarations
45  */
46
47 void __attribute__ ((constructor)) 
48 my_init(void);
49
50 void __attribute__ ((destructor)) 
51 my_fini(void);
52
53 int
54 register_olsr_data(struct olsr_plugin_data *);
55
56 int
57 fetch_olsrd_data();
58
59 /*
60  * Defines the version of the plugin interface that is used
61  * THIS IS NOT THE VERSION OF YOUR PLUGIN!
62  * Do not alter unless you know what you are doing!
63  */
64 int plugin_interface_version;
65
66 /**
67  *Constructor
68  */
69 void
70 my_init()
71 {
72   /* Print plugin info to stdout */
73   printf("%s\n", MOD_DESC);
74   /* Set interface version */
75   plugin_interface_version = PLUGIN_INTERFACE_VERSION;
76
77   return;
78 }
79
80 /**
81  *Destructor
82  */
83 void
84 my_fini()
85 {
86
87   /* Calls the destruction function
88    * olsr_plugin_exit()
89    * This function should be present in your
90    * sourcefile and all data destruction
91    * should happen there - NOT HERE!
92    */
93   olsr_plugin_exit();
94
95   return;
96 }
97
98
99 /**
100  *Register needed functions and pointers
101  *
102  *This function should not be changed!
103  *
104  */
105 int
106 register_olsr_data(struct olsr_plugin_data *data)
107 {
108   /* IPversion */
109   ipversion = data->ipversion;
110   /* Main address */
111   main_addr = data->main_addr;
112
113   /* Multi-purpose function */
114   olsr_plugin_io = data->olsr_plugin_io;
115
116   /* Set size of IP address */
117   if(ipversion == AF_INET)
118     {
119       ipsize = sizeof(olsr_u32_t);
120     }
121   else
122     {
123       ipsize = sizeof(struct in6_addr);
124     }
125
126   if(!fetch_olsrd_data())
127     {
128       fprintf(stderr, "Could not fetch the neccessary functions from olsrd!\n");
129       return 0;
130     }
131
132   /* Calls the initialization function
133    * olsr_plugin_init()
134    * This function should be present in your
135    * sourcefile and all data initialization
136    * should happen there - NOT HERE!
137    */
138   if(!olsr_plugin_init())
139     {
140       fprintf(stderr, "Could not initialize plugin!\n");
141       return 0;
142     }
143
144   if(!plugin_ipc_init())
145     {
146       fprintf(stderr, "Could not initialize plugin IPC!\n");
147       return 0;
148     }
149
150   return 1;
151
152 }
153
154
155
156 int
157 fetch_olsrd_data()
158 {
159   int retval = 1;
160
161   
162   /* Neighbor table */
163   if(!olsr_plugin_io(GETD__NEIGHBORTABLE, 
164                      &neighbortable, 
165                      sizeof(neighbortable)))
166   {
167     neighbortable = NULL;
168     retval = 0;
169   }
170   
171   /* Two hop neighbor table */
172   if(!olsr_plugin_io(GETD__TWO_HOP_NEIGHBORTABLE, 
173                      &two_hop_neighbortable, 
174                      sizeof(two_hop_neighbortable)))
175   {
176     two_hop_neighbortable = NULL;
177     retval = 0;
178   }
179
180   /* Topoloy table */
181   if(!olsr_plugin_io(GETD__TC_TABLE, 
182                      &tc_table, 
183                      sizeof(tc_table)))
184   {
185     tc_table = NULL;
186     retval = 0;
187   }
188
189   /* HNA table */
190   if(!olsr_plugin_io(GETD__HNA_SET, 
191                      &hna_set, 
192                      sizeof(hna_set)))
193   {
194     hna_set = NULL;
195     retval = 0;
196   }
197
198   /* Olsr debug output function */
199   if(!olsr_plugin_io(GETF__OLSR_PRINTF, 
200                      &olsr_printf, 
201                      sizeof(olsr_printf)))
202   {
203     olsr_printf = NULL;
204     retval = 0;
205   }
206
207   /* Olsr malloc wrapper */
208   if(!olsr_plugin_io(GETF__OLSR_MALLOC, 
209                      &olsr_malloc, 
210                      sizeof(olsr_malloc)))
211   {
212     olsr_malloc = NULL;
213     retval = 0;
214   }
215
216   /* "ProcessChanges" event registration */
217   if(!olsr_plugin_io(GETF__REGISTER_PCF, 
218                      &register_pcf, 
219                      sizeof(register_pcf)))
220   {
221     register_pcf = NULL;
222     retval = 0;
223   }
224
225
226
227   /* Add socket to OLSR select function */
228   if(!olsr_plugin_io(GETF__ADD_OLSR_SOCKET, &add_olsr_socket, sizeof(add_olsr_socket)))
229   {
230     add_olsr_socket = NULL;
231     retval = 0;
232   }
233
234   /* Remove socket from OLSR select function */
235   if(!olsr_plugin_io(GETF__REMOVE_OLSR_SOCKET, &remove_olsr_socket, sizeof(remove_olsr_socket)))
236   {
237     remove_olsr_socket = NULL;
238     retval = 0;
239   }
240
241   return retval;
242
243 }