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