<?php
/* PERL CGI WRAPPER PHP SCRIPT */
/* Note: Does not handle "multipart/form-data" */

/* Populate $HTTP_RAW_POST_DATA if not available */
if (!isset($HTTP_RAW_POST_DATA)){
    
$HTTP_RAW_POST_DATA file_get_contents('php://input');
}

if(isset(
$_GET["cgi"])) {
  
$cgi $_GET["cgi"];
}
else {
   
$cgi $_POST["cgi"];
}


/* A little bit of security */
$cgi str_replace(".."""$cgi);

$command "/usr/local/bin/perl ./" $cgi;
$io = array();
$p proc_open($command,
               array(
               
=> array('pipe''r'),
               
=> array('pipe''w'),
               
=> array('pipe''w')),
               
$io);

/* Write the raw POST data to the pipe */
fwrite($io[0], $HTTP_RAW_POST_DATA);
fclose($io[0]);


/* Read output sent to stdout. */
while (!feof($io[1])) {
    
$stdout .= fgets($io[1]);  
}

/* Extract header section */
preg_match('/^(.*?)[\n]{2}(.*)$/s'$stdout$regs);
        
/* Set HTTP headers */
$headers preg_split("/[\n]/"$regs[1]);
foreach (
$headers as $header) {
    
header($header);
}
    
$stdout $regs[2];

echo 
$stdout;
/* Read output sent to stderr. */
while (!feof($io[2])) {
    
$stderr .= fgets($io[2]);
}


/* Close handles */            
fclose($io[1]);
fclose($io[2]);
$exit proc_close($p);


/* Set HTTP status code to 500 if an error occured */
if($exit != && !isset($debug)) {
    
header(getenv("HOME") . " 500 Internal Server Error");
}
else if(
$exit != 0) {
    print 
$stderr;
}

?>