- my $self = shift;
- my $user = $self->{user};
- my $call = $self->{call};
- my $cmdline = shift;
- my @ans;
-
- # are we in stored state?
- if ($self->{func}) {
- my $c = qq{ \@ans = $self->{func}(\$self, \$cmdline) };
- dbg('eval', "stored func cmd = $c\n");
- eval $c;
- if ($@) {
- return (1, "Syserr: Eval err $errstr on stored func $self->{func}");
- }
- } else {
-
- # special case only \n input => " "
- if ($cmdline eq " ") {
- $self->prompt();
- return;
- }
+ my $self = shift;
+ my $cmdline = shift;
+ my @ans;
+
+ # remove leading and trailing spaces
+ $cmdline =~ s/^\s*(.*)\s*$/$1/;
+
+ if ($self->{state} eq 'page') {
+ my $i = $self->{pagelth};
+ my $ref = $self->{pagedata};
+ my $tot = @$ref;
+
+ # abort if we get a line starting in with a
+ if ($cmdline =~ /^a/io) {
+ undef $ref;
+ $i = 0;
+ }
+
+ # send a tranche of data
+ while ($i-- > 0 && @$ref) {
+ my $line = shift @$ref;
+ $line =~ s/\s+$//o; # why am having to do this?
+ $self->send($line);
+ }
+
+ # reset state if none or else chuck out an intermediate prompt
+ if ($ref && @$ref) {
+ $tot -= $self->{pagelth};
+ $self->send($self->msg('page', $tot));
+ } else {
+ $self->state('prompt');
+ }
+ } elsif ($self->{state} eq 'sysop') {
+ my $passwd = $self->{user}->passwd;
+ my @pw = split / */, $passwd;
+ if ($passwd) {
+ my @l = @{$self->{passwd}};
+ my $str = "$pw[$l[0]].*$pw[$l[1]].*$pw[$l[2]].*$pw[$l[3]].*$pw[$l[4]]";
+ if ($cmdline =~ /$str/) {
+ $self->{priv} = $self->{user}->priv;
+ } else {
+ $self->send($self->msg('sorry'));
+ }
+ } else {
+ $self->send($self->msg('sorry'));
+ }
+ delete $self->{passwd};
+ $self->state('prompt');
+ } else {
+ @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) {
+ s/\s+$//o; # why ?????????
+ $self->send($_);
+ }
+ }
+ }
+
+ # 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;