Clear subnets before using them.
[tinc] / src / subnet.c
index d971a4d..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.36 2002/06/08 12:57:10 guus 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)
@@ -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
   {
@@ -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
   {