# execute a function
print STDERR "fastrpc: call $arg->{'module'}::$arg->{'func'}(",join(",", @{$arg->{'args'}}),")\n" if ($gconfig{'rpcdebug'});
local @rv;
- local $main::error_must_die = 1;
eval {
+ local $main::error_must_die = 1;
@rv = &foreign_call($arg->{'module'},
$arg->{'func'},
@{$arg->{'args'}});
$rv = eval $arg->{'code'};
}
print STDERR "fastrpc: eval $arg->{'module'} $arg->{'code'} done = $rv error = $@\n" if ($gconfig{'rpcdebug'});
- $rawrv = &serialise_variable(
- { 'status' => 1, 'rv' => $rv } );
+ if ($@) {
+ $rawrv = &serialise_variable(
+ { 'status' => 0, 'rv' => $@ } );
+ }
+ else {
+ $rawrv = &serialise_variable(
+ { 'status' => 1, 'rv' => $rv } );
+ }
}
elsif ($arg->{'action'} eq 'quit') {
print STDERR "fastrpc: quit\n" if ($gconfig{'rpcdebug'});
}
my $from = &unserialise_variable($fromstr);
if (!$from) {
+ # No response at all
return &$main::remote_error_handler("Remote Webmin error");
}
+ elsif (ref($from) ne 'HASH') {
+ # Not a hash?!
+ return &$main::remote_error_handler(
+ "Invalid remote Webmin response : $from");
+ }
+ elsif (!$from->{'status'}) {
+ # Call failed
+ $from->{'rv'} =~ s/\s+at\s+(\S+)\s+line\s+(\d+)(,\s+<\S+>\s+line\s+(\d+))?//;
+ return &$main::remote_error_handler($from->{'rv'});
+ }
if (defined($from->{'arv'})) {
return @{$from->{'arv'}};
}