Packet format fix. Pad message until length is a multiple of 4. Some code
authorThomas Lopatic <thomas@lopatic.de>
Tue, 1 Mar 2005 20:16:56 +0000 (20:16 +0000)
committerThomas Lopatic <thomas@lopatic.de>
Tue, 1 Mar 2005 20:16:56 +0000 (20:16 +0000)
clean-ups. New makefile.

lib/nameservice/Makefile
lib/nameservice/src/nameservice.c
lib/nameservice/src/nameservice.h
lib/nameservice/src/nameservice_msg.h
lib/nameservice/src/olsrd_plugin.c

index c37948b..43b42c6 100644 (file)
+# 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: Makefile,v 1.6 2005/03/01 20:16:56 tlopatic Exp $
 
-CC ?= gcc
-STRIP ?= strip
-LIBDIR ?= $(INSTALL_PREFIX)/usr/lib
-PLUGINFLAGS = -fPIC -DOLSR_PLUGIN -I../../src
+PLUGIN_NAME =  olsrd_nameservice
+PLUGIN_VER =   0.1
+
+CC ?=          gcc
+STRIP ?=       strip
+
+# default CFLAGS and LDFLAGS, used if not externally set
+
+# used for compilation: yes
+# used for dependency file generation: no
+
+CFLAGS_SET =   -g -O2 -Wall -Wmissing-prototypes -Wstrict-prototypes
+LDFLAGS_SET =  -g
+
+# always appended to default or externally set CFLAGS and LDFLAGS
+
+# used for compilation: yes
+# used for dependency file generation: yes
+
+CFLAGS_ADD =   -DOLSR_PLUGIN -I../../src
+LDFLAGS_ADD =  -Wall -shared -Wl,--version-script=version-script.txt
+
+# same as CFLAGS_ADD, but not used for dependency file generation
+
+# used for compilation: yes
+# used for dependency file generation: no
+
+CFLAGS_ADD2 =  # nothing
+
+DEPFILE =      .depend
+
+SRCS =         $(wildcard src/*.c)
+OBJS =         $(patsubst %.c,%.o,$(SRCS))
+HDRS =         $(wildcard src/*.c)
 
 ifndef OS
 all:           help
+install:       help
+clean:         help
 endif
 
 ifeq ($(OS), linux)
-NAME = olsrd_nameservice.so.0.1
-MYFLAGS = -Wall -D_GNU_SOURCE $(PLUGINFLAGS)
-LIBS ?= -lc -lm
-CFLAGS ?= -O2
-CFLAGS += $(MYFLAGS)
-INSTALL_LIB = install -D -m 755 $(NAME) $(LIBDIR)/$(NAME);\
-       /sbin/ldconfig -n $(LIBDIR)
-all: plugin
+
+NAME ?=                $(PLUGIN_NAME).so.$(PLUGIN_VER)
+
+CFLAGS_ADD +=  -Dlinux
+CFLAGS_ADD2 += -fPIC
+LDFLAGS_ADD += -fPIC -Wl,-soname,$(NAME)
+
+CFLAGS_SET +=  # nothing
+LDFLAGS_SET += # nothing
+
+LIBS ?=                -lc -lm
+
+LIBDIR ?=      $(INSTALL_PREFIX)/usr/lib
+
+INSTALL_LIB =  install -D -m 755 $(NAME) $(LIBDIR)/$(NAME); \
+               /sbin/ldconfig -n $(LIBDIR)
+
+EXTRA_OBJS =   # nothing
+
+MAKEDEPEND =   makedepend -f $(DEPFILE) $(CFLAGS_ADD) -Y $(INCLUDES) \
+               $(SRCS) >/dev/null 2>&1
+
+all:           all2
+install:       install2
+clean:         clean2
+
 else
 ifeq ($(OS), fbsd)
-NAME = olsrd_nameservice.so.0.1
-MYFLAGS = -Wall $(PLUGINFLAGS)
-LIBS ?= -lc -lm
-CFLAGS ?= -O2
-CFLAGS += $(MYFLAGS)
-INSTALL_LIB = install -m 755 $(NAME) $(LIBDIR)/$(NAME);\
-       /sbin/ldconfig 
-all: plugin
+
+NAME ?=                $(PLUGIN_NAME).so.$(PLUGIN_VER)
+
+CFLAGS_ADD +=  # nothing
+CFLAGS_ADD2 += -fPIC
+LDFLAGS_ADD += -fPIC -Wl,-soname,$(NAME)
+
+CFLAGS_SET +=  # nothing
+LDFLAGS_SET += # nothing
+
+LIBS ?=                -lc -lm
+
+LIBDIR ?=      $(INSTALL_PREFIX)/usr/lib
+
+INSTALL_LIB =  install -m 755 $(NAME) $(LIBDIR)/$(NAME); \
+               /sbin/ldconfig
+
+EXTRA_OBJS =   # nothing
+
+MAKEDEPEND =   makedepend -f $(DEPFILE) $(CFLAGS_ADD) $(INCLUDES) $(SRCS)
+
+all:           all2
+install:       install2
+clean:         clean2
+
 else
 ifeq ($(OS), win32)
-NAME ?= olsrd_nameservice.dll
-NAMEFLAGS ?= -o $(NAME)
-MYFLAGS ?= -g -DWIN32 -mno-cygwin -I../../src/win32 -Wall -Wmissing-prototypes -Wstrict-prototypes $(PLUGINFLAGS)
-CFLAGS ?= -O2
-CFLAGS += $(MYFLAGS)
-LDFLAGS ?= -mno-cygwin -shared
-LIBS ?= -lws2_32
-INSTALL_LIB =  cp $(NAME) ../..
-all: plugin
+
+NAME ?=                $(PLUGIN_NAME).dll
+
+CFLAGS_ADD +=  -mno-cygwin -I../../src/win32 -DWIN32
+CFLAGS_ADD2 += # nothing
+LDFLAGS_ADD += -mno-cygwin -Wl,-soname,$(NAME)
+
+CFLAGS_SET +=  # nothing
+LDFLAGS_SET += # nothing
+
+LIBS ?=                -lws2_32
+
+INSTALL_LIB =  cp $(NAME) ../..
+
+EXTRA_OBJS =   ../../src/win32/compat.o
+
+MAKEDEPEND =   makedepend -f $(DEPFILE) $(CFLAGS_ADD) $(INCLUDES) $(SRCS)
+
+all:           all2
+install:       install2
+clean:         clean2
+
 else
-all:   help
+
+all:           help
+install:       help
+clean:         help
+
 endif
 endif
 endif
 
-SRCS = $(wildcard src/*.c)
-OBJS = $(patsubst %.c,%.o,$(SRCS))
-HDRS = $(wildcard src/*.c)
+CFLAGS ?=      $(CFLAGS_SET)
+LDFLAGS ?=     $(LDFLAGS_SET)
+
+CFLAGS         += $(CFLAGS_ADD) $(CFLAGS_ADD2)
+LDFLAGS                += $(LDFLAGS_ADD)
 
+all2:          $(NAME)
 
-plugin: $(OBJS)
-       $(CC) $(LDFLAGS) $(MYFLAGS) -shared -Wl,-soname,$(NAME) \
-       -Wl,--version-script=version-script.txt \
-       -o $(NAME) $(OBJS) $(LIBS)
+$(NAME):       $(OBJS) $(EXTRA_OBJS)
+               $(CC) $(LDFLAGS) -o $(NAME) $(OBJS) $(EXTRA_OBJS) $(LIBS)
 
-install:
-       $(STRIP) $(NAME)
-       $(INSTALL_LIB)
+install2:      $(NAME)
+               $(STRIP) $(NAME)
+               $(INSTALL_LIB)
 
-clean:
-       rm -f $(OBJS) $(NAME)
+clean2:
+               rm -f $(OBJS) $(NAME) $(DEPFILE)
+
+$(DEPFILE):    $(SRCS) $(HDRS)
+ifdef MAKEDEPEND
+               echo "# Generated automatically. DO NOT EDIT." >$(DEPFILE)
+               $(MAKEDEPEND)
+endif
 
 help:
-       @echo
-       @echo '***** olsr.org Nameservice Make ****'
-       @echo ' You must provide a valid target OS '
-       @echo ' by setting the OS variable! Valid  '
-       @echo ' target OSes are:                   '
-       @echo ' ---------------------------------  '
-       @echo ' linux - GNU/Linux                  '
-       @echo ' fbsd  - FreeBSD                    '
-       @echo ' win32 - Windows                    '
-       @echo ' ---------------------------------  '
-       @echo ' Example - build for FreeBSD:       '
-       @echo ' gmake OS=fbsd                      '
-       @echo '************************************'
-       @echo
-
-src/olsrd_plugin.o: $(HDRS)
-src/nameservice.o: $(HDRS)
+               @echo
+               @echo '                     * * * *  olsr.org Plugin Make  * * * *'
+               @echo
+               @echo '  Plugin: $(PLUGIN_NAME), version $(PLUGIN_VER)'
+               @echo
+               @echo '  You must provide a valid target OS by setting the OS variable.'
+               @echo
+               @echo '  Valid settings are:'
+               @echo
+               @echo '    linux - GNU/Linux'
+               @echo '    win32 - Microsoft Windows'
+               @echo '    fbsd  - FreeBSD'
+               @echo
+               @echo '  Example - Build on Windows:'
+               @echo
+               @echo '    make OS=win32'
+               @echo
+               @echo '  Example - Build and install on Linux:'
+               @echo
+               @echo '    make OS=linux install            '
+               @echo
+
+sinclude $(DEPFILE)
index 466410b..23a6eb9 100644 (file)
@@ -29,7 +29,7 @@
  *
  */
 
-/* $Id: nameservice.c,v 1.2 2005/01/21 06:26:04 kattemat Exp $ */
+/* $Id: nameservice.c,v 1.3 2005/03/01 20:16:56 tlopatic Exp $ */
 
 /*
  * Dynamic linked library for UniK OLSRd
@@ -53,7 +53,8 @@ olsr_u8_t name_table_changed=0;
 
 char* my_name = "";
 olsr_u8_t my_name_len = 0;
-char* my_filename = "/var/run/hosts_olsr";
+static char my_filename_buff[MAX_FILE + 1];
+char* my_filename = my_filename_buff;
 
 
 /**
@@ -63,6 +64,10 @@ int
 olsr_plugin_init()
 {
        int i;
+#ifdef WIN32
+       int len;
+#endif
+
        /* Init list */
        for(i = 0; i < HASHSIZE; i++)
        {
@@ -75,6 +80,19 @@ olsr_plugin_init()
        olsr_register_timeout_function(&olsr_timeout);
        olsr_register_scheduler_event(&olsr_event, NULL, EMISSION_INTERVAL, 0, NULL);
 
+#ifdef WIN32
+       GetWindowsDirectory(my_filename_buff, MAX_FILE - 12);
+
+       len = strlen(my_filename_buff);
+
+       if (my_filename_buff[len - 1] != '\\')
+               my_filename_buff[len++] = '\\';
+
+       strcpy(my_filename_buff + len, "olsrd.hosts");
+#else
+       strcpy(my_filename_buff, "/var/run/hosts_olsr");
+#endif
+
        return 1;
 }
 
@@ -195,17 +213,21 @@ olsr_event(void *foo)
                        message->v6.olsr_msgsize = htons(namesize);
                }
        
