improve the pc24 fix
[spider.git] / perl / DXProt.pm
index 3767145ca4277463ca60fe172db9b695f57b8320..52e7b3eda744774ad3e6f9ce673c4214d4e1faaa 100644 (file)
@@ -275,10 +275,8 @@ sub normal
        
 #      print join(',', @field), "\n";
                                                
-       # ignore any lines that don't start with PC
-       return if !$field[0] =~ /^PC/;
        
-       # process PC frames
+       # process PC frames, this will fail unless the frame starts PCnn
        my ($pcno) = $field[0] =~ /^PC(\d\d)/; # just get the number
        return unless $pcno;
        return if $pcno < 10 || $pcno > 99;
@@ -651,23 +649,27 @@ sub normal
                                if ($r) {
                                        my $ar;
                                        if ($call ne $parent->call) {
-                                               $ar = $parent->add($r);
-                                               push @rout, $ar if $ar;
+                                               if ($self->in_filter_route($r)) {
+                                                       $ar = $parent->add($call, $ver, $flags);
+                                                       push @rout, $ar if $ar;
+                                               } else {
+                                                       next;
+                                               }
                                        }
                                        if ($r->version ne $ver || $r->flags != $flags) {
                                                $r->version($ver);
-                                               $r->flags(Route::here($here)|Route::conf($conf));
+                                               $r->flags($flags);
                                                push @rout, $r unless $ar;
                                        }
                                } else {
                                        next if $call eq $main::mycall || $call eq $self->{call};
                                        
-                                       my $new = $parent->new($call, $ver, Route::here($here)|Route::conf($conf));
+                                       my $new = Route->new($call);          # throw away
                                    if ($self->in_filter_route($new)) {
-                                               $parent->add($new);
-                                               push @rout, $new;
+                                               my $r = $parent->add($call, $ver, $flags);
+                                               push @rout, $r;
                                        } else {
-                                               $new->del($parent);
+                                               next;
                                        }
                                }
 
@@ -781,15 +783,23 @@ sub normal
                
                if ($pcno == 24) {              # set here status
                        my $call = uc $field[1];
-                       my $ref = Route::Node::get($call);
-                       $ref->here($field[2]) if $ref;
-                       $ref = Route::User::get($call);
-                       $ref->here($field[2]) if $ref;
+                       my ($nref, $uref);
+                       $nref = Route::Node::get($call);
+                       $uref = Route::User::get($call);
+                       return unless $nref || $uref;   # if we don't know where they are, it's pointless sending it on
                        
-                       # input filter if required
-                       return unless $self->in_filter_route($ref);
-
-                       $self->route_pc24($ref, $field[3]) if $ref && !eph_dup($line);
+                       unless (eph_dup($line)) {
+                               if ($nref) {
+                                       $nref->here($field[2]);
+                                       return unless $self->in_filter_route($nref);
+                                       $self->route_pc24($nref, $field[3])
+                               }
+                               if ($uref) {
+                                       $uref->here($field[2]);
+                                       return unless $self->in_filter_route($uref);
+                                       $self->route_pc24($uref, $field[3]);
+                               }
+                       }
                        return;
                }
                
@@ -927,7 +937,7 @@ sub normal
                        }
                        $user->lastoper($main::systime);   # to cut down on excessive for/opers being generated
                        $user->put;
-                       my $ref = Route::get($call);
+                       my $ref = Route::get($call) || Route->new($call);
 
                        # input filter if required
                        return unless $self->in_filter_route($ref);
@@ -1444,7 +1454,7 @@ sub send_local_config
                # and are not themselves isolated, this to make sure that isolated nodes
         # don't appear outside of this node
                my @dxchan = grep { $_->call ne $main::mycall && $_->call ne $self->{call} } DXChannel::get_all_nodes();
-               @localnodes = map { Route::Node::get($_->{call}) or die "connot find node $_->{call}" } @dxchan if @dxchan;
+               @localnodes = map { my $r = Route::Node::get($_->{call}); $r ? $r : () } @dxchan if @dxchan;
                my @intcalls = map { $_->nodes } @localnodes if @localnodes;
                my $ref = Route::Node::get($self->{call});
                my @rnodes = $ref->nodes;
@@ -1483,7 +1493,7 @@ sub route
        # always send it down the local interface if available
        my $dxchan = DXChannel->get($call);
        unless ($dxchan) {
-               my $cl = Route::Node::get($call);
+               my $cl = Route::get($call);
                $dxchan = $cl->dxchan if $cl;
                if (ref $dxchan) {
                        if (ref $self && $dxchan eq $self) {
@@ -1792,7 +1802,7 @@ sub broadcast_route
        foreach $dxchan (@dxchan) {
                next if $dxchan == $self;
                next if $dxchan == $me;
-               if ($self->{routefilter} || !$self->{isolate}) {
+               if ($dxchan->{routefilter} || !$self->{isolate}) {
                        $dxchan->send_route($generate, @_) 
                } else {
                        dbg('DXPROT: isolated') if isdbg('chanerr');