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"
|