diff options
author | Arnaud Le Blanc <lbarnaud@php.net> | 2008-11-04 21:05:31 +0000 |
---|---|---|
committer | Arnaud Le Blanc <lbarnaud@php.net> | 2008-11-04 21:05:31 +0000 |
commit | 9b0d76d585b91ca9385ec7f8b04ddaecf000febe (patch) | |
tree | be1d22c582328f6d843f2a2fba52c6f2dde1acec | |
parent | 43400aaf879c3aa12d65818e4b25a68d9f4c4904 (diff) | |
download | php-git-9b0d76d585b91ca9385ec7f8b04ddaecf000febe.tar.gz |
Open STDIN and php://stdin streams with the relevant
wrapper when the file descriptor is a socket (inetd, etc)
Fixes bug #43731
-rw-r--r-- | ext/standard/php_fopen_wrapper.c | 16 | ||||
-rw-r--r-- | sapi/cli/tests/022.inc | 14 | ||||
-rw-r--r-- | sapi/cli/tests/022.phpt | 47 |
3 files changed, 76 insertions, 1 deletions
diff --git a/ext/standard/php_fopen_wrapper.c b/ext/standard/php_fopen_wrapper.c index 7ed59cbe28..3d380344a9 100644 --- a/ext/standard/php_fopen_wrapper.c +++ b/ext/standard/php_fopen_wrapper.c @@ -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); diff --git a/sapi/cli/tests/022.inc b/sapi/cli/tests/022.inc new file mode 100644 index 0000000000..b77512fcf3 --- /dev/null +++ b/sapi/cli/tests/022.inc @@ -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); + +?> diff --git a/sapi/cli/tests/022.phpt b/sapi/cli/tests/022.phpt new file mode 100644 index 0000000000..eabb8bdf8d --- /dev/null +++ b/sapi/cli/tests/022.phpt @@ -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) |