File dnswalk-20100325.patch of Package dnswalk

--- dnswalk-2.0.2/dnswalk	1997-10-06 15:24:00.000000000 +0200
+++ dnswalk-2.0.2/dnswalk	2013-04-15 21:09:37.000000000 +0200
@@ -1,9 +1,9 @@
-#!/usr/contrib/bin/perl
+#!/usr/bin/perl
 #
 # dnswalk    Walk through a DNS tree, pulling out zone data and
 # dumping it in a directory tree
 #
-# $Id: dnswalk,v 1.18 1997/10/06 13:23:58 barr Exp barr $
+# $Id: dnswalk,v 1.3 2010-03-25 01:36:37-10 tony Exp $
 #
 # check data collected for legality using standard resolver
 #
@@ -21,6 +21,8 @@
 use Getopt::Std;
 use IO::Socket;
 use Net::DNS;
+use Net::IP;
+use Socket6;
 
 getopts("D:rfiadmFl");
 
@@ -86,10 +88,10 @@
 	@zone=$res->axfr($domain);
 	unless (defined(@zone) && @zone) {
 	    print STDERR "failed\n";
-		&printerr("FAIL",
-			"Zone transfer of $domain from $server failed: ".
-			$res->errorstring. "\n");
-		next SERVER;
+	    &printerr("FAIL",
+		      "Zone transfer of $domain from $server failed: "
+		      . $res->errorstring . "\n");
+	    next SERVER;
 	}
 	@subdoms=undef;
         foreach $rr (@zone) {
@@ -125,8 +127,8 @@
     return if (!$domain);
     $res = new Net::DNS::Resolver;
     $ns_req = $res->query($domain, "NS");
-    &printerr("FAIL", "No nameservers found for $domain: ". 
-	$res->errorstring ."\n") 
+    &printerr("FAIL", "No nameservers found for $domain: " . 
+	      $res->errorstring . "\n") 
 	    unless (defined($ns_req) and ($ns_req->header->ancount > 0));
     foreach $ns ($ns_req->answer) {
 	$ns_tmp = $ns->nsdname;
@@ -150,8 +152,8 @@
     my ($packet) = new Net::DNS::Packet($zone, "SOA", "IN");
     my ($soa_req) = $res->send($packet);
     unless (defined($soa_req)) {
-	&printerr("FAIL", "Cannot get SOA record for $zone:". 
-	    $res->errorstring ."\n");
+	&printerr("FAIL", "Cannot get SOA record for $zone:" . 
+		  $res->errorstring . "\n");
 	return "";
     }
     unless (($soa_req->header->ancount >= 1) && 
@@ -174,66 +176,62 @@
     local (@keys);	# temp variable
     foreach $rr (@zone) {
 	# complain about invalid chars only for mail names
-        if ((($rr->type eq "A") || ($rr->type eq "MX")) && (!$opt_i) &&
+        if ((($rr->type eq "A") || ($rr->type eq "AAAA") ||
+             ($rr->type eq "MX")) && 
+	    (!$opt_i) && 
 	    ($rr->name =~ /[^\*][^-A-Za-z0-9.]/)) {
-            &printerr("WARN", $rr->name .": invalid character(s) in name\n");
+            &printerr("WARN", $rr->name . ": invalid character(s) in name\n");
         }
         if ($rr->type eq "SOA") {
 	    print STDERR 's' if $opt_d;
-	    print "SOA=". $rr->mname ."	contact=". $rr->rname ."\n";
+	    print "SOA=" . $rr->mname . "	contact=" . $rr->rname . "\n";
 	    # basic address check.  No "@", and user.dom.ain (two or more dots)
 	    if (($rr->rname =~ /@/)||!($rr->rname =~ /\..*\./)) {
-		&printerr("WARN", "SOA contact name (". 
-		    $rr->rname .") is invalid\n");
+		&printerr("WARN", "SOA contact name (" . $rr->rname .
+			  ") is invalid\n");
 	    }
         } elsif ($rr->type eq "PTR") {
             print STDERR 'p' if $opt_d;
-            if (scalar((@keys=split(/\./,$rr->name))) == 6 ) {
+            @keys = split(/\./, $rr->name);
+            if (scalar(@keys) == 6 || scalar(@keys) == 34) {
+                $af = (scalar(@keys) == 6) ? AF_INET : AF_INET6;
                 # check if forward name exists, but only if reverse is
                 # a full IP addr
-                # skip ".0" networks
-                if ($keys[0] ne "0") {
-                   ($name, $aliases, $addrtype, $length,
-			    @addrs)=gethostbyname($rr->ptrdname);
-#                   if (!(($name, $aliases, $addrtype, $length,
-#			    @addrs)=gethostbyname($rr->ptrdname))) {
-#                        &printerr("FAIL", "gethostbyname(". 
-#			    $rr->ptrdname ."): $!\n");
-#                   }
-#                   else {
-                        if (!$name) {
-                            &printerr("WARN", $rr->name
-				." PTR ". $rr->ptrdname .": unknown host\n");
-                        }
-                        elsif (!&equal($name,$rr->ptrdname)) {
-                            &printerr("WARN", $rr->name 
-			      ." PTR ". $rr->ptrdname .": CNAME (to $name)\n");
-                        }    
-                        elsif (!&matchaddrlist($rr->name)) {
-                            &printerr("WARN", $rr->name
-			     ." PTR ". $rr->ptrdname .": A record not found\n");
-                        }
-#                   }
+                ($name, $aliases, $addrtype, $length, @addrs) =
+                    gethostbyname($rr->ptrdname);
+                if (!$name) {
+                    &printerr("WARN", $rr->name . " PTR " . $rr->ptrdname .
+			      ": unknown host\n");
+                }
+                elsif (!&equal($name,$rr->ptrdname)) {
+                    &printerr("WARN", $rr->name . " PTR " . $rr->ptrdname .
+			      ": CNAME (to $name)\n");
+                }    
+                elsif (!&matchaddrlist($rr->name)) {
+		    $t = ($af == AF_INET) ? "A" : "AAAA";
+                    &printerr("WARN", $rr->name . " PTR " . $rr->ptrdname .
+			      ": $t record not found\n");
                 }
             }
-        } elsif (($rr->type eq "A") ) {
+        } elsif ($rr->type eq "A" || $rr->type eq "AAAA") {
             print STDERR 'a' if $opt_d;
+	    $af = ($rr->type eq "A") ? AF_INET : AF_INET6;
 	    # check to see that a reverse PTR record exists
-            ($name,$aliases,$addrtype,$length,@addrs)=gethostbyaddr(pack('C4',
-		    split(/\./,$rr->address)),2);
+	    ($name, $aliases, $addrtype, $length, @addrs) =
+                gethostbyaddr(inet_pton($af, $rr->address), $af);
 	    if (!$name) {
 		# hack - allow RFC 1101 netmasks encoding
 		if ($rr->address !=~ /^255/) {
-		    &printerr("WARN", $rr->name ." A ".
-			$rr->address .": no PTR record\n");
+		    &printerr("WARN", $rr->name . " " . $rr->type . " " .
+                              $rr->address . ": no PTR record\n");
 		}
 	    }
 	    elsif ($opt_F && !&equal($name,$rr->name)) {
 		# Filter out "hostname-something" (like "neptune-le0")
 		if (index(split (/\./, $rr->name, 2) . "-", 
 			    split (/\./, $name, 2)) == -1 ) {
-			&printerr("WARN", $rr->name ." A ". 
-			    $rr->address .": points to $name\n") 
+			&printerr("WARN", $rr->name . " " . $rr->type . " " . 
+                                  $rr->address . ": points to $name\n") 
 			    if ((split(/\./,$name))[0] ne "localhost");
 		}
 	    }
@@ -244,8 +242,9 @@
 		}
 		elsif (($glues{$rr->address} eq $rr->name) &&
 			(!&equal($lastns,$domain))) {
-		    &printerr("WARN", $rr->name
-			.": possible duplicate A record (glue of $lastns?)\n");
+		    &printerr("WARN", $rr->name .
+			      ": possible duplicate " . $rr->type .
+			      " record (glue of $lastns?)\n");
 		}
 	    }
         } elsif ($rr->type eq "NS") {
@@ -254,69 +253,51 @@
             # check to see if object of NS is real
             &checklamer($rr->name,$rr->nsdname) if ($main'opt_l);
 	    # check for bogusnesses like NS->IP addr
-	    if (&isipv4addr($rr->nsdname)) {
-		&printerr("BAD", $rr->name
-			." NS ". $rr->nsdname .": Nameserver must be a hostname\n");
+	    if (&isipaddr($rr->nsdname)) {
+		&printerr("BAD", $rr->name . " NS " . $rr->nsdname .
+			  ": Nameserver must be a hostname\n");
 	    }
             ($name, $aliases, $addrtype, $length,
 		    @addrs)=gethostbyname($rr->nsdname);
-#            if (!(($name, $aliases, $addrtype, $length,
-#		    @addrs)=gethostbyname($rr->nsdname))) {
-#                &printerr("FAIL", "gethostbyname(". $rr->nsdname ."): $!\n");
-#            }
-#            else {
-                if (!$name) {
-                    &printerr("BAD", $rr->name
-			." NS ". $rr->nsdname .": unknown host\n");
-                } elsif (!&equal($name,$rr->nsdname)) {
-                    &printerr("BAD", $rr->name
-			." NS ". $rr->nsdname .": CNAME (to $name)\n");
-                }
-#            }
+            if (!$name) {
+                &printerr("BAD", $rr->name . " NS " . $rr->nsdname .
+			  ": unknown host\n");
+            } elsif (!&equal($name,$rr->nsdname)) {
+                &printerr("BAD", $rr->name . " NS " . $rr->nsdname .
+			  ": CNAME (to $name)\n");
+            }
         } elsif ($rr->type eq "MX") {
             print STDERR 'm' if $opt_d;
             # check to see if object of mx is real
-	    if (&isipv4addr($rr->exchange)) {
-		&printerr("BAD", $rr->name
-			." MX ". $rr->exchange .": Mail exchange must be a hostname\n");
+	    if (&isipaddr($rr->exchange)) {
+		&printerr("BAD", $rr->name . " MX " . $rr->exchange .
+			  ": Mail exchange must be a hostname\n");
 	    }
             ($name, $aliases, $addrtype, $length,
 		    @addrs)=gethostbyname($rr->exchange);
-#            if (!(($name, $aliases, $addrtype, $length,
-#		    @addrs)=gethostbyname($rr->exchange))) {
-#                &printerr("FAIL", "gethostbyname(". $rr->exchange ."): $!\n");
-#            }
-#            else {
-                if (!$name) {
-                    &printerr("WARN", $rr->name
-			." MX ". $rr->exchange .": unknown host\n");
-                }
-                elsif (!&equal($name,$rr->exchange)) {
-                    &printerr("WARN", $rr->name
-			." MX ". $rr->exchange .": CNAME (to $name)\n");
-                }
-#            }
+            if (!$name) {
+                &printerr("WARN", $rr->name . " MX " . $rr->exchange .
+			  ": unknown host\n");
+            }
+            elsif (!&equal($name,$rr->exchange)) {
+                &printerr("WARN", $rr->name . " MX " . $rr->exchange .
+			  ": CNAME (to $name)\n");
+            }
         } elsif ($rr->type eq "CNAME") {
             print STDERR 'c' if $opt_d;
             ($name, $aliases, $addrtype, $length,
 		    @addrs)=gethostbyname($rr->cname);
-	    if (&isipv4addr($rr->cname)) {
-		&printerr("BAD", $rr->name
-			." CNAME ". $rr->cname .": alias must be a hostname\n");
+	    if (&isipaddr($rr->cname)) {
+		&printerr("BAD", $rr->name . " CNAME " . $rr->cname .
+			  ": alias must be a hostname\n");
 	    }
-#            if (!(($name, $aliases, $addrtype, $length,
-#		    @addrs)=gethostbyname($rr->cname))) {
-#                &printerr("FAIL", "gethostbyname(". $rr->cname ."): $!\n");
-#            }
-#            else {
-                if (!$name) {
-                    &printerr("WARN", $rr->name
-			." CNAME ". $rr->cname .": unknown host\n");
-                } elsif (!&equal($name,$rr->cname)) {
-                    &printerr("WARN", $rr->name
-			." CNAME ". $rr->cname .": CNAME (to $name)\n");
-                }
-#            }
+            if (!$name) {
+                &printerr("WARN", $rr->name . " CNAME " . $rr->cname .
+			  ": unknown host\n");
+            } elsif (!&equal($name,$rr->cname)) {
+                &printerr("WARN", $rr->name . " CNAME " . $rr->cname .
+			  ": CNAME (to $name)\n");
+            }
         }
     }
     print STDERR "\n" if $opt_d;
@@ -353,17 +334,21 @@
     return ($one eq $two);
 }
 
-# check if argument looks like an IPv4 address
-sub isipv4addr {
-    my ($host)=$_[0];
-    my ($one,$two,$three,$four);
-    ($one,$two,$three,$four)=split(/\./,$host);
-    my $whole="$one$two$three$four";
-    # strings evaluated as numbers are zero
-    return (($whole+0) eq $whole);
+# check if argument looks like an IP address
+sub isipaddr {
+    my $ip = new Net::IP($_[0]) || return 0;
+    return $ip->version;
 }
 sub matchaddrlist {
-    local($match)=pack('C4', reverse(split(/\./,$_[0],4)));
+    local(@x) = reverse( split(/\./, $_[0]) );
+    shift @x;
+    local($arpatype) = shift @x;
+    if ($arpatype =~ /in-addr/i) {
+        $match = pack('C4', @x);
+    }
+    else {
+        $match = pack('H32', join('', @x));
+    }
     local($found)=0;
     foreach $i (@addrs) {
         $found=1 if ($i eq $match);
@@ -398,14 +383,14 @@
     my ($soa_req);
     my ($res) = new Net::DNS::Resolver;
     unless ($res->nameservers($nameserver)) {
-	&printerr("FAIL", "Cannot find address for nameserver: ".
-	    $res->errorstring. "\n");
+	&printerr("FAIL", "Cannot find address for nameserver: " .
+		  $res->errorstring . "\n");
     }
     $soa_req = $res->send($packet);
     unless (defined($soa_req)) {
 	&printerr("FAIL",
-	    "Cannot get SOA record for $zone from $nameserver (lame?): ".
-		$res->errorstring ."\n");
+		  "Cannot get SOA record for $zone from $nameserver (lame?): "
+		  . $res->errorstring . "\n");
 	return;
     }
     &printerr("BAD", "$zone NS $nameserver: lame NS delegation\n") 
openSUSE Build Service is sponsored by