* use the ARRAYSIZE macro everywhere
[olsrd.git] / lib / httpinfo / src / olsrd_plugin.c
1 /*
2  * The olsr.org Optimized Link-State Routing daemon(olsrd)
3  * Copyright (c) 2004, Andreas Tonnesen(andreto@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 
11  *   notice, this list of conditions and the following disclaimer.
12  * * Redistributions in binary form must reproduce the above copyright 
13  *   notice, this list of conditions and the following disclaimer in 
14  *   the documentation and/or other materials provided with the 
15  *   distribution.
16  * * Neither the name of olsr.org, olsrd nor the names of its 
17  *   contributors may be used to endorse or promote products derived 
18  *   from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
23  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
24  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
26  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
28  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
30  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
31  * POSSIBILITY OF SUCH DAMAGE.
32  *
33  * Visit http://www.olsr.org for more information.
34  *
35  * If you find this software useful feel free to make a donation
36  * to the project. For more information see the website or contact
37  * the copyright holders.
38  *
39  */
40
41 /*
42  * Dynamic linked library for the olsr.org olsr daemon
43  */
44
45 #include "olsr.h"
46 #include "olsrd_plugin.h"
47 #include "olsr_cfg.h"
48 #include <stdio.h>
49 #include <string.h>
50 #include <stdlib.h>
51 #include <netinet/in.h>
52 #ifndef WIN32
53 #include <arpa/nameser.h>
54 #else
55 /* The -mno-cygwin prevent these defs. Otherwise we pull in cygwin1.dll */
56 typedef uint32_t in_addr_t;
57 typedef uint16_t sa_family_t;
58 #endif
59
60 #include "olsrd_httpinfo.h"
61
62
63 int http_port = 0;
64 int resolve_ip_addresses = 0;
65 struct ip_prefix_list *allowed_nets = NULL;
66
67 static void my_init(void) __attribute__ ((constructor));
68 static void my_fini(void) __attribute__ ((destructor));
69
70 static int add_plugin_ipnet4(const char *value, void *data, set_plugin_parameter_addon);
71 static int add_plugin_ipnet6(const char *value, void *data, set_plugin_parameter_addon);
72 static int add_plugin_ipaddr4(const char *value, void *data, set_plugin_parameter_addon);
73 static int add_plugin_ipaddr6(const char *value, void *data, set_plugin_parameter_addon);
74
75 static int insert_plugin_ipnet(sa_family_t ip_version, const char *sz_net, const char *sz_mask, struct ip_prefix_list **all_nets);
76 static int add_plugin_ipnet(sa_family_t ip_version, const char *value, struct ip_prefix_list **all_nets);
77
78 /*
79  * Defines the version of the plugin interface that is used
80  * THIS IS NOT THE VERSION OF YOUR PLUGIN!
81  * Do not alter unless you know what you are doing!
82  */
83 int olsrd_plugin_interface_version(void)
84 {
85     return PLUGIN_INTERFACE_VERSION;
86 }
87
88 /**
89  *Constructor
90  */
91 static void my_init(void)
92 {
93     /* Print plugin info to stdout */
94     printf("%s\n", MOD_DESC);
95 }
96
97 /**
98  *Destructor
99  */
100 static void my_fini(void)
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
111 static const struct olsrd_plugin_parameters plugin_parameters[] = {
112     { .name = "port",    .set_plugin_parameter = &set_plugin_port,     .data = &http_port },
113     { .name = "host4",   .set_plugin_parameter = &add_plugin_ipaddr4,  .data = &allowed_nets },
114     { .name = "net4",    .set_plugin_parameter = &add_plugin_ipnet4,   .data = &allowed_nets },
115     { .name = "host",    .set_plugin_parameter = &add_plugin_ipaddr4,  .data = &allowed_nets },
116     { .name = "net",     .set_plugin_parameter = &add_plugin_ipnet4,   .data = &allowed_nets },
117     { .name = "host6",   .set_plugin_parameter = &add_plugin_ipaddr6,  .data = &allowed_nets },
118     { .name = "net6",    .set_plugin_parameter = &add_plugin_ipnet6,   .data = &allowed_nets },
119     { .name = "resolve", .set_plugin_parameter = &set_plugin_boolean,  .data = &resolve_ip_addresses },
120 };
121
122 void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size)
123 {
124     *params = plugin_parameters;
125     *size = ARRAYSIZE(plugin_parameters);
126 }
127
128 static int insert_plugin_ipnet(sa_family_t ip_version, const char *sz_net, const char *sz_mask, struct ip_prefix_list **all_nets)
129 {
130     union olsr_ip_addr net;
131     int prefix_len;
132     
133     if (inet_pton(ip_version, sz_net, &net) <= 0) {
134         return 1;
135     }
136     if (ip_version == AF_INET) {
137         union olsr_ip_addr netmask;
138         if(inet_pton(AF_INET, sz_mask, &netmask) <= 0) {
139             return 1;
140         }
141         prefix_len = olsr_netmask_to_prefix(&netmask);
142     } else {
143         char *endptr;
144         prefix_len = strtoul(sz_mask, &endptr, 10);
145         if(*endptr != '\0' || prefix_len > 128) {
146             return 1;
147         }
148     }
149
150     if (ip_version != olsr_cnf->ip_version) {
151         if (ip_version == AF_INET) {
152             memmove(&net.v6.s6_addr[12], &net.v4.s_addr, sizeof(in_addr_t));
153             memset(&net.v6.s6_addr[0], 0x00, 10 * sizeof(uint8_t));
154             memset(&net.v6.s6_addr[10], 0xff, 2 * sizeof(uint8_t));
155             prefix_len += 96;
156         }
157         else {
158             return 0;
159         }
160     }
161
162     ip_prefix_list_add(all_nets, &net, prefix_len);
163
164     return 0;
165 }
166
167 static int add_plugin_ipnet(sa_family_t ip_version, const char *value, struct ip_prefix_list **all_nets)
168 {
169     char sz_net[100], sz_mask[100]; /* IPv6 in the future */
170
171     if(sscanf(value, "%99s %99s", sz_net, sz_mask) != 2) {
172         return 1;
173     }
174     return insert_plugin_ipnet(ip_version, sz_net, sz_mask, all_nets);
175 }
176
177 static int add_plugin_ipnet4(const char *value, void *data, set_plugin_parameter_addon addon __attribute__((unused)))
178 {
179     return add_plugin_ipnet(AF_INET, value, data);
180 }
181
182 static int add_plugin_ipnet6(const char *value, void *data, set_plugin_parameter_addon addon __attribute__((unused)))
183 {
184     return add_plugin_ipnet(AF_INET6, value, data);
185 }
186
187 static int add_plugin_ipaddr4(const char *value, void *data, set_plugin_parameter_addon addon __attribute__((unused)))
188 {
189     return insert_plugin_ipnet(AF_INET, value, "255.255.255.255", data);
190 }
191
192 static int add_plugin_ipaddr6(const char *value, void *data, set_plugin_parameter_addon addon __attribute__((unused)))
193 {
194     return insert_plugin_ipnet(AF_INET6, value, "128", data);
195 }
196
197 /*
198  * Local Variables:
199  * mode: c
200  * style: linux
201  * c-basic-offset: 4
202  * indent-tabs-mode: nil
203  * End:
204  */