Makefile patches by Bruno added
[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.5 2004/11/30 09:45:16 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 /*
64  * Defines the version of the plugin interface that is used
65  * THIS IS NOT THE VERSION OF YOUR PLUGIN!
66  * Do not alter unless you know what you are doing!
67  */
68 int 
69 get_plugin_interface_version()
70 {
71   return PLUGIN_INTERFACE_VERSION;
72 }
73
74
75
76 /**
77  *Constructor
78  */
79 void
80 my_init()
81 {
82   /* Print plugin info to stdout */
83   printf("%s\n", MOD_DESC);
84
85   /* defaults for parameters */
86   ipc_port = 2004;
87   ipc_accept_ip.s_addr = htonl(INADDR_LOOPBACK);
88   
89   return;
90 }
91
92 /**
93  *Destructor
94  */
95 void
96 my_fini()
97 {
98
99   /* Calls the destruction function
100    * olsr_plugin_exit()
101    * This function should be present in your
102    * sourcefile and all data destruction
103    * should happen there - NOT HERE!
104    */
105   olsr_plugin_exit();
106
107   return;
108 }
109
110 int
111 register_olsr_param(char *key, char *value)
112 {
113   if(!strcmp(key, "port"))
114     {
115      ipc_port = atoi(value);
116      printf("(DOT DRAW) listening on port: %d\n", ipc_port);
117     }
118
119   if(!strcmp(key, "accept"))
120     {
121         inet_aton(value, &ipc_accept_ip);
122         printf("(DOT DRAW) accept only: %s\n", inet_ntoa(ipc_accept_ip));
123     }
124   return 1;
125 }
126
127 /**
128  *Register needed functions and pointers
129  *
130  *This function should not be changed!
131  *
132  */
133 int
134 register_olsr_data(struct olsr_plugin_data *data)
135 {
136   /* IPversion */
137   ipversion = data->ipversion;
138   /* Main address */
139   main_addr = data->main_addr;
140
141   /* Multi-purpose function */
142   olsr_plugin_io = data->olsr_plugin_io;
143
144   /* Set size of IP address */
145   if(ipversion == AF_INET)
146     {
147       ipsize = sizeof(olsr_u32_t);
148     }
149   else
150     {
151       ipsize = sizeof(struct in6_addr);
152     }
153
154   if(!fetch_olsrd_data())
155     {
156       fprintf(stderr, "Could not fetch the neccessary functions from olsrd!\n");
157       return 0;
158     }
159
160   /* Calls the initialization function
161    * olsr_plugin_init()
162    * This function should be present in your
163    * sourcefile and all data initialization
164    * should happen there - NOT HERE!
165    */
166   if(!olsr_plugin_init())
167     {
168       fprintf(stderr, "Could not initialize plugin!\n");
169       return 0;
170     }
171
172   if(!plugin_ipc_init())
173     {
174       fprintf(stderr, "Could not initialize plugin IPC!\n");
175       return 0;
176     }
177
178   return 1;
179
180 }
181
182
183
184 int
185 fetch_olsrd_data()
186 {
187   int retval = 1;
188
189   
190   /* Neighbor table */
191   if(!olsr_plugin_io(GETD__NEIGHBORTABLE, 
192                      &neighbortable, 
193                      sizeof(neighbortable)))
194   {
195     neighbortable = NULL;
196     retval = 0;
197   }
198   
199   /* Two hop neighbor table */
200   if(!olsr_plugin_io(GETD__TWO_HOP_NEIGHBORTABLE, 
201                      &two_hop_neighbortable, 
202                      sizeof(two_hop_neighbortable)))
203   {
204     two_hop_neighbortable = NULL;
205     retval = 0;
206   }
207
208   /* Topoloy table */
209   if(!olsr_plugin_io(GETD__TC_TABLE, 
210                      &tc_table, 
211                      sizeof(tc_table)))
212   {
213     tc_table = NULL;
214     retval = 0;
215   }
216
217   /* HNA table */
218   if(!olsr_plugin_io(GETD__HNA_SET, 
219                      &hna_set, 
220                      sizeof(hna_set)))
221   {
222     hna_set = NULL;
223     retval = 0;
224   }
225
226   /* Olsr debug output function */
227   if(!olsr_plugin_io(GETF__OLSR_PRINTF, 
228                      &olsr_printf, 
229                      sizeof(olsr_printf)))
230   {
231     olsr_printf = NULL;
232     retval = 0;
233   }
234
235   /* Olsr malloc wrapper */
236   if(!olsr_plugin_io(GETF__OLSR_MALLOC, 
237                      &olsr_malloc, 
238                      sizeof(olsr_malloc)))
239   {
240     olsr_malloc = NULL;
241     retval = 0;
242   }
243
244   /* "ProcessChanges" event registration */
245   if(!olsr_plugin_io(GETF__REGISTER_PCF, 
246                      &register_pcf, 
247                      sizeof(register_pcf)))
248   {
249     register_pcf = NULL;
250     retval = 0;
251   }
252
253
254
255   /* Add socket to OLSR select function */
256   if(!olsr_plugin_io(GETF__ADD_OLSR_SOCKET, &add_olsr_socket, sizeof(add_olsr_socket)))
257   {
258     add_olsr_socket = NULL;
259     retval = 0;
260   }
261
262   /* Remove socket from OLSR select function */
263   if(!olsr_plugin_io(GETF__REMOVE_OLSR_SOCKET, &remove_olsr_socket, sizeof(remove_olsr_socket)))
264   {
265     remove_olsr_socket = NULL;
266     retval = 0;
267   }
268
269   return retval;
270
271 }