Clear subnets before using them.
[tinc] / src / subnet.c
index 9d13d7c..ada8112 100644 (file)
@@ -1,7 +1,7 @@
 /*
     subnet.c -- handle subnet lookups and lists
-    Copyright (C) 2000-2002 Guus Sliepen <guus@sliepen.warande.net>,
-                  2000-2002 Ivo Timmermans <itimmermans@bigfoot.com>
+    Copyright (C) 2000-2002 Guus Sliepen <guus@sliepen.eu.org>,
+                  2000-2002 Ivo Timmermans <ivo@o2w.nl>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -17,7 +17,7 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id: subnet.c,v 1.1.2.35 2002/04/26 18:13:00 zarq Exp $
+    $Id: subnet.c,v 1.1.2.39 2002/07/11 12:42:43 guus Exp $
 */
 
 #include "config.h"
@@ -50,8 +50,14 @@ avl_tree_t *subnet_tree;
 
 int subnet_compare_mac(subnet_t *a, subnet_t *b)
 {
+  int result;
 cp
-  return memcmp(&a->net.mac.address, &b->net.mac.address, sizeof(mac_t));
+  result = memcmp(&a->net.mac.address, &b->net.mac.address, sizeof(mac_t));
+  
+  if(result || !a->owner || !b->owner)
+    return result;
+
+  return strcmp(a->owner->name, b->owner->name);
 }
 
 int subnet_compare_ipv4(subnet_t *a, subnet_t *b)
@@ -63,7 +69,12 @@ cp
   if(result)
     return result;
 
-  return a->net.ipv4.prefixlength - b->net.ipv4.prefixlength;
+  result = a->net.ipv4.prefixlength - b->net.ipv4.prefixlength;
+  
+  if(result || !a->owner || !b->owner)
+    return result;
+
+  return strcmp(a->owner->name, b->owner->name);
 }
 
 int subnet_compare_ipv6(subnet_t *a, subnet_t *b)
@@ -75,7 +86,12 @@ cp
   if(result)
     return result;
 
-  return a->net.ipv6.prefixlength - b->net.ipv6.prefixlength;
+  result = a->net.ipv6.prefixlength - b->net.ipv6.prefixlength;
+  
+  if(result || !a->owner || !b->owner)
+    return result;
+
+  return strcmp(a->owner->name, b->owner->name);
 }
 
 int subnet_compare(subnet_t *a, subnet_t *b)
@@ -139,7 +155,7 @@ cp
 subnet_t *new_subnet(void)
 {
 cp
-  return (subnet_t *)xmalloc(sizeof(subnet_t));
+  return (subnet_t *)xmalloc_and_zero(sizeof(subnet_t));
 }
 
 void free_subnet(subnet_t *subnet)
@@ -176,7 +192,7 @@ subnet_t *str2net(char *subnetstr)
 {
   int i, l;
   subnet_t *subnet;
-  unsigned short int x[8];
+  uint16_t x[8];
 cp
   subnet = new_subnet();
 cp
@@ -293,6 +309,7 @@ subnet_t *lookup_subnet_mac(mac_t *address)
 cp
   subnet.type = SUBNET_MAC;
   memcpy(&subnet.net.mac.address, address, sizeof(mac_t));
+  subnet.owner = NULL;
 
   p = (subnet_t *)avl_search(subnet_tree, &subnet);
 cp
@@ -306,6 +323,7 @@ cp
   subnet.type = SUBNET_IPV4;
   memcpy(&subnet.net.ipv4.address, address, sizeof(ipv4_t));
   subnet.net.ipv4.prefixlength = 32;
+  subnet.owner = NULL;
 
   do
   {
@@ -323,14 +341,14 @@ cp
            break;
          }
 
-        if (!maskcmp((char *)address, (char *)&p->net.ipv4.address, p->net.ipv4.prefixlength, sizeof(ipv4_t)))
+        if (!maskcmp(address, &p->net.ipv4.address, p->net.ipv4.prefixlength, sizeof(ipv4_t)))
           break;
         else
           {
             /* Otherwise, see if there is a bigger enclosing subnet */
 
             subnet.net.ipv4.prefixlength = p->net.ipv4.prefixlength - 1;
-            maskcpy((char *)&subnet.net.ipv4.address, (char *)&p->net.ipv4.address, subnet.net.ipv4.prefixlength, sizeof(ipv4_t));
+            maskcpy(&subnet.net.ipv4.address, &p->net.ipv4.address, subnet.net.ipv4.prefixlength, sizeof(ipv4_t));
           }
       }
   } while (p);
@@ -345,6 +363,7 @@ cp
   subnet.type = SUBNET_IPV6;
   memcpy(&subnet.net.ipv6.address, address, sizeof(ipv6_t));
   subnet.net.ipv6.prefixlength = 128;
+  subnet.owner = NULL;
   
   do
   {
@@ -360,14 +379,14 @@ cp
        if(p->type != SUBNET_IPV6)
          return NULL;
 
-        if (!maskcmp((char *)address, (char *)&p->net.ipv6.address, p->net.ipv6.prefixlength, sizeof(ipv6_t)))
+        if (!maskcmp(address, &p->net.ipv6.address, p->net.ipv6.prefixlength, sizeof(ipv6_t)))
           break;
         else
           {
             /* Otherwise, see if there is a bigger enclosing subnet */
 
             subnet.net.ipv6.prefixlength = p->net.ipv6.prefixlength - 1;
-            maskcpy((char *)&subnet.net.ipv6.address, (char *)&p->net.ipv6.address, subnet.net.ipv6.prefixlength, sizeof(ipv6_t));
+            maskcpy(&subnet.net.ipv6.address, &p->net.ipv6.address, subnet.net.ipv6.prefixlength, sizeof(ipv6_t));
           }
       }
    } while (p);