]> granicus.if.org Git - php/commitdiff
MFH: implement PHP_STREAM_FLAG_NO_CLOSE and avoid hacks
authorAntony Dovgal <tony2001@php.net>
Wed, 21 Feb 2007 21:57:21 +0000 (21:57 +0000)
committerAntony Dovgal <tony2001@php.net>
Wed, 21 Feb 2007 21:57:21 +0000 (21:57 +0000)
main/php_streams.h
main/streams/plain_wrapper.c
main/streams/streams.c
sapi/cli/php_cli.c

index c7f424f2969fe21b968a84fe1b038643e26b6d1f..e4a56eacab54337aed96ff553da7f14dd7060ec1 100755 (executable)
@@ -178,6 +178,8 @@ struct _php_stream_wrapper  {
  * might otherwise cause the read to block for much longer than
  * is strictly required. */
 #define PHP_STREAM_FLAG_AVOID_BLOCKING                         16
+
+#define PHP_STREAM_FLAG_NO_CLOSE                                       32
        
 struct _php_stream  {
        php_stream_ops *ops;
index 430f7897329d9a61d147cc5e69d6c85bfa608ca5..365b6c8e5ff82d5a024e37ac523d9171bc0edd72 100644 (file)
@@ -392,16 +392,7 @@ static int php_stdiop_close(php_stream *stream, int close_handle TSRMLS_DC)
                                data->file = NULL;
                        }
                } else if (data->fd != -1) {
-#if PHP_DEBUG
-                       if ((data->fd == 1 || data->fd == 2) && 0 == strcmp(sapi_module.name, "cli")) {
-                               /* don't close stdout or stderr in CLI in DEBUG mode, as we want to see any leaks */
-                               ret = 0;
-                       } else {
-                               ret = close(data->fd);
-                       }
-#else
                        ret = close(data->fd);
-#endif
                        data->fd = -1;
                } else {
                        return 0; /* everything should be closed already -> success */
index 9cd9cce6ef0aa92363999a4e372778ae58a6949e..f132227eaf2b174e255343f81bc8311162773312 100755 (executable)
@@ -279,6 +279,10 @@ PHPAPI int _php_stream_free(php_stream *stream, int close_options TSRMLS_DC) /*
        int preserve_handle = close_options & PHP_STREAM_FREE_PRESERVE_HANDLE ? 1 : 0;
        int release_cast = 1;
 
+       if (stream->flags & PHP_STREAM_FLAG_NO_CLOSE) {
+               preserve_handle = 1;
+       }
+
 #if STREAM_DEBUG
 fprintf(stderr, "stream_free: %s:%p[%s] in_free=%d opts=%08x\n", stream->ops->label, stream, stream->orig_path, stream->in_free, close_options);
 #endif
index 71e13f26d07c0687a4aacf258d06d84ea4f42854..e7dcef33f3e6b28d8981d7f8bb45fbb693e9793d 100644 (file)
@@ -476,6 +476,12 @@ static void cli_register_file_handles(TSRMLS_D)
        s_out = php_stream_open_wrapper_ex("php://stdout", "wb", 0, NULL, sc_out);
        s_err = php_stream_open_wrapper_ex("php://stderr", "wb", 0, NULL, sc_err);
 
+#if PHP_DEBUG
+       /* do not close stdout and stderr */
+       s_out->flags |= PHP_STREAM_FLAG_NO_CLOSE;
+       s_err->flags |= PHP_STREAM_FLAG_NO_CLOSE;
+#endif
+
        if (s_in==NULL || s_out==NULL || s_err==NULL) {
                FREE_ZVAL(zin);
                FREE_ZVAL(zout);