-               if(net_outbuffer_push(ifn, (olsr_u8_t *)message, namesize) != namesize ) {
+               if (net_outbuffer_push(ifn, buffer, namesize) != namesize)
+               {
                        /* Send data and try again */
                        net_output(ifn);
-                       if(net_outbuffer_push(ifn, (olsr_u8_t *)message, namesize) != namesize ) {
+                       if (net_outbuffer_push(ifn, buffer, namesize) !=
+                               namesize)
+                       {
                                olsr_printf(1, "NAME PLUGIN: could not send on interface: %s\n", ifn->int_name);
                        }
                }
        }
+
        olsr_printf(3, "\n");
+
        write_name_table();
-       return;
 }
 
 
@@ -279,10 +301,25 @@ forward:
 int
 get_namemsg(struct namemsg *msg)
 {
+       int i;
+       char *txt;
+
        msg->name_len = my_name_len;
-       char* txt = (char*)(msg + sizeof(struct namemsg));
-       strncpy(txt, my_name, my_name_len); 
-       return my_name_len;
+
+       msg->pad[0] = 0;
+       msg->pad[1] = 0;
+       msg->pad[2] = 0;
+
+       // msg + 1 == &msg[1]
+
+       txt = (char *)(msg + 1);
+
+       memcpy(txt, my_name, my_name_len); 
+
+       for (i = my_name_len; (i & 3) != 0; i++)
+               txt[i] = 0;
+
+       return i;
 }
 
 
