changed mailing list mailtos to the correct ones
[spider.git] / perl / DXCommandmode.pm
index 3c45aee968f0c1c0ebc8c1c560f8f0e184d51d5a..967cc022d10cbefb04fb0dcf68902c6ee5ffeeb3 100644 (file)
@@ -32,13 +32,14 @@ use Sun;
 use Internet;
 
 use strict;
-use vars qw(%Cache %cmd_cache $errstr %aliases $scriptbase);
+use vars qw(%Cache %cmd_cache $errstr %aliases $scriptbase $maxerrors);
 
 %Cache = ();                                   # cache of dynamically loaded routine's mod times
 %cmd_cache = ();                               # cache of short names
 $errstr = ();                                  # error string from eval
 %aliases = ();                                 # aliases for (parts of) commands
 $scriptbase = "$main::root/scripts"; # the place where all users start scripts go
+$maxerrors = 20;                               # the maximum number of concurrent errors allowed before disconnection
 
 #
 # obtain a new connection this is derived from dxchannel
@@ -351,12 +352,27 @@ sub run_cmd
                                }
                        } else {
                                dbg('command', "cmd: $cmd not found");
-                               return ($self->msg('e1'));
+                               if (++$self->{errors} > $maxerrors) {
+                                       $self->send($self->msg('e26'));
+                                       $self->disconnect;
+                                       return ();
+                               } else {
+                                       return ($self->msg('e1'));
+                               }
                        }
                }
        }
        
-       shift @ans;
+       my $ok = shift @ans;
+       if ($ok) {
+               delete $self->{errors};
+       } else {
+               if (++$self->{errors} > $maxerrors) {
+                       $self->send($self->msg('e26'));
+                       $self->disconnect;
+                       return ();
+               }
+       }
        return (@ans);
 }
 
@@ -384,10 +400,9 @@ sub process
 #
 # finish up a user context
 #
-sub finish
+sub disconnect
 {
        my $self = shift;
-       my $conn = shift;
        my $call = $self->call;
 
        # reset the redirection of messages back to 'normal' if we are the sysop
@@ -399,20 +414,6 @@ sub finish
        # I was the last node visited
     $self->user->node($main::mycall);
                
-       # log out text
-       if ($conn && -e "$main::data/logout") {
-               open(I, "$main::data/logout") or confess;
-               my @in = <I>;
-               close(I);
-               $self->send_now('D', @in);
-               sleep(1);
-       }
-
-#      if ($call eq $main::myalias) { # unset the channel if it is us really
-#              my $node = DXNode->get($main::mycall);
-#              $node->{dxchan} = 0;
-#      }
-       
        # issue a pc17 to everybody interested
        my $nchan = DXChannel->get($main::mycall);
        my $pc17 = $nchan->pc17($self);
@@ -424,6 +425,8 @@ sub finish
        Log('DXCommand', "$call disconnected");
        my $ref = DXCluster->get_exact($call);
        $ref->del() if $ref;
+
+       $self->SUPER::disconnect;
 }
 
 #