X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProt.pm;h=7dc55189d6d4b349eccfb9dc1b8653a8952605c4;hb=64b4171276c84a8df58776608dd9f568adef27b2;hp=a16789c7e31a5ee94e8353be9996265e790e92c5;hpb=8942c27356acc5d5f5a20134461bcf7e6bd6a044;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index a16789c7..7dc55189 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -234,14 +234,22 @@ sub normal my $dxchan; # send it if it isn't the except list and isn't isolated and still has a hop count + # taking into account filtering and so on foreach $dxchan (@dxchan) { next if $dxchan == $self; - my $routeit = adjust_hops($dxchan, $line); # adjust its hop count by node name - my $filter = Filter::it($dxchan->{spotfilter}, @spot) if $dxchan->{spotfilter}; + my $routeit; + my ($filter, $hops) = Filter::it($dxchan->{spotfilter}, @spot, $self->{call} ) if $dxchan->{spotfilter}; + if ($hops) { + $routeit = $line; + $routeit =~ s/\^H\d+\^\~$/\^H$hops\^\~/; + } else { + $routeit = adjust_hops($dxchan, $line); # adjust its hop count by node name + next unless $routeit; + } if ($filter) { $dxchan->send($routeit) if $routeit; } else { - $dxchan->send($routeit) unless $dxchan->{isolate} || !$routeit; + $dxchan->send($routeit) unless $dxchan->{isolate} || $self->{isolate}; } } @@ -396,6 +404,7 @@ sub normal # queue mail DXMsg::queue_msg(0); + return; } @@ -708,27 +717,32 @@ sub send_local_config my $self = shift; my $n; my @nodes; - + my @localnodes; + my @remotenodes; + # send our nodes if ($self->{isolate}) { - @nodes = (DXCluster->get_exact($main::mycall)); + @localnodes = (DXCluster->get_exact($main::mycall)); } else { # create a list of all the nodes that are not connected to this connection # and are not themselves isolated, this to make sure that isolated nodes # don't appear outside of this node - @nodes = DXNode::get_all(); + @nodes = DXNode::get_all(); @nodes = grep { $_->dxchan != $self } @nodes; - @nodes = grep { !($_->dxchan && $_->dxchan->isolate) } @nodes; + @nodes = grep { $_->{call} ne $main::mycall } @nodes; + @localnodes = grep { $_->dxchan->{call} eq $_->{call} && !$_->dxchan->{isolate} } @nodes if @nodes; + unshift @localnodes, DXCluster->get_exact($main::mycall); + @remotenodes = grep { $_->dxchan->{call} ne $_->{call} } @nodes if @nodes; } - my @s = $me->pc19(@nodes); + my @s = $me->pc19(@localnodes, @remotenodes); for (@s) { my $routeit = adjust_hops($self, $_); $self->send($routeit) if $routeit; } # get all the users connected on the above nodes and send them out - foreach $n (@nodes) { + foreach $n (@localnodes, @remotenodes) { my @users = values %{$n->list}; my @s = pc16($n, @users); for (@s) { @@ -759,7 +773,8 @@ sub route } } -# broadcast a message to all clusters [except those mentioned after buffer] +# broadcast a message to all clusters taking into account isolation +# [except those mentioned after buffer] sub broadcast_ak1a { my $s = shift; # the line to be rebroadcast @@ -775,6 +790,23 @@ sub broadcast_ak1a } } +# broadcast a message to all clusters ignoring isolation +# [except those mentioned after buffer] +sub broadcast_all_ak1a +{ + my $s = shift; # the line to be rebroadcast + my @except = @_; # to all channels EXCEPT these (dxchannel refs) + my @dxchan = get_all_ak1a(); + my $dxchan; + + # send it if it isn't the except list and isn't isolated and still has a hop count + foreach $dxchan (@dxchan) { + next if grep $dxchan == $_, @except; + my $routeit = adjust_hops($dxchan, $s); # adjust its hop count by node name + $dxchan->send($routeit); + } +} + # broadcast to all users # storing the spot or whatever until it is in a state to receive it sub broadcast_users @@ -807,7 +839,7 @@ sub broadcast_list if ($sort eq 'dx') { next unless $dxchan->{dx}; - $filter = Filter::it($dxchan->{spotfilter}, @{$fref}) if ref $fref; + ($filter) = Filter::it($dxchan->{spotfilter}, @{$fref}) if ref $fref; next unless $filter; } next if $sort eq 'ann' && !$dxchan->{ann};