@@ -294,16 +331,28 @@ get_namemsg(struct namemsg *msg)
 int
 read_namemsg(struct namemsg *msg, struct name_entry *to)
 {
-       char* txt = (char*)(msg + sizeof(struct namemsg));
-       if (to->name == NULL || strncmp(to->name, txt, MAX_NAME) != 0) {
-               if (to->name != NULL) {
-                       free( to->name );
-               }
-               to->name = olsr_malloc(msg->name_len+1, "new name_entry name");
-               strncpy(to->name, txt, msg->name_len);
+       char *txt;
+
+       // msg + 1 == &msg[1]
+
+       txt = (char*)(msg + 1);
+
+       if (to->name == NULL || 
+               strlen(to->name) != msg->name_len ||
+               memcmp(to->name, txt, msg->name_len) != 0)
+       {
+               if (to->name != NULL)
+                       free(to->name);
+
+               to->name = olsr_malloc(msg->name_len + 1,
+                       "new name_entry name");
+
+               memcpy(to->name, txt, msg->name_len);
                to->name[msg->name_len] = '\0';
+
                return 1;
        }
+
        return 0;       
 }
 
@@ -311,7 +360,7 @@ read_namemsg(struct namemsg *msg, struct name_entry *to)
 /**
  * Update or register a new name entry
  */
-int
+void
 update_name_entry(union olsr_ip_addr *originator, struct namemsg *message, double vtime)
 {
        int hash;
@@ -319,35 +368,39 @@ update_name_entry(union olsr_ip_addr *originator, struct namemsg *message, doubl
        
        hash = olsr_hashing(originator);
        
-       /* Check for the entry */
-       for(entry = list[hash].next; entry != &list[hash]; entry = entry->next)
+       // entry lookup
+
+       for (entry = list[hash].next; entry != &list[hash]; entry = entry->next)
+               if (memcmp(originator, &entry->originator, ipsize) == 0)
+                       break;
+
+       // no entry found
+
+       if (entry == &list[hash])
        {
-               if(memcmp(originator, &entry->originator, ipsize) == 0) {
-                       if (read_namemsg( message, entry )) {
-                               name_table_changed = 1;
-                       }
-                       olsr_get_timestamp(vtime * 1000, &entry->timer);
-                       return 0;
-               }
+               entry = olsr_malloc(sizeof(struct name_entry), "new name_entry");
+               entry->name = NULL;
+               memcpy(&entry->originator, originator, ipsize);
+
+               entry->next = list[hash].next->prev;
+               entry->prev = &list[hash];
+
+               list[hash].next->prev = entry;
+               list[hash].next = entry;
        }
 
-       entry = olsr_malloc(sizeof(struct name_entry), "new name_entry");
-       entry->name = NULL;
-       memcpy(&entry->originator, originator, ipsize);
+       // update entry's timestamp
+
        olsr_get_timestamp(vtime * 1000, &entry->timer);
-       
-       read_namemsg( message, entry );
 
-       olsr_printf(2, "NAME PLUGIN: New entry %s: %s\n", olsr_ip_to_string(originator), entry->name);
-               
-       /* Queue */
-       entry->next = list[hash].next->prev;
-       entry->prev = &list[hash];
-       list[hash].next->prev = entry;
-       list[hash].next = entry;
+       // insert name into entry
 
-       name_table_changed = 1;
-       return 1;
+       if (read_namemsg(message, entry))
+       {
+               name_table_changed = 1;
+
+               olsr_printf(2, "NAME PLUGIN: Changed entry %s: %s\n", olsr_ip_to_string(originator), entry->name);
+       }
 }
 
 
@@ -359,15 +412,17 @@ write_name_table()
 {
        int hash;
        struct name_entry *entry;
-       char buf[MAX_NAME+17];
        FILE* hosts;
 
-       olsr_printf(2, "NAME PLUGIN: writing hosts file\n");
-       
        if(!name_table_changed)
                return;
              
+       olsr_printf(2, "NAME PLUGIN: writing hosts file %s\n", my_filename);
+       
        hosts = fopen( my_filename, "w" );
+
+       if (hosts == NULL)
+               return;
        
        fprintf(hosts, "# this /etc/hosts file is overwritten regularly by olsrd\n");
        fprintf(hosts, "# do not edit\n");
@@ -377,12 +432,10 @@ write_name_table()
        for(hash = 0; hash < HASHSIZE; hash++) 
        {
                for(entry = list[hash].next; entry != &list[hash]; entry = entry->next) 
-               {
-                       sprintf(buf, "%s\t%s\n", olsr_ip_to_string(&entry->originator), entry->name);
-                       fprintf(hosts, "%s", buf);
-               }
+                       fprintf(hosts, "%s\t%s\n", olsr_ip_to_string(&entry->originator), entry->name);
        }
        
        fclose(hosts);
+
        name_table_changed = 0;
 }
index 3cadb79..6b9f93e 100644 (file)
@@ -29,7 +29,7 @@
  *
  */
 
-/* $Id: nameservice.h,v 1.1 2005/01/16 13:06:00 kattemat Exp $ */
+/* $Id: nameservice.h,v 1.2 2005/03/01 20:16:56 tlopatic Exp $ */
  
 /*
  * Dynamic linked library for UniK OLSRd
@@ -88,7 +88,7 @@ get_namemsg(struct namemsg *);
 int
 read_namemsg(struct namemsg *, struct name_entry *);
 
-int
+void
 update_name_entry(union olsr_ip_addr *, struct namemsg *, double);
 
 void
index dd5f057..48624e9 100644 (file)
@@ -4,6 +4,7 @@
 struct namemsg
 {
   olsr_u8_t name_len;          // length of the following name filed
+  olsr_u8_t pad[3];             // added by the compiler anyway
 };
 
 /*
index 6d00159..1e4a804 100644 (file)
@@ -29,7 +29,7 @@
  *
  */
 
-/* $Id: olsrd_plugin.c,v 1.5 2005/02/25 22:43:21 kattemat Exp $ */
+/* $Id: olsrd_plugin.c,v 1.6 2005/03/01 20:16:56 tlopatic Exp $ */
 
 
 /*
 int
 register_olsr_param(char *, char *);
 
-#ifdef WIN32
-
-static char *inet_ntop4(const unsigned char *src, char *dst, int size)
-{
-  static const char fmt[] = "%u.%u.%u.%u";
-  char tmp[sizeof "255.255.255.255"];
-
-  if (sprintf(tmp, fmt, src[0], src[1], src[2], src[3]) > size)
-    return (NULL);
-
-  return strcpy(dst, tmp);
-}
-
-char *inet_ntop(int af, void *src, char *dst, int size)
-{
-  switch (af)
-  {
-  case AF_INET:
-    return (inet_ntop4(src, dst, size));
-
-  default:
-    return (NULL);
-  }
-}
-
-#endif
-
 #ifndef linux
 
 #include <stdlib.h>
 
+char *strndup(const char *ptr, size_t size);
+
 /* strndup() is a GNU extention */
 char *
 strndup(const char *ptr, size_t size)
@@ -95,7 +70,7 @@ strndup(const char *ptr, size_t size)
   if(!ret)
     return NULL;
 
-  strncpy(ret, ptr, len);
+  memcpy(ret, ptr, len);
   ret[len] = '\0';
 
   return ret;