summaryrefslogtreecommitdiff
path: root/shell/exec.php
diff options
context:
space:
mode:
Diffstat (limited to 'shell/exec.php')
-rw-r--r--shell/exec.php38
1 files changed, 31 insertions, 7 deletions
diff --git a/shell/exec.php b/shell/exec.php
index f3dc8d1..b842ea8 100644
--- a/shell/exec.php
+++ b/shell/exec.php
@@ -6,6 +6,8 @@ function php_chdir($dir) {
return $ret;
}
+abstract class prog { public static abstract function main($args, $env); }
+
function php_exec($com, $cwd='') {
if ($cwd != '') { php_chdir($cwd); }
if ($com=='') { return 0; }
@@ -17,7 +19,7 @@ function php_exec($com, $cwd='') {
$env = array('IFS' => $ifs, 'PATH' => $path);
- $coms = array();
+ $coms = array(); $stdout_dest = array();
$a = 0;
$c = 0;
$q = '';
@@ -37,22 +39,44 @@ function php_exec($com, $cwd='') {
$a++;
}
} elseif (substr_count (';',$char)!==0) {
- $c++;
+ $stdout_dest[$c] = '/dev/stdout';
+ $c++; $a=0;
+ } elseif (substr_count ('|',$char)!==0) {
+ $stdout_dest[$c] = '/dev/stdin';
+ $c++; $a=0;
} else {
$coms[$c][$a].=$char;
}
}
+ if (!isset($stdout_dest[$c])) {
+ $stdout_dest[$c] = '/dev/stdout';
+ }
$ret=0;
- foreach ($coms as $args) {
- $file=$path.'/'.$args[0].'.php';
- if (file_exists($file)) {
- include($file);
- $ret = main($args,$env);
+ if (!isset($_POST['stdin'])) { $_POST['stdin']=''; }
+ foreach ($coms as $key => $args) {
+ if ($stdout_dest[$key] != '/dev/stdout') {
+ ob_start();
+ }
+ if (!class_exists('p_'.$args[0])) {
+ $file=$path.'/'.$args[0].'.php';
+ if (file_exists($file)) {
+ include($file);
+ }
+ }
+ if (class_exists('p_'.$args[0])) {
+ $ret = call_user_func(array('p_'.$args[0],'main'),$args,$env);//main($args,$env);
} else {
echo 'sh: command not found: `'.$args[0]."'\n";
$ret = 1;
}
+ if ($stdout_dest[$key] != '/dev/stdout') {
+ switch ($stdout_dest[$key]) {
+ case '/dev/stdin': $_POST['stdin']=ob_get_contents(); break;
+ default: file_put_contents($stdout_dest[$key],ob_get_contents()); break;
+ }
+ ob_end_clean();
+ }
}
return $ret;
}