fix some errors in sh/c
[spider.git] / perl / DXProt.pm
index f68edc275bde45c1afe95bb67346136bcda02d76..60b0f1e6be9eec8c6ca340f5d871be739e0b45ea 100644 (file)
@@ -38,12 +38,13 @@ use strict;
 
 use vars qw($VERSION $BRANCH);
 $VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ );
-$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ ) || 0;
+$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/  || (0,0));
 $main::build += $VERSION;
 $main::branch += $BRANCH;
 
 use vars qw($pc11_max_age $pc23_max_age $last_pc50 $eph_restime $eph_info_restime $eph_pc34_restime
                        $last_hour $last10 %eph  %pings %rcmds $ann_to_talk
+                       $pingint $obscount
                        %nodehops $baddx $badspotter $badnode $censorpc $rspfcheck
                        $allowzero $decode_dk0wcy $send_opernam @checklist);
 
@@ -65,6 +66,8 @@ $rspfcheck = 1;
 $eph_restime = 180;
 $eph_info_restime = 60*60;
 $eph_pc34_restime = 30;
+$pingint = 5*60;
+$obscount = 2;
 
 @checklist = 
 (
@@ -185,21 +188,8 @@ sub check
 
 sub init
 {
-       my $user = DXUser->get($main::mycall);
-       $DXProt::myprot_version += $main::version*100;
-       $main::me = DXProt->new($main::mycall, 0, $user); 
-       $main::me->{here} = 1;
-       $main::me->{state} = "indifferent";
        do "$main::data/hop_table.pl" if -e "$main::data/hop_table.pl";
        confess $@ if $@;
-       $main::me->{sort} = 'S';    # S for spider
-       $main::me->{priv} = 9;
-       $main::me->{metric} = 0;
-       $main::me->{pingave} = 0;
-       $main::me->{version} = $main::version;
-       $main::me->{build} = $main::build;
-               
-#      $Route::Node::me->adddxchan($main::me);
 }
 
 #
@@ -268,9 +258,9 @@ sub start
        
        # ping neighbour node stuff
        my $ping = $user->pingint;
-       $ping = 5*60 unless defined $ping;
+       $ping = $pingint unless defined $ping;
        $self->{pingint} = $ping;
-       $self->{nopings} = $user->nopings || 2;
+       $self->{nopings} = $user->nopings || $obscount;
        $self->{pingtime} = [ ];
        $self->{pingave} = 999;
        $self->{metric} ||= 100;
@@ -278,7 +268,7 @@ sub start
 
        # send initialisation string
        unless ($self->{outbound}) {
-               $self->send(pc18());
+               $self->sendinit;
        }
        
        $self->state('init');
@@ -292,6 +282,16 @@ sub start
        $script->run($self) if $script;
 }
 
+#
+# send outgoing 'challenge'
+#
+
+sub sendinit
+{
+       my $self = shift;
+       $self->send(pc18());
+}
+
 #
 # This is the normal pcxx despatcher
 #
@@ -474,7 +474,7 @@ sub normal
                        # this goes after the input filtering, but before the add
                        # so that if it is input filtered, it isn't added to the dup
                        # list. This allows it to come in from a "legitimate" source
