package DXCommandmode;
use POSIX;
-use IO::File;
@ISA = qw(DXChannel);
use Filter;
use Carp;
use Minimuf;
+use DXDb;
use strict;
-use vars qw(%Cache %cmd_cache $errstr %aliases);
+use vars qw(%Cache %cmd_cache $errstr %aliases $scriptbase);
%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
#
# obtain a new connection this is derived from dxchannel
$cmdline =~ s|//|/|og;
# split the command line up into parts, the first part is the command
- my ($cmd, $args) = $cmdline =~ /^([\S\/]+)\s*(.*)/o;
+ my ($cmd, $args) = split /\s+/, $cmdline, 2;
+ $args = "" unless $args;
if ($cmd) {
# alias it if possible
my $acmd = CmdAlias::get_cmd($cmd);
if ($acmd) {
- ($cmd, $args) = "$acmd $args" =~ /^([\w\/]+)\s*(.*)/o;
+ ($cmd, $args) = split /\s+/, "$acmd $args", 2;
+ $args = "" unless $args;
dbg('command', "aliased cmd: $cmd $args");
}
$Cache{$package}->{sub} = $c;
}
$c = $Cache{$package}->{sub};
- @ans = &{$c}($self, $args);
+ eval {
+ @ans = &{$c}($self, $args);
+ };
+
+ return ($@) if $@;
}
} else {
dbg('command', "cmd: $cmd not found");
return @out;
}
+# run a script for this user
+sub run_script
+{
+ my $self = shift;
+ my $silent = shift || 0;
+
+}
+
#
# search for the command in the cache of short->long form commands
#
#print STDERR "already compiled $package->handler\n";
;
} else {
-
- my $fh = new IO::File;
- if (!open $fh, $filename) {
+
+ my $sub = readfilestr($filename);
+ unless ($sub) {
$errstr = "Syserr: can't open '$filename' $!";
return undef;
};
- local $/ = undef;
- my $sub = <$fh>;
- close $fh;
#wrap the code into a subroutine inside our unique package
my $eval = qq( sub { $sub } );