]> granicus.if.org Git - php/commitdiff
MFH: Open STDIN and php://stdin streams with the relevant
authorArnaud Le Blanc <lbarnaud@php.net>
Tue, 4 Nov 2008 21:05:55 +0000 (21:05 +0000)
committerArnaud Le Blanc <lbarnaud@php.net>
Tue, 4 Nov 2008 21:05:55 +0000 (21:05 +0000)
wrapper when the file descriptor is a socket (inetd, etc)
Fixes bug #43731

ext/standard/php_fopen_wrapper.c
sapi/cli/tests/022.inc [new file with mode: 0644]
sapi/cli/tests/022.phpt [new file with mode: 0644]

index b3772d5cac653f24c69cf1d5d99b5d1c6bb6e5a4..fcf6078a462cf2c77e7345c499f881e514490200 100644 (file)
@@ -290,9 +290,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 (file)
index 0000000..b77512f
--- /dev/null
@@ -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 (file)
index 0000000..eabb8bd
--- /dev/null
@@ -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)