my ($call, $conf, $here) = $field[$i] =~ /^(\S+) (\S) (\d)/o;
next unless $call && $conf && defined $here && is_callsign($call);
next if $call eq $main::mycall;
+
+ eph_del_regex("^PC17\^$call\^$ncall");
$conf = $conf eq '*';
$user->put;
}
+ if (eph_dup($line)) {
+ dbg("PCPROT: dup PC16 detected") if isdbg('chanerr');
+ return;
+ }
# queue up any messages (look for privates only)
DXMsg::queue_msg(1) if $self->state eq 'normal';
my $dxchan;
my $ncall = $field[2];
my $ucall = $field[1];
+
+ eph_del_regex("^PC16.*$ncall.*$ucall");
+
if ($ncall eq $main::mycall) {
dbg("PCPROT: trying to alter config on this node from outside!") if isdbg('chanerr');
return;
return unless $self->in_filter_route($parent);
my @rout = $parent->del_user($ucall);
+
+ if (eph_dup($line)) {
+ dbg("PCPROT: dup PC17 detected") if isdbg('chanerr');
+ return;
+ }
+
$self->route_pc17($parent, @rout) if @rout;
return;
}
my $conf = $field[$i+2];
my $ver = $field[$i+3];
next unless defined $here && defined $conf && is_callsign($call);
+
+ eph_del_regex("^PC(?:21\^$call|17\^[^\^]+\^$call)");
+
# check for sane parameters
$ver = 5000 if $ver eq '0000';
next if $ver < 5000; # only works with version 5 software
$user->put;
}
+ if (eph_dup($line)) {
+ dbg("PCPROT: dup PC19 detected") if isdbg('chanerr');
+ return;
+ }
+
$self->route_pc19(@rout) if @rout;
return;
}
if ($pcno == 21) { # delete a cluster from the list
my $call = uc $field[1];
+
+ eph_del_regex("^PC1[79].*$call");
+
my @rout;
my $parent = Route::Node::get($self->{call});
unless ($parent) {
dbg("PCPROT: I WILL _NOT_ be disconnected!") if isdbg('chanerr');
return;
}
+
+ if (eph_dup($line)) {
+ dbg("PCPROT: dup PC21 detected") if isdbg('chanerr');
+ return;
+ }
+
$self->route_pc21(@rout) if @rout;
return;
}
if ($pcno == 39) { # incoming disconnect
if ($field[1] eq $self->{call}) {
$self->disconnect(1);
+ eph_del_regex("^PC(?:1[679]|21).*$field[1]");
} else {
dbg("PCPROT: came in on wrong channel") if isdbg('chanerr');
}
my $to = $field[1];
my $from = $field[2];
my $flag = $field[3];
+
# is it for us?
if ($to eq $main::mycall) {
}
}
} else {
+ if (eph_dup($line)) {
+ dbg("PCPROT: dup PC51 detected") if isdbg('chanerr');
+ return;
+ }
# route down an appropriate thingy
$self->route($to, $line);
}
($filter, $hops) = $self->{spotsfilter}->it(@_);
return unless $filter;
}
- send_prot_line($self, $filter, $hops, $isolate, $line)
+ send_prot_line($self, $filter, $hops, $isolate, $line);
}
sub send_prot_line
return unless $routeit;
}
if ($filter) {
- $self->send($routeit) if $routeit;
+ $self->send($routeit);
} else {
$self->send($routeit) unless $self->{isolate} || $isolate;
}
$routeit = adjust_hops($self, $line); # adjust its hop count by node name
next unless $routeit;
}
- $self->send($routeit) if $self->{routefilter} || !$self->{isolate};
+ $self->send($routeit);
}
}
}
foreach $dxchan (@dxchan) {
next if $dxchan == $self;
next if $dxchan == $me;
- if ($dxchan->{routefilter} || !$self->{isolate}) {
- $dxchan->send_route($generate, @_)
+ if ($dxchan->{routefilter}) {
+ $dxchan->send_route($generate, @_);
} else {
- dbg('DXPROT: isolated') if isdbg('chanerr');
+ $dxchan->send_route($generate, @_) unless $self->{isolate} || $dxchan->{isolate};
}
}
}
return undef;
}
+sub eph_del_regex
+{
+ my $regex = shift;
+ my ($key, $val);
+ while (($key, $val) = each %eph) {
+ if ($key =~ m{$regex}) {
+ delete $eph{$key};
+ }
+ }
+}
+
sub eph_clean
{
my ($key, $val);