mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
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:
parent
43400aaf87
commit
9b0d76d585
3 changed files with 76 additions and 1 deletions
|
@ -291,6 +291,20 @@ php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, char *path, ch
|
||||||
return NULL;
|
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) {
|
if (file) {
|
||||||
stream = php_stream_fopen_from_file(file, mode);
|
stream = php_stream_fopen_from_file(file, mode);
|
||||||
} else {
|
} else {
|
||||||
|
|
14
sapi/cli/tests/022.inc
Normal file
14
sapi/cli/tests/022.inc
Normal 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
47
sapi/cli/tests/022.phpt
Normal 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)
|
Loading…
Add table
Add a link
Reference in a new issue