summaryrefslogtreecommitdiff
path: root/net-mgmt/rancid/files/patch-bin__rancid.in
blob: 328a6e4a19863cb8587f88ed458687871b09f0d4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
--- bin/rancid.in.orig	2015-06-09 15:46:07.000000000 +0100
+++ bin/rancid.in	2015-06-09 15:57:24.000000000 +0100
@@ -162,13 +162,38 @@
     @sorted_lines;
 }
 
-# These two routines will sort based upon IP addresses
+# ipaddrval(IPaddr) converts and IPv4/v6 address to a string for comparison.
 sub ipaddrval {
-    my(@a) = ($_[0] =~ m#^(\d+)\.(\d+)\.(\d+)\.(\d+)$#);
-    $a[3] + 256 * ($a[2] + 256 * ($a[1] +256 * $a[0]));
+    my($a) = @_;
+    my($norder);
+
+    if ($a =~ /:/) {
+	my($l);
+	if ($a =~ /\//) {
+	    ($a, $l) = split(/\//, $a);
+	} else {
+	    $l = 128;
+	}
+	$norder = inet_pton(AF_INET6, $a);
+	return unpack("H*", $norder) . unpack("H*", pack("C", $l));
+    } else {
+	my($l);
+	if ($a =~ /\//) {
+	    ($a, $l) = split(/\//, $a);
+	} else {
+	    $l = 32;
+	}
+	$norder = inet_pton(AF_INET, $a);
+	return(unpack("H*", $norder) . unpack("H*", pack("C", $l)));
+    }
+
+    # otherwise return the original key value, so as not to sort on null
+    return($_[0]);
 }
+
+# sortbyipaddr(IPaddr, IPaddr) compares two IPv4/v6 addresses like strcmp().
 sub sortbyipaddr {
-    &ipaddrval($a) <=> &ipaddrval($b);
+    &ipaddrval($a) cmp &ipaddrval($b);
 }
 
 # This routine parses "show version"