Allow adding parameters to an interface defined in an earlier config file
authorHenning Rogge <hrogge@googlemail.com>
Thu, 31 Dec 2009 18:53:28 +0000 (19:53 +0100)
committerHenning Rogge <hrogge@googlemail.com>
Thu, 31 Dec 2009 18:53:28 +0000 (19:53 +0100)
src/cfgparser/oparse.y
src/interfaces.c

index 291f7df..f856ab2 100644 (file)
@@ -860,29 +860,50 @@ ifstart: TOK_INTERFACE
 
 ifnick: TOK_STRING
 {
-  struct olsr_if *in = malloc(sizeof(*in));
-  
-  if (in == NULL) {
-    fprintf(stderr, "Out of memory(ADD IF)\n");
-    YYABORT;
+  struct olsr_if *in, *last;
+  in = olsr_cnf->interfaces;
+  last = NULL;
+  while (in != NULL) {
+    if (strcmp(in->name, $1->string) == 0) {
+      free ($1->string);
+      break;
+    }
+    last = in;
+    in = in->next;
   }
 
-  in->cnf = malloc(sizeof(*in->cnf));
-  if (in->cnf == NULL) {
-    fprintf(stderr, "Out of memory(ADD IFRULE)\n");
-    YYABORT;
-  }
-  memset(in->cnf, 0x00, sizeof(*in->cnf));
-  in->cnfi = malloc(sizeof(*in->cnfi));
-  if (in->cnf == NULL) {
-    fprintf(stderr, "Out of memory(ADD IFRULE)\n");
-    YYABORT;
+  if (in != NULL) {
+    /* remove old interface from list to add it later at the beginning */
+    if (last) {
+      last->next = in->next;
+    }
+    else {
+      olsr_cnf->interfaces = in->next;
+    }
   }
-  memset(in->cnfi, 0xFF, sizeof(*in->cnfi));
+  else {
+    in = malloc(sizeof(*in));
+    if (in == NULL) {
+      fprintf(stderr, "Out of memory(ADD IF)\n");
+      YYABORT;
+    }
 
-  in->name = $1->string;
+    in->cnf = malloc(sizeof(*in->cnf));
+    if (in->cnf == NULL) {
+      fprintf(stderr, "Out of memory(ADD IFRULE)\n");
+      YYABORT;
+    }
+    memset(in->cnf, 0x00, sizeof(*in->cnf));
+
+    in->cnfi = malloc(sizeof(*in->cnfi));
+    if (in->cnf == NULL) {
+      fprintf(stderr, "Out of memory(ADD IFRULE)\n");
+      YYABORT;
+    }
+    memset(in->cnfi, 0xFF, sizeof(*in->cnfi));
 
+    in->name = $1->string;
+  }
   /* Queue */
   in->next = olsr_cnf->interfaces;
   olsr_cnf->interfaces = in;
index 773bf43..cf66061 100644 (file)
@@ -253,7 +253,7 @@ queue_if(const char *name, int hemu)
 
   /* check if the inerfaces already exists */
   while (interf_n != NULL) {
-    if (memcmp(interf_n->name, name, strlen(name)) == 0) {
+    if (strcmp(interf_n->name, name) == 0) {
       fprintf(stderr, "Duplicate interfaces defined... not adding %s\n", name);
       return NULL;
     }