+ @ans = run_cmd($self, $cmdline); # if length $cmdline;
+
+ if ($self->{pagelth} && @ans > $self->{pagelth}) {
+ my $i;
+ for ($i = $self->{pagelth}; $i-- > 0; ) {
+ my $line = shift @ans;
+ $line =~ s/\s+$//o; # why am having to do this?
+ $self->send($line);
+ }
+ $self->{pagedata} = \@ans;
+ $self->state('page');
+ $self->send($self->msg('page', scalar @ans));
+ } else {
+ for (@ans) {
+ $self->send($_) if $_;
+ }
+ }
+ }
+
+ # 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};
+ my $call = $self->{call};
+ my $cmdline = shift;
+ my @ans;
+
+ if ($self->{func}) {
+ my $c = qq{ \@ans = $self->{func}(\$self, \$cmdline) };
+ dbg('eval', "stored func cmd = $c\n");
+ eval $c;
+ if ($@) {
+ return ("Syserr: Eval err $errstr on stored func $self->{func}", $@);
+ }
+ } else {
+
+ return () if length $cmdline == 0;
+
+ # strip out //
+ $cmdline =~ s|//|/|og;
+
+ # split the command line up into parts, the first part is the command
+ my ($cmd, $args) = split /\s+/, $cmdline, 2;
+ $args = "" unless $args;
+
+ if ($cmd) {
+
+ my ($path, $fcmd);
+
+ dbg('command', "cmd: $cmd");
+
+ # alias it if possible
+ my $acmd = CmdAlias::get_cmd($cmd);
+ if ($acmd) {
+ ($cmd, $args) = split /\s+/, "$acmd $args", 2;
+ $args = "" unless $args;
+ dbg('command', "aliased cmd: $cmd $args");
+ }
+
+ # first expand out the entry to a command
+ ($path, $fcmd) = search($main::localcmd, $cmd, "pl");
+ ($path, $fcmd) = search($main::cmd, $cmd, "pl") if !$path || !$fcmd;
+
+ if ($path && $cmd) {
+ dbg('command', "path: $cmd cmd: $fcmd");
+
+ my $package = find_cmd_name($path, $fcmd);
+ @ans = (0) if !$package ;
+
+ if ($package) {
+ dbg('command', "package: $package");
+ my $c;
+ unless (exists $Cache{$package}->{'sub'}) {
+ $c = eval $Cache{$package}->{'eval'};
+ if ($@) {
+ return DXDebug::shortmess($@);
+ }
+ $Cache{$package}->{'sub'} = $c;
+ }
+ $c = $Cache{$package}->{'sub'};
+ eval {
+ @ans = &{$c}($self, $args);
+ };
+
+ if ($@) {
+ cluck($@);
+ return (DXDebug::shortmess($@));
+ };
+ }
+ } else {
+ dbg('command', "cmd: $cmd not found");
+ return ($self->msg('e1'));
+ }
+ }