/*
 * The olsr.org Optimized Link-State Routing daemon(olsrd)
 * Copyright (c) 2004, Andreas Tønnesen(andreto@olsr.org)
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions 
 * are met:
 *
 * * Redistributions of source code must retain the above copyright 
 *   notice, this list of conditions and the following disclaimer.
 * * Redistributions in binary form must reproduce the above copyright 
 *   notice, this list of conditions and the following disclaimer in 
 *   the documentation and/or other materials provided with the 
 *   distribution.
 * * Neither the name of olsr.org, olsrd nor the names of its 
 *   contributors may be used to endorse or promote products derived 
 *   from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * Visit http://www.olsr.org for more information.
 *
 * If you find this software useful feel free to make a donation
 * to the project. For more information see the website or contact
 * the copyright holders.
 *
 * $Id: olsrd_plugin.c,v 1.20 2007/09/17 21:57:05 bernd67 Exp $
 */

/*
 * Dynamic linked library for the olsr.org olsr daemon
 */

#include "olsr.h"
#include "olsrd_plugin.h"
#include "olsr_cfg.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <netinet/in.h>
#ifndef WIN32
#include <arpa/nameser.h>
#endif

#include "olsrd_httpinfo.h"


int http_port = 0;
int resolve_ip_addresses = 0;
struct allowed_net *allowed_nets = NULL;

static void my_init(void) __attribute__ ((constructor));
static void my_fini(void) __attribute__ ((destructor));

static int add_plugin_ipnet(const char *value, void *data, set_plugin_parameter_addon);
static int add_plugin_ipaddr(const char *value, void *data, set_plugin_parameter_addon);

static int insert_plugin_ipnet(const char *sz_net, const char *sz_mask, struct allowed_net **allowed_nets);

/*
 * Defines the version of the plugin interface that is used
 * THIS IS NOT THE VERSION OF YOUR PLUGIN!
 * Do not alter unless you know what you are doing!
 */
int olsrd_plugin_interface_version(void)
{
    return PLUGIN_INTERFACE_VERSION;
}

/**
 *Constructor
 */
static void my_init(void)
{
    /* Print plugin info to stdout */
    printf("%s\n", MOD_DESC);
}

/**
 *Destructor
 */
static void my_fini(void)
{
    /* Calls the destruction function
     * olsr_plugin_exit()
     * This function should be present in your
     * sourcefile and all data destruction
     * should happen there - NOT HERE!
     */
    olsr_plugin_exit();
}

static const struct olsrd_plugin_parameters plugin_parameters[] = {
    { .name = "port",   .set_plugin_parameter = &set_plugin_port,      .data = &http_port },
    { .name = "host",   .set_plugin_parameter = &add_plugin_ipaddr,    .data = &allowed_nets },
    { .name = "net",    .set_plugin_parameter = &add_plugin_ipnet,     .data = &allowed_nets },
    { .name = "resolve",.set_plugin_parameter = &set_plugin_boolean,          .data = &resolve_ip_addresses },
};

void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size)
{
    *params = plugin_parameters;
    *size = sizeof(plugin_parameters)/sizeof(*plugin_parameters);
}

static int insert_plugin_ipnet(const char *sz_net, const char *sz_mask, struct allowed_net **allowed_nets)
{
    struct in_addr net, mask;
    struct allowed_net *an;

    if(inet_aton(sz_net, &net) == 0) {
	return 1;
    }
    if(inet_aton(sz_mask, &mask) == 0) {
	return 1;
    }

    an = olsr_malloc(sizeof(*an), __func__);
    if (an == NULL) {
        fprintf(stderr, "(HTTPINFO) register param net out of memory!\n");
        exit(0);
    }

    an->net.v4  = net.s_addr;
    an->mask.v4 = mask.s_addr;
    an->next = *allowed_nets;
    *allowed_nets = an;
    return 0;
}

static int add_plugin_ipnet(const char *value, void *data, set_plugin_parameter_addon addon __attribute__((unused)))
{
    char sz_net[100], sz_mask[100]; /* IPv6 in the future */

    if(sscanf(value, "%99s %99s", sz_net, sz_mask) != 2) {
        olsr_printf(1, "(HTTPINFO) Error parsing net param \"%s\"!\n", value);
        return 0;
    }
    return insert_plugin_ipnet(sz_net, sz_mask, data);
}

static int add_plugin_ipaddr(const char *value, void *data, set_plugin_parameter_addon addon __attribute__((unused)))
{
    return insert_plugin_ipnet(value, "255.255.255.255", data);
}

/*
 * Local Variables:
 * mode: c
 * style: linux
 * c-basic-offset: 4
 * indent-tabs-mode: nil
 * End:
 */


syntax highlighted by Code2HTML, v. 0.9.1