initial commit of the httplib plugin
authorAndreas Tonnesen <andreto@olsr.org>
Wed, 15 Dec 2004 20:11:50 +0000 (20:11 +0000)
committerAndreas Tonnesen <andreto@olsr.org>
Wed, 15 Dec 2004 20:11:50 +0000 (20:11 +0000)
lib/httpinfo/Makefile [new file with mode: 0644]
lib/httpinfo/README_HTTPINFO [new file with mode: 0644]
lib/httpinfo/src/olsr_plugin_io.h [new file with mode: 0644]
lib/httpinfo/src/olsrd_httpinfo.c [new file with mode: 0644]
lib/httpinfo/src/olsrd_httpinfo.h [new file with mode: 0644]
lib/httpinfo/src/olsrd_plugin.c [new file with mode: 0644]
lib/httpinfo/src/olsrd_plugin.h [new file with mode: 0644]
lib/httpinfo/version-script.txt [new file with mode: 0644]

diff --git a/lib/httpinfo/Makefile b/lib/httpinfo/Makefile
new file mode 100644 (file)
index 0000000..e1c42d5
--- /dev/null
@@ -0,0 +1,49 @@
+#######################################
+# HTTPINFO PLUGIN BY ANDREAS TØNNESEN #
+#######################################
+
+CC ?= gcc
+STRIP ?= strip
+NAME ?= olsrd_httpinfo.so.0.1
+LIBDIR ?= $(INSTALL_PREFIX)/usr/lib
+# -fPIC creates position independent code
+MYFLAGS ?= -Wall -fPIC -g # Uncomment -g for debugging
+LIBS ?= -lc -lm
+CFLAGS ?= -g -O2
+
+#Sourcefiles
+#add yours here
+SRCS=  src/olsrd_plugin.c src/olsrd_httpinfo.c
+
+#Objectfiles
+#add yours here
+OBJS=  src/olsrd_plugin.o src/olsrd_httpinfo.o
+
+#Headerfiles
+#add yours here
+HDRS=  src/olsrd_plugin.h src/olsrd_httpinfo.h src/olsr_plugin_io.h
+
+# -Wl passes options to the linker(-soname,....)
+# Use -lc to link it against C library
+# not 100% sure if this is neccesary
+
+all: plugin
+
+
+plugin: $(OBJS)
+       $(CC) $(LDFLAGS) $(MYFLAGS) -shared -Wl,-soname,$(NAME) \
+       -Wl,--version-script=version-script.txt \
+       -o $(NAME) $(OBJS) $(LIBS)
+
+
+install:
+       $(STRIP) $(NAME)
+       install -D -m 755 $(NAME) $(LIBDIR)/$(NAME)
+       /sbin/ldconfig -n $(LIBDIR)
+
+clean:
+       rm -f $(OBJS) $(NAME)
+
+src/olsrd_plugin.o: $(HDRS)
+
+src/olsrd_httpinfo.o: $(HDRS)
diff --git a/lib/httpinfo/README_HTTPINFO b/lib/httpinfo/README_HTTPINFO
new file mode 100644 (file)
index 0000000..b6c2d7f
--- /dev/null
@@ -0,0 +1,8 @@
+HTTP MINI-SERVER PLUGIN FOR OLSRD
+by Andreas Tønnesen(andreto@olsr.org)
+
+installation:
+make
+make install
+
+- Andreas T
diff --git a/lib/httpinfo/src/olsr_plugin_io.h b/lib/httpinfo/src/olsr_plugin_io.h
new file mode 100644 (file)
index 0000000..49e9dcf
--- /dev/null
@@ -0,0 +1,140 @@
+/*
+ * 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: olsr_plugin_io.h,v 1.1 2004/12/15 20:11:50 kattemat Exp $
+ */
+
+
+/*
+ * REVISIONS(starting from 0.4.6):
+ * 0.4.5 - 0.4.6 : GETD_S removed. The socket entries now reside within the 
+ *                 interface struct.
+ *                 Added GETF__ADD_IFCHGF and GETF__DEL_IFCHGF.
+ *                 - Andreas
+ *         0.4.8 : GETF__APM_READ added
+ *                 GETD__OLSR_CNF added
+ *                 GETD_PACKET removed
+ *                 GETD_MAXMESSAGESIZE removed
+ *                 GETD_OUTPUTSIZE removed
+ *                 GETF__NET_OUTBUFFER_PUSH added
+ *                 GETD__ROUTINGTABLE added
+ *                 GETD__HNA_ROUTES added
+ *                 GETD__MID_SET added
+ *                 GETF__NET_RESERVE_BUFSPACE added 
+ *                 GETF__NET_OUTBUFFER_PUSH_RESERVED added
+ *                 - Andreas
+ */
+
+/*
+ * IO commands
+ *
+ * NAMING CONVENTION:
+ * - DATAPOINTERS
+ *   Commands to get datapointers MUST have the prefix
+ *   GETD__ added to the full name of the variable/pointer
+ *   in all upper cases.
+ *   Example: A command to get a pointer to a variable called
+ *   "myvar" in olsrd must be called GETD__MYVAR
+ *
+ * - FUNCTIONS
+ *   Commands to get pointers to olsrd functions MUST have
+ *   the prefix GETF__ added to the full name of the runction
+ *   in uppercases.
+ *   Example: A command to get a pointer to the function
+ *   "my_function" must be named GETF__MY_FUNCTION
+ *
+ *
+ *   New commands can be added - BUT EXISTING COMMANDS MUST
+ *   _NEVER_ CHANGE VALUE!
+ */
+
+#ifndef _OLSR_PLUGIN_IO
+#define _OLSR_PLUGIN_IO
+
+/* Data fetching - starts at 100 (used to anyway) */
+#define GETD__IFNET                                102
+#define GETD__NOW                                  103
+#define GETD__PARSER_ENTRIES                       104
+#define GETD__OLSR_SOCKET_ENTRIES                  105
+#define GETD__NEIGHBORTABLE                        108
+#define GETD__TWO_HOP_NEIGHBORTABLE                109
+#define GETD__TC_TABLE                             110
+#define GETD__HNA_SET                              111
+#define GETD__OLSR_CNF                             112
+#define GETD__ROUTINGTABLE                         113
+#define GETD__HNA_ROUTES                           114
+#define GETD__MID_SET                              115
+
+/* Function fetching - starts at 500 */
+#define GETF__OLSR_REGISTER_SCHEDULER_EVENT        500
+#define GETF__OLSR_REMOVE_SCHEDULER_EVENT          501
+#define GETF__OLSR_PARSER_ADD_FUNCTION             502
+#define GETF__OLSR_PARSER_REMOVE_FUNCTION          503
+#define GETF__OLSR_REGISTER_TIMEOUT_FUNCTION       504
+#define GETF__OLSR_REMOVE_TIMEOUT_FUNCTION         505
+#define GETF__GET_MSG_SEQNO                        506
+#define GETF__OLSR_CHECK_DUP_TABLE_PROC            507
+#define GETF__NET_OUTPUT                           508
+#define GETF__OLSR_FORWARD_MESSAGE                 509
+#define GETF__ADD_OLSR_SOCKET                      510
+#define GETF__REMOVE_OLSR_SOCKET                   511
+#define GETF__CHECK_NEIGHBOR_LINK                  512
+#define GETF__OLSR_PRINTF                          513
+#define GETF__OLSR_MALLOC                          514
+#define GETF__DOUBLE_TO_ME                         515
+#define GETF__ME_TO_DOUBLE                         516
+#define GETF__ADD_LOCAL_HNA4_ENTRY                 517
+#define GETF__REMOVE_LOCAL_HNA4_ENTRY              518
+#define GETF__ADD_LOCAL_HNA6_ENTRY                 519
+#define GETF__REMOVE_LOCAL_HNA6_ENTRY              520
+#define GETF__OLSR_INPUT                           521
+#define GETF__ADD_PTF                              522
+#define GETF__DEL_PTF                              523
+#define GETF__IF_IFWITHSOCK                        524
+#define GETF__IF_IFWITHADDR                        525
+#define GETF__PARSE_PACKET                         526
+#define GETF__REGISTER_PCF                         527
+#define GETF__OLSR_HASHING                         528
+#define GETF__ADD_IFCHGF                           529
+#define GETF__DEL_IFCHGF                           530
+#define GETF__APM_READ                             531
+#define GETF__NET_OUTBUFFER_PUSH                   532
+#define GETF__NET_RESERVE_BUFSPACE                 533
+#define GETF__NET_OUTBUFFER_PUSH_RESERVED          534
+
+#endif
diff --git a/lib/httpinfo/src/olsrd_httpinfo.c b/lib/httpinfo/src/olsrd_httpinfo.c
new file mode 100644 (file)
index 0000000..4b5e107
--- /dev/null
@@ -0,0 +1,526 @@
+/*
+ * HTTP Info plugin for the olsr.org OLSR daemon
+ * 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_httpinfo.c,v 1.1 2004/12/15 20:11:50 kattemat Exp $
+ */
+
+/*
+ * Dynamic linked library for the olsr.org olsr daemon
+ */
+
+#include "olsrd_httpinfo.h"
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+
+#define MAX_CLIENTS 3
+
+#define MAX_HTTPREQ_SIZE 1024 * 10
+
+#define DEFAULT_TCP_PORT 8080
+
+static int
+get_http_socket(int);
+
+void
+parse_http_request(int);
+
+int
+build_http_header(http_header_type, olsr_u32_t, char *, olsr_u32_t);
+
+int
+build_body(char *, olsr_u32_t);
+
+static int client_sockets[MAX_CLIENTS];
+static int curr_clients;
+static int http_socket;
+
+/**
+ *Do initialization here
+ *
+ *This function is called by the my_init
+ *function in uolsrd_plugin.c
+ */
+int
+olsr_plugin_init()
+{
+
+  curr_clients = 0;
+  /* set up HTTP socket */
+  http_socket = get_http_socket(http_port != 0 ? http_port :  DEFAULT_TCP_PORT);
+
+  if(http_socket < 0)
+    {
+      fprintf(stderr, "(HTTPINFO) could not initialize HTTP socket\n");
+      exit(0);
+    }
+
+  /* Register socket */
+  add_olsr_socket(http_socket, &parse_http_request);
+
+  return 1;
+}
+
+static int
+get_http_socket(int port)
+{
+  struct sockaddr_in sin;
+  olsr_u32_t yes = 1;
+  int s;
+
+  /* Init ipc socket */
+  if ((s = socket(AF_INET, SOCK_STREAM, 0)) == -1) 
+    {
+      olsr_printf(1, "(HTTPINFO)socket %s\n", strerror(errno));
+      return -1;
+    }
+
+  if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(yes)) < 0) 
+    {
+      perror("SO_REUSEADDR failed");
+      close(s);
+      return -1;
+    }
+
+  /* Bind the socket */
+  
+  /* complete the socket structure */
+  memset(&sin, 0, sizeof(sin));
+  sin.sin_family = AF_INET;
+  sin.sin_addr.s_addr = INADDR_ANY;
+  sin.sin_port = htons(port);
+  
+  /* bind the socket to the port number */
+  if (bind(s, (struct sockaddr *) &sin, sizeof(sin)) == -1) 
+    {
+      olsr_printf(1, "(HTTPINFO) bind failed %s\n", strerror(errno));
+      return -1;
+    }
+      
+  /* show that we are willing to listen */
+  if (listen(s, 1) == -1) 
+    {
+      olsr_printf(1, "(HTTPINFO) listen failed %s\n", strerror(errno));
+      return -1;
+    }
+
+  return s;
+}
+
+
+
+void
+parse_http_request(int fd)
+{
+  struct sockaddr_in pin;
+  socklen_t addrlen;
+  char *addr;  
+  char req[MAX_HTTPREQ_SIZE];
+  char body[1024*10];
+  char req_type[11];
+  char filename[251];
+  char http_version[11];
+  int c = 0, r = 1;
+
+  addrlen = sizeof(struct sockaddr_in);
+
+  if(curr_clients >= MAX_CLIENTS)
+    return;
+
+  curr_clients++;
+
+  if ((client_sockets[curr_clients] = accept(fd, (struct sockaddr *)  &pin, &addrlen)) == -1)
+    {
+      olsr_printf(1, "(HTTPINFO) accept: %s\n", strerror(errno));
+      goto close_connection;
+    }
+
+  addr = inet_ntoa(pin.sin_addr);
+
+
+  memset(req, 0, MAX_HTTPREQ_SIZE);
+  memset(body, 0, 1024*10);
+
+  while((r = recv(client_sockets[curr_clients], &req[c], 1, 0)) > 0 && (c < (MAX_HTTPREQ_SIZE-1)))
+    {
+      c++;
+
+      if((c > 3 && !strcmp(&req[c-4], "\r\n\r\n")) ||
+        (c > 1 && !strcmp(&req[c-2], "\n\n")))
+       break;
+    }
+  
+  if(r < 0)
+    {
+      printf("(HTTPINFO) Failed to recieve data from client!\n");
+      goto close_connection;
+    }
+  
+  /* Get the request */
+  if(sscanf(req, "%10s %250s %10s\n", req_type, filename, http_version) != 3)
+    {
+      /* Try without HTTP version */
+      if(sscanf(req, "%10s %250s\n", req_type, filename) != 2)
+       {
+         printf("(HTTPINFO) Error parsing request %s!\n", req);
+         goto close_connection;
+       }
+    }
+  
+  
+  printf("Request: %s\nfile: %s\nVersion: %s\n\n", req_type, filename, http_version);
+
+  if(strcmp(req_type, "GET"))
+    {
+      /* We only support GET */
+      strcpy(body, HTTP_400_MSG);
+      c = build_http_header(HTTP_BAD_REQ, strlen(body), req, MAX_HTTPREQ_SIZE);
+    }
+  else if(strlen(filename) > 1)
+    {
+      /* We only support request for / */
+      strcpy(body, HTTP_404_MSG);
+      c = build_http_header(HTTP_BAD_FILE, strlen(body), req, MAX_HTTPREQ_SIZE);
+    }
+  else
+    {
+      /* All is good */
+      build_body(body, sizeof(body));
+      c = build_http_header(HTTP_OK, strlen(body), req, MAX_HTTPREQ_SIZE);
+    }
+  
+  r = send(client_sockets[curr_clients], req, c, 0);   
+  if(r < 0)
+    {
+      printf("(HTTPINFO) Failed sending data to client!\n");
+      goto close_connection;
+    }
+
+  r = send(client_sockets[curr_clients], body, strlen(body), 0);
+  if(r < 0)
+    {
+      printf("(HTTPINFO) Failed sending data to client!\n");
+      goto close_connection;
+    }
+
+ close_connection:
+  close(client_sockets[curr_clients]);
+  curr_clients--;
+
+}
+
+
+int
+build_http_header(http_header_type type, olsr_u32_t size, char *buf, olsr_u32_t bufsize)
+{
+  time_t currtime;
+  char timestr[45];
+  char modtimestr[50];
+  char tmp[30];
+
+  memset(buf, 0, bufsize);
+
+  switch(type)
+    {
+    case(HTTP_BAD_REQ):
+      memcpy(buf, HTTP_400, strlen(HTTP_400));
+      break;
+    case(HTTP_BAD_FILE):
+      memcpy(buf, HTTP_404, strlen(HTTP_404));
+      break;
+    default:
+      /* Defaults to OK */
+      memcpy(buf, HTTP_200, strlen(HTTP_200));
+      break;
+    }
+
+
+  /* Date */
+  if(time(&currtime))
+    {
+      strftime(timestr, 45, "Date: %a, %d %b %Y %H:%M:%S GMT\r\n", gmtime(&currtime));
+      strcat(buf, timestr);
+    }
+  
+  /* Server version */
+  strcat(buf, "Server: ");
+  strcat(buf, PLUGIN_NAME " ");
+  strcat(buf, PLUGIN_VERSION " ");
+  strcat(buf, HTTP_VERSION);
+  strcat(buf, "\r\n");
+
+  /* connection-type */
+  strcat(buf,"Connection: closed\r\n");
+
+  /* MIME type */
+  strcat(buf, "Content-type: text/html\r\n");
+
+  /* Content length */
+  if(size > 0)
+    {
+      sprintf(tmp, "Content-length: %i\r\n", size);
+      strcat(buf, tmp);
+    }
+
+
+  /* Cache-control 
+   * No caching dynamic pages
+   */
+  strcat(buf, "Cache-Control: no-cache\r\n");
+
+
+  /* End header */
+  strcat(buf, "\r\n");
+  
+  printf("HEADER:\n%s", buf);
+
+  return strlen(buf);
+
+}
+
+/*
+ * destructor - called at unload
+ */
+void
+olsr_plugin_exit()
+{
+  if(http_socket)
+    close(http_socket);
+}
+
+
+/* Mulitpurpose funtion */
+int
+plugin_io(int cmd, void *data, size_t size)
+{
+
+  switch(cmd)
+    {
+    default:
+      return 0;
+    }
+  
+  return 1;
+}
+
+
+
+
+/**
+ *Scheduled event
+ */
+int
+build_body(char *buf, olsr_u32_t bufsize)
+{
+  int size;
+  olsr_u8_t index;
+  struct neighbor_entry *neighbor_table_tmp;
+  struct neighbor_2_list_entry *list_2;
+  struct tc_entry *entry;
+  struct topo_dst *dst_entry;
+  struct hna_entry *tmp_hna;
+  struct hna_net *tmp_net;
+
+  size = 0;
+
+  strcat(buf,"<http>\n<pre>\n");
+
+  strcat(buf, "NEIGHBORS:\n");
+  
+  
+  /* Neighbors */
+  for(index=0;index<HASHSIZE;index++)
+    {
+         
+      for(neighbor_table_tmp = neighbortable[index].next;
+         neighbor_table_tmp != &neighbortable[index];
+         neighbor_table_tmp = neighbor_table_tmp->next)
+       {
+         if(neighbor_table_tmp->is_mpr)
+           {
+             size = strlen(buf);
+             sprintf(&buf[size], "%s -> %s(MPR)\n", olsr_ip_to_string(main_addr), olsr_ip_to_string(&neighbor_table_tmp->neighbor_main_addr));           
+           }
+         else
+           {
+             size = strlen(buf);
+             sprintf(&buf[size], "%s -> %s\n", olsr_ip_to_string(main_addr), olsr_ip_to_string(&neighbor_table_tmp->neighbor_main_addr));                
+           }
+
+         for(list_2 = neighbor_table_tmp->neighbor_2_list.next;
+             list_2 != &neighbor_table_tmp->neighbor_2_list;
+             list_2 = list_2->next)
+           {
+             size = strlen(buf);
+             sprintf(&buf[size], "\t-> %s\n", olsr_ip_to_string(&list_2->neighbor_2->neighbor_2_addr));
+           }
+             
+       }
+    }
+
+  strcat(buf, "TOPOLOGY:\n");
+
+  /* Topology */  
+  for(index=0;index<HASHSIZE;index++)
+    {
+      /* For all TC entries */
+      entry = tc_table[index].next;
+      while(entry != &tc_table[index])
+       {
+         /* For all destination entries of that TC entry */
+         dst_entry = entry->destinations.next;
+         while(dst_entry != &entry->destinations)
+           {
+             size = strlen(buf);
+             sprintf(&buf[size], "%s -> %s\n", olsr_ip_to_string(&entry->T_last_addr), olsr_ip_to_string(&dst_entry->T_dest_addr));
+             dst_entry = dst_entry->next;
+           }
+         entry = entry->next;
+       }
+    }
+
+  strcat(buf, "HNA:\n");
+
+  /* HNA entries */
+  for(index=0;index<HASHSIZE;index++)
+    {
+      tmp_hna = hna_set[index].next;
+      /* Check all entrys */
+      while(tmp_hna != &hna_set[index])
+       {
+         /* Check all networks */
+         tmp_net = tmp_hna->networks.next;
+             
+         while(tmp_net != &tmp_hna->networks)
+           {
+             size = strlen(buf);
+             sprintf(&buf[size], "GW: %s NET: %s\n", olsr_ip_to_string(&tmp_hna->A_gateway_addr), olsr_ip_to_string(&tmp_net->A_network_addr)/*, olsr_ip_to_string(&tmp_net->A_netmask.v4)*/);
+             tmp_net = tmp_net->next;
+           }
+             
+         tmp_hna = tmp_hna->next;
+       }
+    }
+
+
+  strcat(buf, "\n\n");
+
+
+  strcat(buf,"</pre><br><i>" PLUGIN_NAME " version " PLUGIN_VERSION "</i>\n</http>\n");
+  
+  return strlen(buf);
+}
+
+
+
+
+/**
+ *Converts a olsr_ip_addr to a string
+ *Goes for both IPv4 and IPv6
+ *
+ *NON REENTRANT! If you need to use this
+ *function twice in e.g. the same printf
+ *it will not work.
+ *You must use it in different calls e.g.
+ *two different printfs
+ *
+ *@param the IP to convert
+ *@return a pointer to a static string buffer
+ *representing the address in "dots and numbers"
+ *
+ */
+char *
+olsr_ip_to_string(union olsr_ip_addr *addr)
+{
+  static int index = 0;
+  static char buff[4][100];
+  char *ret;
+  struct in_addr in;
+  if(ipversion == AF_INET)
+    {
+      in.s_addr=addr->v4;
+      ret = inet_ntoa(in);
+    }
+  else
+    {
+      /* IPv6 */
+      ret = (char *)inet_ntop(AF_INET6, &addr->v6, ipv6_buf, sizeof(ipv6_buf));
+    }
+
+  strncpy(buff[index], ret, 100);
+
+  ret = buff[index];
+
+  index = (index + 1) & 3;
+
+  return ret;
+}
+
+
+
+
+/**
+ *This function is just as bad as the previous one :-(
+ */
+char *
+olsr_netmask_to_string(union hna_netmask *mask)
+{
+  char *ret;
+  struct in_addr in;
+  
+  if(ipversion == AF_INET)
+    {
+      in.s_addr = mask->v4;
+      ret = inet_ntoa(in);
+      return ret;
+
+    }
+  else
+    {
+      /* IPv6 */
+      sprintf(netmask, "%d", mask->v6);
+      return netmask;
+    }
+
+  return ret;
+}
+
+
diff --git a/lib/httpinfo/src/olsrd_httpinfo.h b/lib/httpinfo/src/olsrd_httpinfo.h
new file mode 100644 (file)
index 0000000..9282c31
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * The olsr.org Optimized Link-State Routing daemon(olsrd)
+ * Copyright (c) 2004, Andreas Tønnesen(andreto@olsr.org)
+ *                     includes code by Bruno Randolf
+ * 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_httpinfo.h,v 1.1 2004/12/15 20:11:50 kattemat Exp $
+ */
+
+/*
+ * Dynamic linked library for the olsr.org olsr daemon
+ */
+
+#ifndef _OLSRD_HTTP_INFO
+#define _OLSRD_HTTP_INFO
+
+#include "olsrd_plugin.h"
+
+
+#define HTTP_VERSION "HTTP/1.1"
+
+/**Response types */
+#define HTTP_100 HTTP_VERSION " 100 Continue\r\n"
+#define HTTP_101 HTTP_VERSION " 101 Switching Protocols\r\n"
+#define HTTP_200 HTTP_VERSION " 200 OK\r\n"
+#define HTTP_201 HTTP_VERSION " 201 Created\r\n"
+#define HTTP_202 HTTP_VERSION " 202 Accepted\r\n"
+#define HTTP_203 HTTP_VERSION " 203 Non-Authoritative Information\r\n"
+#define HTTP_204 HTTP_VERSION " 204 No Content\r\n"
+#define HTTP_205 HTTP_VERSION " 205 Reset Content\r\n"
+#define HTTP_206 HTTP_VERSION " 206 Partial Content\r\n"
+#define HTTP_300 HTTP_VERSION " 300 Multiple Choices\r\n"
+#define HTTP_301 HTTP_VERSION " 301 Moved Permanently\r\n"
+#define HTTP_302 HTTP_VERSION " 302 Found\r\n"
+#define HTTP_303 HTTP_VERSION " 303 See Other\r\n"
+#define HTTP_304 HTTP_VERSION " 304 Not Modified\r\n"
+#define HTTP_305 HTTP_VERSION " 305 Use Proxy\r\n"
+#define HTTP_307 HTTP_VERSION " 307 Temporary Redirect\r\n"
+#define HTTP_400 HTTP_VERSION " 400 Bad Request\r\n"
+#define HTTP_401 HTTP_VERSION " 401 Unauthorized\r\n"
+#define HTTP_402 HTTP_VERSION " 402 Payment Required\r\n"
+#define HTTP_403 HTTP_VERSION " 403 Forbidden\r\n"
+#define HTTP_404 HTTP_VERSION " 404 Not Found\r\n"
+#define HTTP_405 HTTP_VERSION " 405 Method Not Allowed\r\n"
+#define HTTP_406 HTTP_VERSION " 406 Not Acceptable\r\n"
+#define HTTP_407 HTTP_VERSION " 407 Proxy Authentication Required\r\n"
+#define HTTP_408 HTTP_VERSION " 408 Request Time-out\r\n"
+
+
+#define HTTP_400_MSG "<html><h1>400 - ERROR</h1><hr><i>" PLUGIN_NAME " version " PLUGIN_VERSION  "</i></html>"
+#define HTTP_404_MSG "<html><h1>404 - ERROR, no such file</h1><hr>This server does not support file requests!<br><br><i>" PLUGIN_NAME " version " PLUGIN_VERSION  "</i></html>"
+#define HTTP_200_MSG "<html><h1>OLSRD HTTP INFO-PLUGIN</h1><hr><i>" PLUGIN_NAME " version " PLUGIN_VERSION  "</i></html>"
+
+typedef enum
+  {
+    HTTP_BAD_REQ,
+    HTTP_BAD_FILE,
+    HTTP_OK
+  }http_header_type;
+
+char netmask[5];
+
+char *
+olsr_ip_to_string(union olsr_ip_addr *);
+
+char *
+olsr_netmask_to_string(union hna_netmask *);
+
+
+#endif
diff --git a/lib/httpinfo/src/olsrd_plugin.c b/lib/httpinfo/src/olsrd_plugin.c
new file mode 100644 (file)
index 0000000..331577b
--- /dev/null
@@ -0,0 +1,271 @@
+/*
+ * 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.1 2004/12/15 20:11:50 kattemat Exp $
+ */
+
+/*
+ * Dynamic linked library for the olsr.org olsr daemon
+ */
+
+
+#include "olsrd_plugin.h"
+#include <stdio.h>
+
+
+/* Data to sent to the plugin with the register_olsr_function call 
+ * THIS STRUCT MUST MATCH ITS SIBLING IN plugin_loader.h IN OLSRD
+ */
+struct olsr_plugin_data
+{
+  int ipversion;
+  union olsr_ip_addr *main_addr;
+  int (*olsr_plugin_io)(int, void *, size_t);
+};
+
+
+/**
+ * "Private" declarations
+ */
+
+void __attribute__ ((constructor)) 
+my_init(void);
+
+void __attribute__ ((destructor)) 
+my_fini(void);
+
+int
+register_olsr_data(struct olsr_plugin_data *);
+
+int
+fetch_olsrd_data(void);
+
+
+/*
+ * 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 
+get_plugin_interface_version()
+{
+  return PLUGIN_INTERFACE_VERSION;
+}
+
+
+
+/**
+ *Constructor
+ */
+void
+my_init()
+{
+  /* Print plugin info to stdout */
+  printf("%s\n", MOD_DESC);
+  
+  return;
+}
+
+/**
+ *Destructor
+ */
+void
+my_fini()
+{
+
+  /* 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();
+
+  return;
+}
+
+int
+register_olsr_param(char *key, char *value)
+{
+  if(!strcmp(key, "port"))
+    {
+     http_port = atoi(value);
+     printf("(HTTPINFO) listening on port: %d\n", http_port);
+    }
+  return 1;
+}
+
+/**
+ *Register needed functions and pointers
+ *
+ *This function should not be changed!
+ *
+ */
+int
+register_olsr_data(struct olsr_plugin_data *data)
+{
+  /* IPversion */
+  ipversion = data->ipversion;
+  /* Main address */
+  main_addr = data->main_addr;
+
+  /* Multi-purpose function */
+  olsr_plugin_io = data->olsr_plugin_io;
+
+  /* Set size of IP address */
+  if(ipversion == AF_INET)
+    {
+      ipsize = sizeof(olsr_u32_t);
+    }
+  else
+    {
+      ipsize = sizeof(struct in6_addr);
+    }
+
+  if(!fetch_olsrd_data())
+    {
+      fprintf(stderr, "Could not fetch the neccessary functions from olsrd!\n");
+      return 0;
+    }
+
+  /* Calls the initialization function
+   * olsr_plugin_init()
+   * This function should be present in your
+   * sourcefile and all data initialization
+   * should happen there - NOT HERE!
+   */
+  if(!olsr_plugin_init())
+    {
+      fprintf(stderr, "Could not initialize plugin!\n");
+      return 0;
+    }
+
+  return 1;
+
+}
+
+
+
+int
+fetch_olsrd_data()
+{
+  int retval = 1;
+
+  
+  /* Neighbor table */
+  if(!olsr_plugin_io(GETD__NEIGHBORTABLE, 
+                    &neighbortable, 
+                    sizeof(neighbortable)))
+  {
+    neighbortable = NULL;
+    retval = 0;
+  }
+  
+  /* Two hop neighbor table */
+  if(!olsr_plugin_io(GETD__TWO_HOP_NEIGHBORTABLE, 
+                    &two_hop_neighbortable, 
+                    sizeof(two_hop_neighbortable)))
+  {
+    two_hop_neighbortable = NULL;
+    retval = 0;
+  }
+
+  /* Topoloy table */
+  if(!olsr_plugin_io(GETD__TC_TABLE, 
+                    &tc_table, 
+                    sizeof(tc_table)))
+  {
+    tc_table = NULL;
+    retval = 0;
+  }
+
+  /* HNA table */
+  if(!olsr_plugin_io(GETD__HNA_SET, 
+                    &hna_set, 
+                    sizeof(hna_set)))
+  {
+    hna_set = NULL;
+    retval = 0;
+  }
+
+  /* Olsr debug output function */
+  if(!olsr_plugin_io(GETF__OLSR_PRINTF, 
+                    &olsr_printf, 
+                    sizeof(olsr_printf)))
+  {
+    olsr_printf = NULL;
+    retval = 0;
+  }
+
+  /* Olsr malloc wrapper */
+  if(!olsr_plugin_io(GETF__OLSR_MALLOC, 
+                    &olsr_malloc, 
+                    sizeof(olsr_malloc)))
+  {
+    olsr_malloc = NULL;
+    retval = 0;
+  }
+
+  /* "ProcessChanges" event registration */
+  if(!olsr_plugin_io(GETF__REGISTER_PCF, 
+                    &register_pcf, 
+                    sizeof(register_pcf)))
+  {
+    register_pcf = NULL;
+    retval = 0;
+  }
+
+
+
+  /* Add socket to OLSR select function */
+  if(!olsr_plugin_io(GETF__ADD_OLSR_SOCKET, &add_olsr_socket, sizeof(add_olsr_socket)))
+  {
+    add_olsr_socket = NULL;
+    retval = 0;
+  }
+
+  /* Remove socket from OLSR select function */
+  if(!olsr_plugin_io(GETF__REMOVE_OLSR_SOCKET, &remove_olsr_socket, sizeof(remove_olsr_socket)))
+  {
+    remove_olsr_socket = NULL;
+    retval = 0;
+  }
+
+  return retval;
+
+}
diff --git a/lib/httpinfo/src/olsrd_plugin.h b/lib/httpinfo/src/olsrd_plugin.h
new file mode 100644 (file)
index 0000000..cb0c5fb
--- /dev/null
@@ -0,0 +1,315 @@
+/*
+ * 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.h,v 1.1 2004/12/15 20:11:50 kattemat Exp $
+ */
+
+/*
+ * Dynamic linked library for the olsr.org olsr daemon
+ */
+
+#ifndef _OLSRD_PLUGIN_DEFS
+#define _OLSRD_PLUGIN_DEFS
+
+
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/time.h>
+#include <time.h>
+#include <math.h>
+
+#include "olsr_plugin_io.h"
+
+
+/*****************************************************************************
+ *                               Plugin data                                 *
+ *                       ALTER THIS TO YOUR OWN NEED                         *
+ *****************************************************************************/
+
+#define PLUGIN_NAME    "OLSRD HTTP info plugin"
+#define PLUGIN_VERSION "0.1"
+#define PLUGIN_AUTHOR   "Andreas Tønnesen"
+#define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR
+#define PLUGIN_INTERFACE_VERSION 2
+
+struct in_addr ipc_accept_ip;
+int http_port;
+
+/****************************************************************************
+ *           Various datastructures and definitions from olsrd              *
+ ****************************************************************************/
+
+/*
+ * TYPES SECTION
+ */
+
+typedef enum
+{
+    OLSR_FALSE = 0,
+    OLSR_TRUE
+}olsr_bool;
+
+
+
+/* types */
+#include <sys/types.h>
+
+#ifndef WIN32
+typedef u_int8_t        olsr_u8_t;
+typedef u_int16_t       olsr_u16_t;
+typedef u_int32_t       olsr_u32_t;
+typedef int8_t          olsr_8_t;
+typedef int16_t         olsr_16_t;
+typedef int32_t         olsr_32_t;
+#else
+typedef unsigned char olsr_u8_t;
+typedef unsigned short olsr_u16_t;
+typedef unsigned int olsr_u32_t;
+typedef char olsr_8_t;
+typedef short olsr_16_t;
+typedef int olsr_32_t;
+#endif
+
+
+/*
+ * VARIOUS DEFINITIONS
+ */
+
+union olsr_ip_addr
+{
+  olsr_u32_t v4;
+  struct in6_addr v6;
+};
+
+union hna_netmask
+{
+  olsr_u32_t v4;
+  olsr_u16_t v6;
+};
+
+/*
+ * Hashing
+ */
+
+#define        HASHSIZE        32
+#define        HASHMASK        (HASHSIZE - 1)
+
+#define MAXIFS         8 /* Maximum number of interfaces (from defs.h) in uOLSRd */
+
+
+
+/*
+ * Neighbor structures
+ */
+
+/* One hop neighbor */
+
+struct neighbor_2_list_entry 
+{
+  struct neighbor_2_entry      *neighbor_2;
+  struct timeval              neighbor_2_timer;
+  struct neighbor_2_list_entry *next;
+  struct neighbor_2_list_entry *prev;
+};
+
+struct neighbor_entry
+{
+  union olsr_ip_addr           neighbor_main_addr;
+  olsr_u8_t                    status;
+  olsr_u8_t                    willingness;
+  olsr_bool                    is_mpr;
+  olsr_bool                    was_mpr; /* Used to detect changes in MPR */
+  olsr_bool                    skip;
+  int                          neighbor_2_nocov;
+  int                          linkcount;
+  struct neighbor_2_list_entry neighbor_2_list; 
+  struct neighbor_entry        *next;
+  struct neighbor_entry        *prev;
+};
+
+
+/* Two hop neighbor */
+
+
+struct neighbor_list_entry 
+{
+  struct       neighbor_entry *neighbor;
+  double path_link_quality;
+  double saved_path_link_quality;
+  struct       neighbor_list_entry *next;
+  struct       neighbor_list_entry *prev;
+};
+
+struct neighbor_2_entry
+{
+  union olsr_ip_addr         neighbor_2_addr;
+  olsr_u8_t                 mpr_covered_count;    /*used in mpr calculation*/
+  olsr_u8_t                 processed;            /*used in mpr calculation*/
+  olsr_16_t                  neighbor_2_pointer;   /* Neighbor count */
+  struct neighbor_list_entry neighbor_2_nblist; 
+  struct neighbor_2_entry    *prev;
+  struct neighbor_2_entry    *next;
+};
+
+/* Topology entry */
+
+struct topo_dst
+{
+  union olsr_ip_addr T_dest_addr;
+  struct timeval T_time;
+  olsr_u16_t T_seq;
+  struct topo_dst *next;
+  struct topo_dst *prev;
+  double link_quality;
+  double inverse_link_quality;
+  double saved_link_quality;
+  double saved_inverse_link_quality;
+};
+
+struct tc_entry
+{
+  union olsr_ip_addr T_last_addr;
+  struct topo_dst destinations;
+  struct tc_entry *next;
+  struct tc_entry *prev;
+};
+
+/* HNA */
+
+/* hna_netmask declared in packet.h */
+
+struct hna_net
+{
+  union olsr_ip_addr A_network_addr;
+  union hna_netmask  A_netmask;
+  struct timeval     A_time;
+  struct hna_net     *next;
+  struct hna_net     *prev;
+};
+
+struct hna_entry
+{
+  union olsr_ip_addr A_gateway_addr;
+  struct hna_net     networks;
+  struct hna_entry   *next;
+  struct hna_entry   *prev;
+};
+
+/* The lists */
+
+struct neighbor_entry *neighbortable;
+struct neighbor_2_entry *two_hop_neighbortable;
+struct tc_entry *tc_table;
+struct hna_entry *hna_set;
+
+
+/* Buffer for olsr_ip_to_string */
+
+char ipv6_buf[100]; /* buffer for IPv6 inet_htop */
+
+
+/****************************************************************************
+ *                Function pointers to functions in olsrd                   *
+ *              These allow direct access to olsrd functions                *
+ ****************************************************************************/
+
+/* The multi-purpose funtion. All other functions are fetched trough this */
+int (*olsr_plugin_io)(int, void *, size_t);
+
+/* Register a "process changes" function */
+int (*register_pcf)(int (*)(int, int, int));
+
+/* Add a socket to the main olsrd select loop */
+void (*add_olsr_socket)(int, void(*)(int));
+
+/* Remove a socket from the main olsrd select loop */
+int (*remove_olsr_socket)(int, void(*)(int));
+
+/* get the link status to a neighbor */
+int (*check_neighbor_link)(union olsr_ip_addr *);
+
+/* olsrd printf wrapper */
+int (*olsr_printf)(int, char *, ...);
+
+/* olsrd malloc wrapper */
+void *(*olsr_malloc)(size_t, const char *);
+
+
+/****************************************************************************
+ *                             Data from olsrd                              *
+ *           NOTE THAT POINTERS POINT TO THE DATA USED BY OLSRD!            *
+ *               NEVER ALTER DATA POINTED TO BY THESE POINTERS              * 
+ *                   UNLESS YOU KNOW WHAT YOU ARE DOING!!!                  *
+ ****************************************************************************/
+
+/* These two are set automatically by olsrd at load time */
+int                ipversion;  /* IPversion in use */
+union olsr_ip_addr *main_addr; /* Main address */
+
+
+size_t             ipsize;     /* Size of the ipadresses used */
+
+/****************************************************************************
+ *                Functions that the plugin MUST provide                    *
+ ****************************************************************************/
+
+
+/* Initialization function */
+int
+olsr_plugin_init(void);
+
+/* IPC initialization function */
+int
+plugin_ipc_init(void);
+
+int
+register_olsr_param(char *, char *);
+
+/* Destructor function */
+void
+olsr_plugin_exit(void);
+
+/* Mulitpurpose funtion */
+int
+plugin_io(int, void *, size_t);
+
+int 
+get_plugin_interface_version(void);
+
+#endif
diff --git a/lib/httpinfo/version-script.txt b/lib/httpinfo/version-script.txt
new file mode 100644 (file)
index 0000000..81f3f8e
--- /dev/null
@@ -0,0 +1,11 @@
+VERS_1.0
+{
+  global:
+    get_plugin_interface_version;
+    register_olsr_data;
+    plugin_io;
+    register_olsr_param;
+
+  local:
+    *;
+};