Subject: | Net-IP reverse ip translation doesn't honor prefixes |
Date: | Tue, 27 Feb 2007 09:36:19 +0100 (CET) |
To: | 5Abug-Net-IP [...] rt.cpan.org |
From: | Martin Blapp <mb [...] imp.ch> |
Hi,
If you try to get a reverse network adresse like
the one it seems to work:
Here are examples:
192.168.1.1/32 -> 1.1.168.192.in-addr.arpa correct
192.168.1.0/24 -> 1.168.192.in-addr.arpa correct
192.168.0.0/16 -> 168.192.in-addr.arpa correct
but ... here are some examples which
give wrong results !
192.168.0.0/24 -> 168.192.in-addr.arpa wrong !
192.0.0.0/24 -> 192.in-addr.arpa wrong !
192.0.0.0/32 -> 192.in-addr.arpa wrong !
The patch below works only for the prefixes/netclasses (/32 /24 /16),
the other ones don't make any sense IMHO.
We need this functionality for a Net::DNS::Resolver driven
blacklist via dynamic dns updates.
--
Martin
--- IP.pm Mon May 22 18:46:40 2006
+++ IP.pm Mon Feb 26 12:14:39 2007
@@ -1772,12 +1772,39 @@
my $no_quads = ($len / 8);
my @reverse_quads = reverse @quads;
+ my $octcount = 0;
+ my $zeros = "";
while (@reverse_quads and $reverse_quads[0] == 0) {
- shift(@reverse_quads);
+ #
+ # Keep zeros if the prefix doesn't match the
+ # number of zeros.
+ #
+ $octcount++;
+ if ($len == 32) {
+ if ($octcount == 1) {
+ $zeros = "0\.";
+ } elsif ($octcount == 2) {
+ $zeros = "0\.0\.";
+ } elsif ($octcount == 3) {
+ $zeros = "0\.0\.0\.";
+ }
+ } elsif ($len == 24) {
+ if ($octcount == 2) {
+ $zeros = "0\.";
+ } elsif ($octcount == 3) {
+ $zeros = "0\.0\.";
+ }
+ } elsif ($len == 16) {
+ if ($octcount == 3) {
+ $zeros = "0\.";
+ }
+ }
+ shift(@reverse_quads);
}
-
- return join '.', @reverse_quads, 'in-addr', 'arpa.';
+ my $ret = join '.', @reverse_quads, 'in-addr', 'arpa.';
+ $ret = $zeros . "$ret";
+ return $ret;
}
elsif ($ip_version == 6) {
my @rev_groups = reverse split /:/, $ip;