-                       if (Spot::dup($field[1], $field[2], $d, $field[5])) {
+                       if (Spot::dup($field[1], $field[2], $d, $field[5], $field[6])) {
                                dbg("PCPROT: Duplicate Spot ignored\n") if isdbg('chanerr');
                                return;
                        }
@@ -628,6 +628,12 @@ sub normal
                        my $ncall = $field[1];
                        my $newline = "PC16^";
                        
+                       # do I want users from this channel?
+                       unless ($self->user->wantpc16) {
+                               dbg("PCPROT: don't send users to $self->{call}") if isdbg('chanerr');
+                               return;
+                       }
+                       # is it me?
                        if ($ncall eq $main::mycall) {
                                dbg("PCPROT: trying to alter config on this node from outside!") if isdbg('chanerr');
                                return;
@@ -702,6 +708,11 @@ sub normal
 
                        eph_del_regex("^PC16\\^$ncall.*$ucall");
                        
+                       # do I want users from this channel?
+                       unless ($self->user->wantpc16) {
+                               dbg("PCPROT: don't send users to $self->{call}") if isdbg('chanerr');
+                               return;
+                       }
                        if ($ncall eq $main::mycall) {
                                dbg("PCPROT: trying to alter config on this node from outside!") if isdbg('chanerr');
                                return;
@@ -1081,7 +1092,7 @@ sub normal
 
                        # add this station to the user database, if required
                        my $user = DXUser->get_current($call);
-                       $user = DXUser->new($call) if !$user;
+                       $user = DXUser->new($call) unless $user;
                        
                        if ($field[2] == 1) {
                                $user->name($field[3]);
@@ -1252,24 +1263,6 @@ sub normal
                        return;
                }
                if ($pcno == 90) {              # new style PC16,17,19,21
-                       my $node = $field[1];
-
-                       # mark this node as wanting PC90s
-                       my $parent = Route::Node::get($node);
-                       if ($parent) {
-                               my $t = hex $field[2];
-                               my $last = $parent->lastpc90 || 0;
-                               if ($last < $t) {
-                                       $parent->pc90(1);
-                                       $parent->lastpc90($t); 
-                                       my ($updsort, $n) = unpack "AA*", $field[3];
-                                       for (my $i = 4; $i < $#field; $i++) {
-                                               my ($sort, $flag, $node, $ping) = $field[$i] =~ m{(\w)(\d)([-\w+])(,\d+)?};
-                                               $ping /= 10 if (defined $ping); 
-                                       }
-                               }
-                       }
-                       
                        return;
                }
        }
@@ -1314,11 +1307,7 @@ sub process
                next if $dxchan == $main::me;
 
                # send the pc50 or PC90
-               if ($pc50s && $dxchan->user->wantpc90) {
-                       $dxchan->send_route(\&pc90, 1, $main::me, 'T', @dxchan);
-               } else {
-                       $dxchan->send($pc50s) if $pc50s;
-               }
+               $dxchan->send($pc50s) if $pc50s;
                
                # send a ping out on this channel
                if ($dxchan->{pingint} && $t >= $dxchan->{pingint} + $dxchan->{lastping}) {
@@ -1523,24 +1512,27 @@ sub send_announce
 
        # obtain country codes etc 
        my ($ann_dxcc, $ann_itu, $ann_cq, $org_dxcc, $org_itu, $org_cq) = (0..0);
+       my ($ann_state, $org_state) = ("", "");
        my @dxcc = Prefix::extract($_[0]);
        if (@dxcc > 0) {
                $ann_dxcc = $dxcc[1]->dxcc;
                $ann_itu = $dxcc[1]->itu;
                $ann_cq = $dxcc[1]->cq;                                         
+               $ann_state = $dxcc[1]->state;
        }
        @dxcc = Prefix::extract($_[4]);
        if (@dxcc > 0) {
                $org_dxcc = $dxcc[1]->dxcc;
                $org_itu = $dxcc[1]->itu;
                $org_cq = $dxcc[1]->cq;                                         
+               $org_state = $dxcc[1]->state;
        }
 
        if ($self->{inannfilter}) {
                my ($filter, $hops) = 
                        $self->{inannfilter}->it(@_, $self->{call}, 
                                                                         $ann_dxcc, $ann_itu, $ann_cq,
-                                                                        $org_dxcc, $org_itu, $org_cq);
+                                                                        $org_dxcc, $org_itu, $org_cq, $ann_state, $org_state);
                unless ($filter) {
                        dbg("PCPROT: Rejected by input announce filter") if isdbg('chanerr');
                        return;
@@ -1584,7 +1576,7 @@ sub announce
 sub send_local_config
 {
        my $self = shift;
-       my $n;
+       my $node;
        my @nodes;
        my @localnodes;
        my @remotenodes;
@@ -1603,24 +1595,25 @@ sub send_local_config
                my @intcalls = map { $_->nodes } @localnodes if @localnodes;
                my $ref = Route::Node::get($self->{call});
                my @rnodes = $ref->nodes;
-               for my $n (@intcalls) {
-                       push @remotenodes, Route::Node::get($n) unless grep $n eq $_, @rnodes;
+               for my $node (@intcalls) {
+                       push @remotenodes, Route::Node::get($node) unless grep $node eq $_, @rnodes;
                }
                unshift @localnodes, $main::routeroot;
        }
        
 
-       send_route($self, \&pc19, scalar(@localnodes)+scalar(@remotenodes), @localnodes, @remotenodes);
+       $self->send_route(\&pc19, scalar(@localnodes)+scalar(@remotenodes), @localnodes, @remotenodes);
        
        # get all the users connected on the above nodes and send them out
-       foreach $n (@localnodes, @remotenodes) {
-               if ($n) {
-                       send_route($self, \&pc16, 1, $n, map {my $r = Route::User::get($_); $r ? ($r) : ()} $n->users);
+       foreach $node (@localnodes, @remotenodes) {
+               if ($node) {
+                       $self->send_route(\&pc16, 1, $node, 
+                                                         map {my $r = Route::User::get($_); $r ? ($r) : ()} $node->users)
+                               if $self->user->wantsendpc16;
                } else {
                        dbg("sent a null value") if isdbg('chanerr');
                }
        }
-       $self->send_route(\&pc90, 1, $main::me, 'T', DXChannel::get_all()) if $self->user->wantpc90;
 }
 
 #
@@ -1713,7 +1706,7 @@ sub load_hops
        return $self->msg('lh1') unless -e "$main::data/hop_table.pl";
        do "$main::data/hop_table.pl";
        return $@ if $@;
-       return 0;
+       return ();
 }
 
 
@@ -1901,7 +1894,7 @@ sub send_route
                if (!$self->{isolate} && $self->{routefilter}) {
                        $filter = undef;
                        if ($r) {
-                               ($filter, $hops) = $self->{routefilter}->it($self->{call}, $self->{dxcc}, $self->{itu}, $self->{cq}, $r->call, $r->dxcc, $r->itu, $r->cq);
+                               ($filter, $hops) = $self->{routefilter}->it($self->{call}, $self->{dxcc}, $self->{itu}, $self->{cq}, $r->call, $r->dxcc, $r->itu, $r->cq, $self->{state}, $r->{state});
                                if ($filter) {
                                        push @rin, $r;
                                } else {
@@ -1940,6 +1933,9 @@ sub broadcast_route
                foreach $dxchan (@dxchan) {
                        next if $dxchan == $self;
                        next if $dxchan == $main::me;
+                       next if $dxchan->user->wantnp;
+                       next if ($generate == \&pc16 || $generate==\&pc17) && !$dxchan->user->wantsendpc16;
                        $dxchan->send_route($generate, @_);
                }
        }
@@ -1948,12 +1944,14 @@ sub broadcast_route
 sub route_pc16
 {
        my $self = shift;
+       return unless $self->user->wantpc16;
        broadcast_route($self, \&pc16, 1, @_);
 }
 
 sub route_pc17
 {
        my $self = shift;
+       return unless $self->user->wantpc16;
        broadcast_route($self, \&pc17, 1, @_);
 }
 
@@ -2000,7 +1998,7 @@ sub in_filter_route
        my ($filter, $hops) = (1, 1);
        
        if ($self->{inroutefilter}) {
-               ($filter, $hops) = $self->{inroutefilter}->it($self->{call}, $self->{dxcc}, $self->{itu}, $self->{cq}, $r->call, $r->dxcc, $r->itu, $r->cq);
+               ($filter, $hops) = $self->{inroutefilter}->it($self->{call}, $self->{dxcc}, $self->{itu}, $self->{cq}, $r->call, $r->dxcc, $r->itu, $r->cq, $self->state, $r->state);
                dbg("PCPROT: $self->{call}/" . $r->call . ' rejected by in_filter_route') if !$filter && isdbg('chanerr');
        }
        return $filter;