Open STDIN and php://stdin streams with the relevant

wrapper when the file descriptor is a socket (inetd, etc)
Fixes bug #43731
This commit is contained in:
Arnaud Le Blanc 2008-11-04 21:05:31 +00:00
parent 43400aaf87
commit 9b0d76d585
3 changed files with 76 additions and 1 deletions

View file

@ -291,9 +291,23 @@ php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, char *path, ch
return NULL;
}
#if defined(S_IFSOCK) && !defined(WIN32) && !defined(__BEOS__)
do {
struct stat st;
memset(&st, 0, sizeof(st));
if (fstat(fd, &st) == 0 && (st.st_mode & S_IFMT) == S_IFSOCK) {
stream = php_stream_sock_open_from_socket(fd, NULL);
if (stream) {
stream->ops = &php_stream_socket_ops;
return stream;
}
}
} while (0);
#endif
if (file) {
stream = php_stream_fopen_from_file(file, mode);
} else {
} else {
stream = php_stream_fopen_from_fd(fd, mode, NULL);
if (stream == NULL) {
close(fd);

14
sapi/cli/tests/022.inc Normal file
View file

@ -0,0 +1,14 @@
<?php
ob_start();
var_dump(STDIN);
$fd = fopen("php://stdin","r");
var_dump($fd);
$client_socket = stream_socket_accept($fd);
$data = ob_get_clean();
fwrite($client_socket, $data);
?>

47
sapi/cli/tests/022.phpt Normal file
View file

@ -0,0 +1,47 @@
--TEST--
STDIN/OUT/ERR stream type
--SKIPIF--
<?php
if (!getenv("TEST_PHP_EXECUTABLE")) die("skip TEST_PHP_EXECUTABLE not set");
if (substr(PHP_OS, 0, 3) == "WIN") die("skip non windows test");
?>
--FILE--
<?php
$php = getenv("TEST_PHP_EXECUTABLE");
$socket_file = dirname(__FILE__) . '/' . pathinfo(__FILE__, PATHINFO_FILENAME) . '.sock';
$test_file = dirname(__FILE__) . '/' . pathinfo(__FILE__, PATHINFO_FILENAME) . '.inc';
if (file_exists($socket_file)) {
unlink($socket_file);
}
$socket = stream_socket_server('unix://' . $socket_file);
var_dump($socket);
if (!$socket) {
exit(1);
}
$desc = array(
0 => $socket,
1 => STDOUT,
2 => STDERR,
);
$pipes = array();
$proc = proc_open("$php -n " . escapeshellarg($test_file), $desc, $pipes);
var_dump($proc);
if (!$proc) {
exit(1);
}
$client_socket = stream_socket_client('unix://' . $socket_file);
var_dump($client_socket);
echo stream_get_contents($client_socket);
fclose($client_socket);
proc_terminate($proc);
proc_close($proc);
unlink($socket_file);
?>
--EXPECTF--
resource(%d) of type (stream)
resource(%d) of type (process)
resource(%d) of type (stream)
resource(%d) of type (stream)
resource(%d) of type (stream)