X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProtHandle.pm;h=9e0f5ec4adb111ccf81f159a6368049cce558926;hb=fee8c4eabda49d4c7440ce1075ea49dcd9c2e825;hp=e2e8e983998a75f2b137a313f9b043af65714a25;hpb=c6552c92e3a9e3741b68305bfc43124020b57c19;p=spider.git diff --git a/perl/DXProtHandle.pm b/perl/DXProtHandle.pm index e2e8e983..9e0f5ec4 100644 --- a/perl/DXProtHandle.pm +++ b/perl/DXProtHandle.pm @@ -405,6 +405,12 @@ sub handle_16 return; } + # isolate now means only accept stuff from this call only + if ($self->{isolate} && $ncall ne $self->{call}) { + dbg("PCPROT: $self->{call} isolated, $ncall ignored") if isdbg('chanerr'); + return; + } + my $parent = Route::Node::get($ncall); if ($parent) { @@ -503,6 +509,12 @@ sub handle_17 return; } + # isolate now means only accept stuff from this call only + if ($self->{isolate} && $ncall ne $self->{call}) { + dbg("PCPROT: $self->{call} isolated, $ncall ignored") if isdbg('chanerr'); + return; + } + RouteDB::delete($ncall, $self->{call}); my $uref = Route::User::get($ucall); @@ -684,6 +696,12 @@ sub handle_19 } } + # isolate now means only accept stuff from this call only + if ($self->{isolate} && $call ne $self->{call}) { + dbg("PCPROT: $self->{call} isolated, $call ignored") if isdbg('chanerr'); + next; + } + my $user = check_add_node($call); # if (eph_dup($genline)) { @@ -787,11 +805,16 @@ sub handle_21 eph_del_regex("^PC1[679].*$call"); # if I get a PC21 from the same callsign as self then ignore it - if ($call eq $self->call) { + if ($call eq $self->{call}) { dbg("PCPROT: self referencing PC21 from $self->{call}"); return; } + # for the above reason and also because of the check for PC21s coming + # in for self->call from outside being ignored further down + # we don't need any isolation code here, because we will never + # act on a PC21 with self->call in it. + RouteDB::delete($call, $self->{call}); my $parent = Route::Node::get($self->{call}); @@ -1410,7 +1433,7 @@ sub check_pc9x_t # the id on it is completely unreliable. Besides, only commands # originating on this box will go through this code... if ($parent->call ne $main::mycall) { - my $lastid = $parent->lastid->{$pc} || 0; + my $lastid = $parent->lastid || 0; if ($t < $lastid) { if ($t+86400-$lastid > $pc9x_past_age) { dbg("PCPROT: dup id on $t <= $lastid, ignored") if isdbg('chanerr'); @@ -1430,7 +1453,7 @@ sub check_pc9x_t } elsif ($create) { $parent = Route::Node->new($call); } - $parent->lastid->{$pc} = $t; + $parent->lastid($t) if $parent; return $parent; } @@ -1526,6 +1549,9 @@ sub handle_92 } } elsif ($sort eq 'A' || $sort eq 'D' || $sort eq 'C') { + # remember the last channel we arrived on + $parent->PC92C_dxchan($self->{call}) unless $self->{call} eq $parent->call; + # this is the main route section # here is where all the routes are created and destroyed @@ -1570,6 +1596,7 @@ sub handle_92 } $parent = check_pc9x_t($call, $t, 92) || return; $parent->via_pc92(1); + $parent->PC92C_dxchan($self->{call}); } } else { dbg("PCPROT: must be mycall or external node as first entry, ignored") if isdbg('chanerr'); @@ -1578,6 +1605,7 @@ sub handle_92 $parent->here(Route::here($here)); $parent->version($version) if $version && $version > $parent->version; $parent->build($build) if $build && $build > $parent->build; + $parent->PC92C_dxchan($self->{call}) unless $self->{call} eq $parent->call; shift @ent; } } @@ -1606,11 +1634,9 @@ sub handle_92 # we only reset obscounts on config records $oparent->reset_obs; - $oparent->PC92C_dxchan($self->{call}) unless $self->{call} eq $oparent->call; dbg("ROUTE: reset obscount on $pcall now " . $oparent->obscount) if isdbg('obscount'); if ($oparent != $parent) { $parent->reset_obs; - $parent->PC92C_dxchan($self->{call}) unless $self->{call} eq $parent->call; dbg("ROUTE: reset obscount on $parent->{call} now " . $parent->obscount) if isdbg('obscount'); } @@ -1685,7 +1711,8 @@ sub handle_93 return; } - # remember that we are converting PC10->PC93 + # remember that we are converting PC10->PC93 and self will be $main::me if it + # comes from us unless ($self->{do_pc9x}) { dbg("PCPROT: PC9x come in from non-PC9x node, ignored") if isdbg('chanerr'); return; @@ -1694,11 +1721,11 @@ sub handle_93 my $t = $_[2]; my $parent = check_pc9x_t($pcall, $t, 93, 1) || return; - my $to = $_[3]; - my $from = $_[4]; - my $via = $_[5]; + my $to = uc $_[3]; + my $from = uc $_[4]; + my $via = uc $_[5]; my $text = $_[6]; - my $onode = $_[7]; + my $onode = uc $_[7]; $onode = $pcall if @_ <= 8; # this is catch loops caused by bad software ... @@ -1723,7 +1750,9 @@ sub handle_93 return; } - if (is_callsign($to)) { + # if it is routeable then then treat it like a talk + my $ref = Route::get($to); + if ($ref) { # local talks my $dxchan; $dxchan = DXChannel::get($main::myalias) if $to eq $main::mycall; @@ -1741,34 +1770,30 @@ sub handle_93 } # convert to PC10 talks where appropriate - my $ref = Route::get($to); - if ($ref) { - # just go for the "best" one for now (rather than broadcast) - $dxchan = $ref->dxchan; + # just go for the "best" one for now (rather than broadcast) + $dxchan = $ref->dxchan; - # check it... - if (ref $dxchan && $dxchan->isa('DXChannel')) { - if ($dxchan->{do_pc9x}) { - $dxchan->send($line); - } else { - $dxchan->talk($from, $to, $via, $text, $onode); - } + # check it... + if (ref $dxchan && $dxchan->isa('DXChannel')) { + if ($dxchan->{do_pc9x}) { + $dxchan->send($line); } else { - dbg("ERROR: $to -> $dxchan is not a DXChannel! (convert to pc10)"); + $dxchan->talk($from, $to, $via, $text, $onode); } - return; + } else { + dbg("ERROR: $to -> $dxchan is not a DXChannel! (convert to pc10)"); } + return; - # otherwise, drop through and allow it to be broadcast - } elsif ($to eq '*' || uc $to eq 'SYSOP' || uc $to eq 'WX') { + } elsif ($to eq '*' || $to eq 'SYSOP' || $to eq 'WX') { # announces - my $sysop = uc $to eq 'SYSOP' ? '*' : ' '; - my $wx = uc $to eq 'WX' ? '1' : '0'; + my $sysop = $to eq 'SYSOP' ? '*' : ' '; + my $wx = $to eq 'WX' ? '1' : '0'; my $local = $via eq 'LOCAL' ? '*' : $via; $self->send_announce(1, pc12($from, $text, $local, $sysop, $wx, $pcall), $from, $local, $text, $sysop, $pcall, $wx, $via eq 'LOCAL' ? $via : undef); return if $via eq 'LOCAL'; - } else { + } elsif (!is_callsign($to) && $text =~ /^#\d+ /) { # chat messages to non-pc9x nodes $self->send_chat(1, pc12($from, $text, undef, $to, undef, $pcall), $from, '*', $text, $to, $pcall, '0'); }