From: ijackson Date: Wed, 8 Sep 1999 17:13:58 +0000 (+0000) Subject: Overlap works now. X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=b8f5b5f74a29ac6ca6c053c05381878ffad5f1fc;p=bcp5-registry.git Overlap works now. --- diff --git a/bcp5-registry.pl b/bcp5-registry.pl index b22f300..ab1e3f5 100755 --- a/bcp5-registry.pl +++ b/bcp5-registry.pl @@ -381,16 +381,16 @@ sub pick_net () { $_= $in{'specsize'}; if (m/\d+/) { - $specsize= $&+0; - $vn= "pick${specsize}check"; $$vn= 'checked'; + $pick_prefix= $&+0; + $vn= "pick${pick_prefix}check"; $$vn= 'checked'; } elsif (m/prefix|subnet/) { $which= $&; $vn= "pickvar${which}check"; $$vn= 'checked'; - $specsize= $in{"pickvar${which}"}; - $specsize =~ m/\d+/ or finish_error('badsize'); - $specsize= $&+0; - ($specsize >= 0 && $specsize <= 32) or finish_error('badsize'); - $specsize= 32-$specsize if $which eq 'subnet'; + $pick_prefix= $in{"pickvar${which}"}; + $pick_prefix =~ m/\d+/ or finish_error('badsize'); + $pick_prefix= $&+0; + ($pick_prefix >= 0 && $pick_prefix <= 32) or finish_error('badsize'); + $pick_prefix= 32-$pick_prefix if $which eq 'subnet'; } else { die "$_ ?"; } @@ -398,27 +398,27 @@ sub pick_net () { $network= $area_networks[$ai]; $prefix= $area_prefixes[$ai]; $net= display_net($network,$prefix); - ($specsize >= $prefix) or finish_error('wrongsize'); + ($pick_prefix >= $prefix) or finish_error('wrongsize'); $fixmask= get_mask($prefix); - $mask= get_mask($specsize); + $mask= get_mask($pick_prefix); $rnybs= randnybs(8); $rand= hex($rnybs); $value= hex($network) | ($rand & ($mask & ~$fixmask)); - $vhex= sprintf '%08x',$value; + $pick_network= sprintf '%08x',$value; - $net= display_net($vhex,$specsize); + $net= display_net($pick_network,$pick_prefix); $displayemail= 1; -printf DEBUG "picking network=$network prefix=$prefix net=$net specsize=$specsize\n"; +printf DEBUG "picking network=$network prefix=$prefix net=$net pick_prefix=$pick_prefix\n"; printf DEBUG "picking rnybs=%s fixmask=%08x mask=%08x rand=%08x ". - "value=%08x vhex=%s net=%s\n", - $rnybs,$fixmask,$mask,$rand,$value,$vhex,$net; + "value=%08x pick_network=%s net=%s\n", + $rnybs,$fixmask,$mask,$rand,$value,$pick_network,$net; $ent= { }; $db{'picked'}= $ent; - $ent->{'network'}= $vhex; - $ent->{'prefix'}= $specsize; + $ent->{'network'}= $pick_network; + $ent->{'prefix'}= $pick_prefix; $list_areai= $ai; list_database('area'); } diff --git a/listdb.pl b/listdb.pl index 91eee9c..de389fe 100644 --- a/listdb.pl +++ b/listdb.pl @@ -28,6 +28,8 @@ print DEBUG "ldb 1 $v @kl\n"; foreach $k (keys %db) { print DEBUG "ldb q $k\n"; $ent= $db{$k}; + $dblt_network= $ent->{'network'}; + $dblt_prefix= $ent->{'prefix'}; next unless &{"dblist_cond_$listing"}; push @kl,$k; } @@ -52,32 +54,18 @@ sub dblist_prep_all { } sub dblist_cond_all { 1; } sub dblist_prep_area { - my ($network,$prefix); - $network= $area_networks[$list_areai]; - $prefix= $area_prefixes[$list_areai]; - $listarea= display_net($network,$prefix); - $dbl_mask= get_mask($prefix); - $dbl_value= hex($network); -} -sub dblist_cond_area { - my ($v, $r); - $v= hex($ent->{'network'}); - $r= 1 if ($v & $dbl_mask) == $dbl_value; -print DEBUG "dblist_cond_area $k $v $r\n"; - return $r; + $dblo_network= $area_networks[$list_areai]; + $dblo_prefix= $area_prefixes[$list_areai]; + $listarea= display_net($dblo_network,$dblo_prefix); } +sub dblist_cond_area { dblist_cond_overlap(); } sub dblist_prep_overlap { - my ($network,$prefix); - ($network,$prefix,$dbl_mask,$dbl_value) = parse_netrange($in{'with'}); - $listoverlap= display_net($network,$prefix); + ($dblo_network,$dblo_prefix) = parse_netrange($in{'with'}); + $listoverlap= display_net($dblo_network,$dblo_prefix); } sub dblist_cond_overlap { - my ($v, $m); - $v= hex($ent->{'network'}); - $m= get_mask($ent->{'prefix'}); - $m &= $dbl_mask; - return ($v & $m) == ($dbl_value & $m); + return net_overlap($dblt_network,$dblt_prefix, $dblo_network,$dblo_prefix); } sub foreach_start_db { $db_i=0; } @@ -87,13 +75,18 @@ sub foreach_setvars_db { my ($k, $ent); $k= $kl[$db_i]; $ent= $db{$k}; + $dblt_network= $ent->{'network'}; + $dblt_prefix= $ent->{'prefix'}; $db_picked= $k eq 'picked'; if ($db_picked) { undef $db_id; } else { $db_id= $k; } - $db_net= display_net($ent->{'network'}, $ent->{'prefix'}); + $db_net= display_net($dblt_network,$dblt_prefix); + $db_pickoverlap= (exists $db{'picked'} && + net_overlap($dblt_network, $dblt_prefix, + $pick_network, $pick_prefix)) ? 1 : 0; $db_name= html_sani($ent->{'name'}); $db_contact= html_sani($ent->{'contact'}); $db_hiddenemail= $ent->{'hiddenemail'}; diff --git a/networks.pl b/networks.pl index 7d64551..e1dc49c 100644 --- a/networks.pl +++ b/networks.pl @@ -52,6 +52,17 @@ sub net_subset ($$$$) { return 1; } +sub net_overlap ($$$$) { + my ($an,$ap, $bn,$bp) = @_; + my ($av,$am,$bv,$bm, $tm,$r); + ($av,$am) = net_valuemask($an,$ap); + ($bv,$bm) = net_valuemask($bn,$bp); + $tm= $am & $bm; + $r= (($av & $tm) == ($bv & $tm)) ? 1 : 0; +printf DEBUG "overlap %s/%s %s/%s %d\n", $an,$ap, $bn,$bp, $r; + return $r; +} + sub get_mask ($) { my ($prefix) = @_; my ($m, $sh); diff --git a/template.html b/template.html index ff8b4ad..293e9cd 100644 --- a/template.html +++ b/template.html @@ -501,6 +501,8 @@ Database for entries allocated from @@@listarea@@@ @@@if:picked@@@ The range picked for you has been emphasized below. +Any existing registrations that overlap with it are also emphasized, +and marked with an asterisk *. @@@endif:@@@

@@ -522,7 +524,15 @@ range; this can also be used to modify it. @@@ifnot:db_picked@@@ -@@@db_net@@@ + + +@@@if:db_pickoverlap@@@ + +@@@endif:@@@ +@@@db_net@@@ +@@@if:db_pickoverlap@@@ +* +@@@endif:@@@ @@@db_name@@@ @@@db_contact@@@