X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2Fcluster.pl;h=d9827a651fc8daf635f886aae7ef1fd6dbfdf717;hb=b0dc102f62871b43134807fa254749b1720d326a;hp=36c2f8bd027005b8ae6a16db4cfba6fe5d1e2477;hpb=0e84728de35d2dadbb9d624614a471b68ae9eef6;p=spider.git diff --git a/perl/cluster.pl b/perl/cluster.pl index 36c2f8bd..d9827a65 100755 --- a/perl/cluster.pl +++ b/perl/cluster.pl @@ -60,6 +60,8 @@ use CmdAlias; use Filter; use Local; use DXDb; +use Data::Dumper; + use Fcntl ':flock'; use Carp qw(cluck); @@ -71,6 +73,7 @@ $systime = 0; # the time now (in seconds) $version = "1.35"; # the version no of the software $starttime = 0; # the starting time of the cluster $lockfn = "cluster.lock"; # lock file name +@outstanding_connects = (); # list of outstanding connects # handle disconnections sub disconnect @@ -91,7 +94,7 @@ sub already_conn dbg('chan', "-> Z $call bye\n"); $conn->send_now("Z$call|bye"); # this will cause 'client' to disconnect sleep(1); - $conn->disconnect; + $conn->disconnect(); } # handle incoming messages @@ -101,7 +104,9 @@ sub rec my $dxchan = DXChannel->get_by_cnum($conn); # get the dxconnnect object for this message if (defined $err && $err) { - disconnect($dxchan) if defined $dxchan; + if ($dxchan) { + $dxchan->disconnect; + } return; } @@ -148,6 +153,7 @@ sub rec # create the channel $dxchan = DXCommandmode->new($call, $conn, $user) if ($user->sort eq 'U'); $dxchan = DXProt->new($call, $conn, $user) if ($user->sort eq 'A'); + $dxchan = BBS->new($call, $conn, $user) if ($user->sort eq 'B'); die "Invalid sort of user on $call = $sort" if !$dxchan; } @@ -178,9 +184,9 @@ sub cease }; dbg('local', "Local::finish error $@") if $@; - # disconnect users + # disconnect nodes foreach $dxchan (DXChannel->get_all()) { - next if $dxchan->is_ak1a; + next unless $dxchan->is_ak1a; disconnect($dxchan) unless $dxchan == $DXProt::me; } Msg->event_loop(1, 0.05); @@ -190,9 +196,9 @@ sub cease Msg->event_loop(1, 0.05); Msg->event_loop(1, 0.05); - # disconnect nodes + # disconnect users foreach $dxchan (DXChannel->get_all()) { - next unless $dxchan->is_ak1a; + next if $dxchan->is_ak1a; disconnect($dxchan) unless $dxchan == $DXProt::me; } Msg->event_loop(1, 0.05); @@ -201,12 +207,6 @@ sub cease Msg->event_loop(1, 0.05); Msg->event_loop(1, 0.05); Msg->event_loop(1, 0.05); - Msg->event_loop(1, 0.05); - Msg->event_loop(1, 0.05); - Msg->event_loop(1, 0.05); - Msg->event_loop(1, 0.05); - Msg->event_loop(1, 0.05); - Msg->event_loop(1, 0.05); DXUser::finish(); # close all databases @@ -226,6 +226,7 @@ sub reap { $SIG{'CHLD'} = \&reap; my $cpid = wait; + @outstanding_connects = grep {$_->{pid} != $cpid} @outstanding_connects; } # this is where the input queue is dealt with and things are dispatched off to other parts of @@ -261,6 +262,7 @@ sub process_inqueue $dxchan->normal($line); disconnect($dxchan) if ($dxchan->{state} eq 'bye'); } elsif ($sort eq 'Z') { + $dxchan->conn(undef); disconnect($dxchan); } elsif ($sort eq 'D') { ; # ignored (an echo) @@ -297,7 +299,7 @@ STDOUT->autoflush(1); Log('cluster', "DXSpider V$version started"); # banner -print "DXSpider DX Cluster Version $version\nCopyright (c) 1998 Dirk Koopman G1TLH\n"; +print "DXSpider DX Cluster Version $version\nCopyright (c) 1998-1999 Dirk Koopman G1TLH\n"; # load Prefixes print "loading prefixes ...\n";