52 lines
1.2 KiB
PHP
52 lines
1.2 KiB
PHP
<?php
|
|
|
|
// Adapted from https://wiki.archlinux.org/index.php/Awstats
|
|
|
|
// Prepare environment
|
|
|
|
$newenv = $_SERVER;
|
|
$newenv["SCRIPT_FILENAME"] = $_SERVER["X_SCRIPT_FILENAME"];
|
|
|
|
if (!is_executable($_SERVER["X_SCRIPT_FILENAME"]) || is_dir($_SERVER["X_SCRIPT_FILENAME"]))
|
|
error_exit(404, 'Not Found');
|
|
|
|
// Open process
|
|
|
|
$descriptorspec = array(
|
|
array('pipe', 'r'),
|
|
array('pipe', 'w'),
|
|
array('pipe', 'w'),
|
|
);
|
|
$pipes = array();
|
|
$process = proc_open($_SERVER["X_SCRIPT_FILENAME"], $descriptorspec, $pipes, null, $newenv);
|
|
|
|
if (!is_resource($process))
|
|
error_exit(500, 'Internal Server Error');
|
|
|
|
// All ok, send response
|
|
|
|
while (true) {
|
|
$head = fgets($pipes[1]);
|
|
if ($head === false || $head === "\r\n" || $head === "\n") break;
|
|
header($head);
|
|
}
|
|
fpassthru($pipes[1]);
|
|
|
|
// Close
|
|
|
|
$scriptErrors = trim(stream_get_contents($pipes[2]));
|
|
foreach ($pipes as $fh) fclose($fh);
|
|
$returnValue = proc_close($process);
|
|
if ($scriptErrors) error_exit(500, "Status=$returnValue Error=$scriptErrors");
|
|
exit;
|
|
|
|
// Exit helper
|
|
|
|
function error_exit($code, $msg)
|
|
{
|
|
header("$_SERVER[SERVER_PROTOCOL] $code $msg");
|
|
echo($msg);
|
|
trigger_error("$msg in $_SERVER[X_SCRIPT_FILENAME]", E_USER_ERROR);
|
|
exit(1);
|
|
}
|