Lazy initialization for nameservice plugin (wait for main_ip)
authorHenning Rogge <hrogge@googlemail.com>
Mon, 3 May 2010 15:29:18 +0000 (17:29 +0200)
committerHenning Rogge <hrogge@googlemail.com>
Mon, 3 May 2010 15:29:18 +0000 (17:29 +0200)
lib/nameservice/src/nameservice.c
src/ipcalc.c
src/ipcalc.h

index 89ecd5e..63ddeaa 100644 (file)
@@ -67,6 +67,9 @@
 #include "mapwrite.h"
 #include "compat.h"
 
+/* true if plugin has been configured */
+static bool nameservice_configured = false;
+
 /* config parameters */
 static char my_hosts_file[MAX_FILE + 1];
 static char my_sighup_pid_file[MAX_FILE + 1];
@@ -319,6 +322,16 @@ add_name_to_list(struct name_entry *my_list, const char *value, int type, const
 int
 name_init(void)
 {
+  /* register functions with olsrd */
+  olsr_parser_add_function(&olsr_parser, PARSER_TYPE);
+
+  /* periodic message generation */
+  msg_gen_timer = olsr_start_timer(my_interval * MSEC_PER_SEC, EMISSION_JITTER, OLSR_TIMER_PERIODIC, &olsr_namesvc_gen, NULL, 0);
+
+  return 1;
+}
+
+static void name_lazy_init(void) {
   struct name_entry *name;
   union olsr_ip_addr ipz;
   int ret;
@@ -326,8 +339,17 @@ name_init(void)
   //regex string for validating the hostnames
   const char *regex_name = "^[[:alnum:]_.-]+$";
   //regex string for the service line
-  size_t regex_size = 256 * sizeof(char) + strlen(my_suffix);
-  char *regex_service = olsr_malloc(regex_size, "new *char from name_init for regex_service");
+  size_t regex_size;
+  char *regex_service;
+
+  /* wait for configured master IP */
+  if (ipequal(&olsr_cnf->main_addr, &olsr_ip_zero)) {
+    return;
+  }
+  nameservice_configured = true;
+
+  regex_size = 256 * sizeof(char) + strlen(my_suffix);
+  regex_service = olsr_malloc(regex_size, "new *char from name_init for regex_service");
   memset(&ipz, 0, sizeof(ipz));
 
   //compile the regex from the string
@@ -396,15 +418,9 @@ name_init(void)
   my_services = remove_nonvalid_names_from_list(my_services, NAME_SERVICE);
   my_macs = remove_nonvalid_names_from_list(my_macs, NAME_MACADDR);
 
-  /* register functions with olsrd */
-  olsr_parser_add_function(&olsr_parser, PARSER_TYPE);
-
-  /* periodic message generation */
-  msg_gen_timer = olsr_start_timer(my_interval * MSEC_PER_SEC, EMISSION_JITTER, OLSR_TIMER_PERIODIC, &olsr_namesvc_gen, NULL, 0);
-
   mapwrite_init(my_latlon_file);
 
-  return 1;
+  return;
 }
 
 struct name_entry *
@@ -580,6 +596,12 @@ olsr_namesvc_gen(void *foo __attribute__ ((unused)))
   struct interface *ifn;
   int namesize;
 
+  if (!nameservice_configured) {
+    name_lazy_init();
+    if (!nameservice_configured) {
+      return;
+    }
+  }
   /* fill message */
   if (olsr_cnf->ip_version == AF_INET) {
     /* IPv4 */
@@ -635,6 +657,13 @@ olsr_parser(union olsr_message *m, struct interface *in_if __attribute__ ((unuse
   int size;
   uint16_t seqno;
 
+  if (!nameservice_configured) {
+    name_lazy_init();
+    if (!nameservice_configured) {
+      return false;
+    }
+  }
+
   /* Fetch the originator of the messsage */
   if (olsr_cnf->ip_version == AF_INET) {
     memcpy(&originator, &m->v4.originator, olsr_cnf->ipsize);
index 5416c68..ecc9aff 100644 (file)
@@ -63,6 +63,12 @@ const struct olsr_ip_prefix ipv6_internet_route =
     .prefix_len = 3
 };
 
+/* ip address zero */
+const union olsr_ip_addr olsr_ip_zero =
+{
+    .v6.s6_addr = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+};
+
 /* Default IPv6 multicast addresses FF02::6D(linklocal manet routers, see RFC 5498) */
 const union olsr_ip_addr ipv6_def_multicast = {
     .v6.s6_addr = { 0xFF, 0x02, 0,0,0,0,0,0,0,0,0,0,0,0,0, 0x6D }
index 36bb190..ea23d5f 100644 (file)
@@ -53,6 +53,8 @@ extern const struct olsr_ip_prefix ipv4_internet_route;
 extern const struct olsr_ip_prefix ipv6_mappedv4_route;
 extern const struct olsr_ip_prefix ipv6_internet_route;
 
+extern const union olsr_ip_addr olsr_ip_zero;
+
 extern const union olsr_ip_addr ipv6_def_multicast;
 
 struct ipaddr_str {