+sub zone_server_addr ($$$$$) {
+ my ($addr,$name,$ww,$wwq,$is_soa) = @_;
+ my ($cg);
+ $addr_is_ok{$addr}= "$name ($wwq)"
+ if $is_soa || $cfg->{'s'} =~ m/u/;
+ foreach $cg (@conv_glueless) {
+ next unless has_suffix_of(".$name",".$cg");
+ zone_warning("nameserver [$addr] $name in serverless-glueless".
+ " namespace area $cg",
+ $ww);
+ }
+ zone_warning("configured as stealth but we [$addr] $name are published",
+ $ww)
+ if $cfg->{'s'} =~ m/u/ && grep { $_ eq $addr } @self_addr;
+ zone_warning("forbidden nameserver address [$addr] $name",$ww)
+ if grep { $_ eq $addr } @forbid_addr;
+
+ my ($name_is_self, $addr_is_self);
+ $name_is_self= grep { $_ eq $name }
+ @{ $cfg->{$is_soa ? 'self_soa' : 'self_ns'} };
+ $addr_is_self= grep { $_ eq $addr }
+ @{ $cfg->{'self_addr'} };
+ if ($name_is_self && !$addr_is_self) {
+ zone_warning("our name $name with wrong address [$addr]",$ww);
+ } elsif (!$name_is_self && $addr_is_self) {
+ zone_warning(($is_soa ? "SOA ORIGIN maps to" : "referral to").
+ " us [$addr] with wrong name $name",
+ $ww);
+ }
+ $delg_to_us=1 if $name_is_self;
+}
+
+sub zone_check_soa ($$$) {
+ my ($uaddr,$wa,$waq) = @_;
+ my ($lame,$origin,$got,$rcode,@soa_addrs,$soa_addr,$ww,$wwn);
+ verbose("checking service at [$uaddr] $waq");
+ $lame= 'dead or lame';
+ $ww= "[$uaddr] $wa";
+ dig(sub {
+ if ($dig_type eq 'flags:') {
+ $lame= $dig_rdata =~ m/ aa / ? '' : 'lame';
+ } elsif ($dig_type eq 'soa' && $dig_owner eq $zone && !$lame) {
+ die "several SOAs ? $ww" if defined $origin;
+ $got= $dig_rdata;
+ $got =~ m/^(\S+) \d+/ or die "$got ?";
+ $origin= $1;