#!/afs/athena/contrib/perl/perl

# original Id: resolv_axfr.pl,v 1.3 92/11/29 22:06:29 marc Exp

if (! @ARGV) {
    print "\nusage: $0 [-d] [-r] [-a] [-hr] domain [ns]\n";
    print "   -d    enter debug mode\n";
    print "   -r    use nameserver `ns' directly [default is to use `ns' to look up\n";
    print "           the default nameserver for `domain']\n";
    print "   -a    explicitly resolve nameserver name into IP address\n";
    print "   -hr   shorthand for `-a domain 161.53.3.7'\n\n";
}

unshift(@INC,"/afs/athena.mit.edu/user/m/a/marc/perl");

require 'resolv.pl';

$dom = shift(@ARGV);

while ($dom =~ /^-/) {
    if ($dom eq "-d") {
	$debug = &RES_DEBUG;
    }
    elsif ($dom eq "-r") {
	die "`-r' and `-a' options are mutually exclusive" if $aresolv;
	$direct = 1;
    }
    elsif ($dom eq "-hr") {
	die "`-r' and `-a' options are mutually exclusive" if $direct;
	$defserv = "161.53.3.7";
	$aresolv = 1;
    }
    elsif ($dom eq "-a") {
	die "`-r' and `-a' options are mutually exclusive" if $direct;
	$aresolv = 1;
    }
    else {
	print "$dom: not one of -d -r -a -hr\n";
	die "argument syntax wrong";
    }
    $dom = shift(@ARGV) || die "argument syntax wrong (realm missing)"
}

if (@ARGV) { $defserv = shift(@ARGV); }

if (@ARGV) {
    print "\nusage: $0 [-d] [-r] [-a] [-hr] domain [ns]\n";
    print "   -d    enter debug mode\n";
    print "   -r    use nameserver `ns' directly [default is to use `ns' to look up\n";
    print "           the default nameserver for `domain']\n";
    print "   -a    explicitly resolve nameserver name into IP address\n";
    print "   -hr   shorthand for `-a domain 161.53.3.7'\n\n";
    die "argument syntax wrong";
}

if (! $direct) {
    if ($defserv) {
	$ns = &res_open($defserv);
    }
    else {
	$ns = &res_open;
    }

    $q = &res_mkquery($dom,"NS","IN");
    @ans = &res_send($ns,$q);
    die "Error finding nameserver: $ans[3]\n" if $ans[3];
    print "::: ",join(":",@ans),"\n";

    $domainname = (split(/ /,$ans[$ans[6]]))[4];

    if (! $domainname) {
	die "No domain server for domain $dom\n";
    }
    $domainsrv = $domainname;

    if ($aresolv) {
	$q = &res_mkquery($domainname,"A","IN");
	@ans = &res_send($ns,$q);
	die "Error finding address: $ans[3]\n" if $ans[3];
	print "::: ",join(":",@ans),"\n";

	$domainaddr = (split(/ /,$ans[$ans[6]]))[4];

	if (! $domainaddr) {
	    die "No IP address for host $domainaddr\n";
	}
	$domainsrv = $domainaddr;
    }
}
else {
    if (! $defserv) {
	print "`-r' option requires a nameserver\n";
	die "argument syntax wrong";
    }
    $domainsrv = $defserv;
}

print "&&& Using server $domainsrv ";
print "($domainname) " if $domainaddr;
print "for domain $dom\n\n";

$res'options |= &RES_USEVC | &RES_STAYOPEN | $debug;

$ns = &res_open($domainsrv);
$q = &res_mkquery($dom,"AXFR","IN");

@ans = &res_send($ns, $q);
die "Error in domain transfer: $ans[3]\n" if $ans[3];
print "::: ",join(":",@ans),"\n";

print "*",join("\n",@ans[$ans[6]..($ans[6]+$ans[7]+$ans[9]+$ans[11]-1)]),"\n";

@ans = &res_send($ns, "");
print "::: ",join(":",@ans),"\n";
while($ans[5] == 0) {
    print "*",join("\n",@ans[$ans[6]..($ans[6]+$ans[7]-1)]),"\n";
    @ans = &res_send($ns, "");
    print "::: ",join(":",@ans),"\n"
}


