projects
/
spider.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
added routing for PC26/27 and also put the correct callsign on the end
[spider.git]
/
perl
/
DXProt.pm
diff --git
a/perl/DXProt.pm
b/perl/DXProt.pm
index 5bda044a045644a3a8687c2ff4e36828c9958bec..aa848eb72eabca27461d215621a02f46e95db387 100644
(file)
--- a/
perl/DXProt.pm
+++ b/
perl/DXProt.pm
@@
-116,8
+116,9
@@
sub start
$self->{wwvfilter} = Filter::read_in('wwv', $call);
$self->{annfilter} = Filter::read_in('ann', $call);
$self->{wwvfilter} = Filter::read_in('wwv', $call);
$self->{annfilter} = Filter::read_in('ann', $call);
- # set unbuffered
+ # set unbuffered
and no echo
$self->send_now('B',"0");
$self->send_now('B',"0");
+ $self->send_now('E',"0");
# send initialisation string
if (!$self->{outbound}) {
# send initialisation string
if (!$self->{outbound}) {
@@
-177,6
+178,14
@@
sub normal
}
if ($pcno == 11 || $pcno == 26) { # dx spot
}
if ($pcno == 11 || $pcno == 26) { # dx spot
+
+ # route 'foreign' pc26s
+ if ($pcno == 26) {
+ if ($field[7] ne $main::mycall) {
+ route($field[7], $line);
+ return;
+ }
+ }
# if this is a 'nodx' node then ignore it
last SWITCH if grep $field[7] =~ /^$_/, @DXProt::nodx_node;
# if this is a 'nodx' node then ignore it
last SWITCH if grep $field[7] =~ /^$_/, @DXProt::nodx_node;
@@
-304,8
+313,12
@@
sub normal
if ($pcno == 16) { # add a user
my $node = DXCluster->get_exact($field[1]);
if ($pcno == 16) { # add a user
my $node = DXCluster->get_exact($field[1]);
- last SWITCH if !$node; # ignore if havn't seen a PC19 for this one yet
- last SWITCH unless $node->isa('DXNode');
+ return unless $node; # ignore if havn't seen a PC19 for this one yet
+ return unless $node->isa('DXNode');
+ if ($node->dxchan != $self) {
+ dbg('chan', "LOOP: come in on wrong channel");
+ return;
+ }
my $i;
my $i;
@@
-325,7
+338,7
@@
sub normal
$user = DXUser->new($call) if !$user;
$user->homenode($node->call) if !$user->homenode;
$user->node($node->call);
$user = DXUser->new($call) if !$user;
$user->homenode($node->call) if !$user->homenode;
$user->node($node->call);
- $user->lastin($main::systime);
+ $user->lastin($main::systime)
unless DXChannel->get($call)
;
$user->put;
}
$user->put;
}
@@
-335,7
+348,13
@@
sub normal
}
if ($pcno == 17) { # remove a user
}
if ($pcno == 17) { # remove a user
-
+ my $node = DXCluster->get_exact($field[2]);
+ return unless $node;
+ return unless $node->isa('DXNode');
+ if ($node->dxchan != $self) {
+ dbg('chan', "LOOP: come in on wrong channel");
+ return;
+ }
my $ref = DXCluster->get_exact($field[1]);
$ref->del() if $ref;
last SWITCH;
my $ref = DXCluster->get_exact($field[1]);
$ref->del() if $ref;
last SWITCH;
@@
-357,7
+376,12
@@
sub normal
my $ver = $field[$i+3];
# now check the call over
my $ver = $field[$i+3];
# now check the call over
- next if DXCluster->get_exact($call); # we already have this
+ my $node = DXCluster->get_exact($call);
+ if ($node && $node->dxchan != $self) {
+ dbg('chan', "LOOP: come in on wrong channel");
+ return;
+ }
+ next if $node; # we already have this
# check for sane parameters
next if $ver < 5000; # only works with version 5 software
# check for sane parameters
next if $ver < 5000; # only works with version 5 software
@@
-378,7
+402,7
@@
sub normal
$user->homenode($call);
$user->node($call);
}
$user->homenode($call);
$user->node($call);
}
- $user->lastin($main::systime);
+ $user->lastin($main::systime)
unless DXChannel->get($call)
;
$user->put;
}
$user->put;
}
@@
-401,8
+425,17
@@
sub normal
if ($pcno == 21) { # delete a cluster from the list
my $call = uc $field[1];
if ($call ne $main::mycall) { # don't allow malicious buggers to disconnect me!
if ($pcno == 21) { # delete a cluster from the list
my $call = uc $field[1];
if ($call ne $main::mycall) { # don't allow malicious buggers to disconnect me!
- my $ref = DXCluster->get_exact($call);
- $ref->del() if $ref;
+ my $node = DXCluster->get_exact($call);
+ if ($node) {
+ if ($node->dxchan != $self) {
+ dbg('chan', "LOOP: come in on wrong channel");
+ return;
+ }
+ $node->del();
+ } else {
+ dbg('chan', "$call not in table, dropped");
+ return;
+ }
}
last SWITCH;
}
}
last SWITCH;
}
@@
-416,6
+449,15
@@
sub normal
}
if ($pcno == 23 || $pcno == 27) { # WWV info
}
if ($pcno == 23 || $pcno == 27) { # WWV info
+
+ # route 'foreign' pc27s
+ if ($pcno == 27) {
+ if ($field[8] ne $main::mycall) {
+ route($field[8], $line);
+ return;
+ }
+ }
+
# do some de-duping
my $d = cltounix($field[1], sprintf("%02d18Z", $field[2]));
my $sfi = unpad($field[3]);
# do some de-duping
my $d = cltounix($field[1], sprintf("%02d18Z", $field[2]));
my $sfi = unpad($field[3]);
@@
-458,8
+500,8
@@
sub normal
}
if ($pcno == 25) { # merge request
}
if ($pcno == 25) { # merge request
-
unless ($field[1] eq
$main::mycall) {
-
dbg('chan', "merge request to $field[1] from $field[2] ignored"
);
+
if ($field[1] ne
$main::mycall) {
+
route($field[1], $line
);
return;
}
return;
}
@@
-470,7
+512,7
@@
sub normal
my @in = reverse Spot::search(1, undef, undef, 0, $field[3]-1);
my $in;
foreach $in (@in) {
my @in = reverse Spot::search(1, undef, undef, 0, $field[3]-1);
my $in;
foreach $in (@in) {
- $self->send(pc26(@{$in}[0..4], $
in->[7
]));
+ $self->send(pc26(@{$in}[0..4], $
field[2
]));
}
}
}
}
@@
-479,14
+521,18
@@
sub normal
my @in = reverse Geomag::search(0, $field[4], time, 1);
my $in;
foreach $in (@in) {
my @in = reverse Geomag::search(0, $field[4], time, 1);
my $in;
foreach $in (@in) {
- $self->send(pc27(@{$in}));
+ $self->send(pc27(@{$in}
[0..5], $field[2]
));
}
}
return;
}
}
}
return;
}
-
+
if (($pcno >= 28 && $pcno <= 33) || $pcno == 40 || $pcno == 42 || $pcno == 49) { # mail/file handling
if (($pcno >= 28 && $pcno <= 33) || $pcno == 40 || $pcno == 42 || $pcno == 49) { # mail/file handling
- DXMsg::process($self, $line);
+ if ($field[1] eq $main::mycall) {
+ DXMsg::process($self, $line);
+ } else {
+ route($field[1], $line);
+ }
return;
}
return;
}
@@
-498,7
+544,10
@@
sub normal
unless ($field[3] =~ /rcmd/i || !$cref || !$ref || $cref->mynode->call ne $ref->homenode) { # not allowed to relay RCMDS!
if ($ref->{priv}) { # you have to have SOME privilege, the commands have further filtering
$self->{remotecmd} = 1; # for the benefit of any command that needs to know
unless ($field[3] =~ /rcmd/i || !$cref || !$ref || $cref->mynode->call ne $ref->homenode) { # not allowed to relay RCMDS!
if ($ref->{priv}) { # you have to have SOME privilege, the commands have further filtering
$self->{remotecmd} = 1; # for the benefit of any command that needs to know
+ my $oldpriv = $self->{priv};
+ $self->{priv} = $ref->{priv}; # assume the user's privilege level
my @in = (DXCommandmode::run_cmd($self, $field[3]));
my @in = (DXCommandmode::run_cmd($self, $field[3]));
+ $self->{priv} = $oldpriv;
for (@in) {
s/\s*$//og;
$self->send(pc35($main::mycall, $field[2], "$main::mycall:$_"));
for (@in) {
s/\s*$//og;
$self->send(pc35($main::mycall, $field[2], "$main::mycall:$_"));
@@
-531,10
+580,8
@@
sub normal
return;
}
return;
}
- if ($pcno == 37) {
- last SWITCH;
- }
-
+ # for pc 37 see 44 onwards
+
if ($pcno == 38) { # node connected list from neighbour
return;
}
if ($pcno == 38) { # node connected list from neighbour
return;
}
@@
-571,25
+618,21
@@
sub normal
if ($pcno == 43) {
last SWITCH;
}
if ($pcno == 43) {
last SWITCH;
}
- if ($pcno == 44) {
- last SWITCH;
- }
- if ($pcno == 45) {
- last SWITCH;
- }
- if ($pcno == 46) {
- last SWITCH;
- }
- if ($pcno == 47) {
- last SWITCH;
- }
- if ($pcno == 48) {
- last SWITCH;
+ if ($pcno == 37 || $pcno == 44 || $pcno == 45 || $pcno == 46 || $pcno == 47 || $pcno == 49) {
+ if ($field[1] eq $main::mycall) {
+ ;
+ } else {
+ route($field[1], $line);
+ }
+ return;
}
if ($pcno == 50) { # keep alive/user list
}
if ($pcno == 50) { # keep alive/user list
- my $ref = DXCluster->get_exact($field[1]);
- $ref->update_users($field[2]) if $ref;
+ my $node = DXCluster->get_exact($field[1]);
+ if ($node) {
+ return unless $node->dxchan == $self;
+ $node->update_users($field[2]);
+ }
last SWITCH;
}
last SWITCH;
}
@@
-735,10
+778,14
@@
sub send_dx_spot
$dxchan->send($routeit) unless $dxchan->{isolate} || $self->{isolate};
}
$dxchan->send($routeit) unless $dxchan->{isolate} || $self->{isolate};
}
- } elsif ($dxchan->is_user) {
+ } elsif ($dxchan->is_user
&& $dxchan->{dx}
) {
my $buf = Spot::formatb($_[0], $_[1], $_[2], $_[3], $_[4]);
my $buf = Spot::formatb($_[0], $_[1], $_[2], $_[3], $_[4]);
- $buf .= "\a\a" if $dxchan->beep;
- $dxchan->send($buf) if !$hops || ($hops && $filter);
+ $buf .= "\a\a" if $dxchan->{beep};
+ if ($dxchan->{state} eq 'prompt' || $dxchan->{state} eq 'convers') {
+ $dxchan->send($buf) if !$hops || ($hops && $filter);
+ } else {
+ $dxchan->delay($buf) if !$hops || ($hops && $filter);
+ }
}
}
}
}
}
}