X-Git-Url: http://www.dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXCommandmode.pm;h=8af394b8898d4852b6e9ca0656a3a1c5014e3313;hb=b060a0a3ee72530aa3f10d453186a662b66d7efe;hp=5348212d620ceb7c09626f5c9d7f56ef3d5690a8;hpb=6a0068ec3df1dca0c6ae2714af3c0a4a62998dcf;p=spider.git diff --git a/perl/DXCommandmode.pm b/perl/DXCommandmode.pm index 5348212d..8af394b8 100644 --- a/perl/DXCommandmode.pm +++ b/perl/DXCommandmode.pm @@ -17,6 +17,7 @@ use DXUser; use DXVars; use DXDebug; use DXM; +use DXLog; use CmdAlias; use FileHandle; use Carp; @@ -46,7 +47,7 @@ sub new sub start { - my ($self, $line) = @_; + my ($self, $line, $sort) = @_; my $user = $self->{user}; my $call = $self->{call}; my $name = $user->{name}; @@ -74,12 +75,31 @@ sub start my $nchan = DXChannel->get($main::mycall); my @pc16 = DXProt::pc16($nchan, $cuser); DXProt::broadcast_ak1a(@pc16); + Log('DXCommand', "$call connected"); } # # This is the normal command prompt driver # + sub normal +{ + my $self = shift; + my $cmdline = shift; + + my @ans = run_cmd($self, $cmdline); + $self->send(@ans) if @ans > 0; + + # send a prompt only if we are in a prompt state + $self->prompt() if $self->{state} =~ /^prompt/o; +} + +# +# this is the thing that runs the command, it is done like this for the +# benefit of remote command execution +# + +sub run_cmd { my $self = shift; my $user = $self->{user}; @@ -124,7 +144,7 @@ sub normal ($path, $fcmd) = search($main::cmd, $cmd, "pl") if !$path || !$fcmd; my $package = find_cmd_name($path, $fcmd); - @ans = (0, "Syserr: compile err on $package\n$@$errstr") if !$package ; + @ans = (0) if !$package ; if ($package) { my $c = qq{ \@ans = $package(\$self, \$args) }; @@ -137,22 +157,17 @@ sub normal } } -# my @ans = $self->eval_file($path, $fcmd, $args) if $path && $fcmd; -# @ans = $self->eval_file($main::cmd, $cmd, $args) if !$ans[0]; if ($ans[0]) { shift @ans; - $self->send(@ans) if @ans > 0; } else { shift @ans; if (@ans > 0) { - $self->send($self->msg('e2', @ans)); + unshift @ans, $self->msg('e2'); } else { - $self->send($self->msg('e1')); + @ans = $self->msg('e1'); } } - - # send a prompt only if we are in a prompt state - $self->prompt() if $self->{state} =~ /^prompt/o; + return @ans; } # @@ -194,7 +209,8 @@ sub finish my $nchan = DXChannel->get($main::mycall); my $pc17 = $nchan->pc17($self); DXProt::broadcast_ak1a($pc17); - + + Log('DXCommand', "$call disconnected"); $ref->del() if $ref; } @@ -394,6 +410,7 @@ sub find_cmd_name { my $fh = new FileHandle; if (!open $fh, $filename) { $errstr = "Syserr: can't open '$filename' $!"; + return undef; }; local $/ = undef; my $sub = <$fh>; @@ -424,7 +441,6 @@ sub find_cmd_name { print "\$\@ = $@"; $errstr = $@; delete_package($package); - $package = undef; } else { #cache it unless we're cleaning out each time $Cache{$package}{mtime} = $mtime; @@ -433,6 +449,7 @@ sub find_cmd_name { #print Devel::Symdump->rnew($package)->as_string, $/; $package = "DXCommandmode::$package" if $package; + $package = undef if $errstr; return $package; }