Some quick updated to make thes plugin work with the new interface and the new output...
[olsrd.git] / lib / powerinfo / src / olsrd_plugin.c
1
2 /*
3  * Copyright (c) 2004, Andreas T√łnnesen(andreto-at-olsr.org)
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without 
7  * modification, are permitted provided that the following conditions 
8  * are met:
9  *
10  * * Redistributions of source code must retain the above copyright notice, 
11  *   this list of conditions and the following disclaimer.
12  * * Redistributions in binary form must reproduce the above copyright notice, 
13  *   this list of conditions and the following disclaimer in the documentation 
14  *   and/or other materials provided with the distribution.
15  * * Neither the name of the UniK olsr daemon nor the names of its contributors 
16  *   may be used to endorse or promote products derived from this software 
17  *   without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
21  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
22  * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
23  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
24  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
26  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 
27  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
28  * OF THE POSSIBILITY OF SUCH DAMAGE.
29  *
30  */
31
32 /* $Id: olsrd_plugin.c,v 1.2 2004/11/07 10:54:19 kattemat Exp $ */
33
34
35 /*
36  * Dynamic linked library example for UniK OLSRd
37  */
38
39
40 #include "olsrd_plugin.h"
41 #include <stdio.h>
42
43
44 /* Data to sent to the plugin with the register_olsr_function call 
45  * THIS STRUCT MUST MATCH ITS SIBLING IN plugin_loader.h IN OLSRD
46  */
47 struct olsr_plugin_data
48 {
49   int ipversion;
50   union olsr_ip_addr *main_addr;
51   int (*olsr_plugin_io)(int, void *, size_t);
52 };
53
54
55 /**
56  * "Private" declarations
57  */
58
59 void __attribute__ ((constructor)) 
60 my_init(void);
61
62 void __attribute__ ((destructor)) 
63 my_fini(void);
64
65 int
66 register_olsr_data(struct olsr_plugin_data *);
67
68 int
69 fetch_olsrd_data();
70
71 /*
72  * Returns the version of the plugin interface that is used
73  * THIS IS NOT THE VERSION OF YOUR PLUGIN!
74  */
75 int 
76 get_plugin_interface_version()
77 {
78   return PLUGIN_INTERFACE_VERSION;
79 }
80
81 /**
82  *Constructor
83  */
84 void
85 my_init()
86 {
87   /* Print plugin info to stdout */
88   printf("%s\n", MOD_DESC);
89
90   ifs = NULL;
91
92   return;
93 }
94
95 /**
96  *Destructor
97  */
98 void
99 my_fini()
100 {
101
102   /* Calls the destruction function
103    * olsr_plugin_exit()
104    * This function should be present in your
105    * sourcefile and all data destruction
106    * should happen there - NOT HERE!
107    */
108   olsr_plugin_exit();
109
110   return;
111 }
112
113
114 /**
115  *Register needed functions and pointers
116  *
117  *This function should not be changed!
118  *
119  */
120 int
121 register_olsr_data(struct olsr_plugin_data *data)
122 {
123   /* IPversion */
124   ipversion = data->ipversion;
125   /* Main address */
126   main_addr = data->main_addr;
127
128   /* Multi-purpose function */
129   olsr_plugin_io = data->olsr_plugin_io;
130
131   /* Set size of IP address */
132   if(ipversion == AF_INET)
133     {
134       ipsize = sizeof(olsr_u32_t);
135     }
136   else
137     {
138       ipsize = sizeof(struct in6_addr);
139     }
140
141   if(!fetch_olsrd_data())
142     {
143       fprintf(stderr, "Could not fetch the neccessary functions from olsrd!\n");
144       return 0;
145     }
146
147   /* Calls the initialization function
148    * olsr_plugin_init()
149    * This function should be present in your
150    * sourcefile and all data initialization
151    * should happen there - NOT HERE!
152    */
153   if(!olsr_plugin_init())
154     {
155       fprintf(stderr, "Could not initialize plugin!\n");
156       return 0;
157     }
158
159   if(!plugin_ipc_init())
160     {
161       fprintf(stderr, "Could not initialize plugin IPC!\n");
162       return 0;
163     }
164
165   return 1;
166 }
167
168
169
170 int
171 fetch_olsrd_data()
172 {
173   int retval = 1;
174
175
176   /* Packet buffer */
177   if(!olsr_plugin_io(GETF__NET_OUTBUFFER_PUSH, &net_outbuffer_push, sizeof(net_outbuffer_push)))
178   {
179     net_outbuffer_push = NULL;
180     retval = 0;
181   }
182
183   /* Olsr debug output function */
184   if(!olsr_plugin_io(GETF__OLSR_PRINTF, 
185                      &olsr_printf, 
186                      sizeof(olsr_printf)))
187   {
188     olsr_printf = NULL;
189     retval = 0;
190   }
191
192
193   /* Olsr malloc wrapper */
194   if(!olsr_plugin_io(GETF__OLSR_MALLOC, 
195                      &olsr_malloc, 
196                      sizeof(olsr_malloc)))
197   {
198     olsr_malloc = NULL;
199     retval = 0;
200   }
201
202   /* Parser registration */
203   if(!olsr_plugin_io(GETF__OLSR_PARSER_ADD_FUNCTION, 
204                      &olsr_parser_add_function, 
205                      sizeof(olsr_parser_add_function)))
206   {
207     olsr_parser_add_function = NULL;
208     retval = 0;
209   }
210
211   /* Scheduler timeout registration */
212   if(!olsr_plugin_io(GETF__OLSR_REGISTER_TIMEOUT_FUNCTION, 
213                      &olsr_register_timeout_function, 
214                      sizeof(olsr_register_timeout_function)))
215   {
216     olsr_register_timeout_function = NULL;
217     retval = 0;
218   }
219
220   /* Scheduler event registration */
221   if(!olsr_plugin_io(GETF__OLSR_REGISTER_SCHEDULER_EVENT, 
222                      &olsr_register_scheduler_event, 
223                      sizeof(olsr_register_scheduler_event)))
224   {
225     olsr_register_scheduler_event = NULL;
226     retval = 0;
227   }
228
229   /* Double to mantissa/exponent */
230   if(!olsr_plugin_io(GETF__DOUBLE_TO_ME, 
231                      &double_to_me, 
232                      sizeof(double_to_me)))
233   {
234     double_to_me = NULL;
235     retval = 0;
236   }
237
238
239
240   /* Mantissa/exponent to double conversion */
241   if(!olsr_plugin_io(GETF__ME_TO_DOUBLE, 
242                      &me_to_double, 
243                      sizeof(me_to_double)))
244   {
245     me_to_double = NULL;
246     retval = 0;
247   }
248
249
250   /* Interface list */
251   if(!olsr_plugin_io(GETD__IFNET, &ifs, sizeof(ifs)))
252   {
253     ifs = NULL;
254     retval = 0;
255   }
256
257   /* Messageseqno fetch function */
258   if(!olsr_plugin_io(GETF__GET_MSG_SEQNO, &get_msg_seqno, sizeof(get_msg_seqno)))
259   {
260     get_msg_seqno = NULL;
261     retval = 0;
262   }
263
264   /* Scheduler maintained timestamp */
265   if(!olsr_plugin_io(GETD__NOW, &now, sizeof(now)))
266   {
267     now = NULL;
268     retval = 0;
269   }
270
271   /* Output function */
272   if(!olsr_plugin_io(GETF__NET_OUTPUT, &net_output, sizeof(net_output)))
273   {
274     net_output = NULL;
275     retval = 0;
276   }
277
278   /* Duplicate check (for processing) */
279   if(!olsr_plugin_io(GETF__OLSR_CHECK_DUP_TABLE_PROC, &check_dup_proc, sizeof(check_dup_proc)))
280   {
281     check_dup_proc = NULL;
282     retval = 0;
283   }
284
285   /* Default forward function */
286   if(!olsr_plugin_io(GETF__OLSR_FORWARD_MESSAGE, &default_fwd, sizeof(default_fwd)))
287   {
288     default_fwd = NULL;
289     retval = 0;
290   }
291
292
293   /* Add socket to OLSR select function */
294   if(!olsr_plugin_io(GETF__ADD_OLSR_SOCKET, &add_olsr_socket, sizeof(add_olsr_socket)))
295   {
296     add_olsr_socket = NULL;
297     retval = 0;
298   }
299
300   /* Neighbor link status lookup */
301   if(!olsr_plugin_io(GETF__CHECK_NEIGHBOR_LINK, &check_neighbor_link, sizeof(check_neighbor_link)))
302   {
303     check_neighbor_link = NULL;
304     retval = 0;
305   }
306
307
308   /* Apm info */
309   if(!olsr_plugin_io(GETF__APM_READ, &apm_read, sizeof(apm_read)))
310   {
311     apm_read = NULL;
312     retval = 0;
313   }
314
315   return retval;
316
317 }