mirror of
https://github.com/php/php-src.git
synced 2025-08-17 22:48:57 +02:00
implement PHP_STREAM_FLAG_NO_CLOSE and avoid hacks in plain wrapper
This commit is contained in:
parent
3305731054
commit
30dacafa72
4 changed files with 12 additions and 9 deletions
|
@ -186,6 +186,8 @@ struct _php_stream_wrapper {
|
||||||
* might otherwise cause the read to block for much longer than
|
* might otherwise cause the read to block for much longer than
|
||||||
* is strictly required. */
|
* is strictly required. */
|
||||||
#define PHP_STREAM_FLAG_AVOID_BLOCKING 16
|
#define PHP_STREAM_FLAG_AVOID_BLOCKING 16
|
||||||
|
|
||||||
|
#define PHP_STREAM_FLAG_NO_CLOSE 32
|
||||||
|
|
||||||
struct _php_stream {
|
struct _php_stream {
|
||||||
php_stream_ops *ops;
|
php_stream_ops *ops;
|
||||||
|
|
|
@ -396,16 +396,7 @@ static int php_stdiop_close(php_stream *stream, int close_handle TSRMLS_DC)
|
||||||
data->file = NULL;
|
data->file = NULL;
|
||||||
}
|
}
|
||||||
} else if (data->fd != -1) {
|
} 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);
|
ret = close(data->fd);
|
||||||
#endif
|
|
||||||
data->fd = -1;
|
data->fd = -1;
|
||||||
} else {
|
} else {
|
||||||
return 0; /* everything should be closed already -> success */
|
return 0; /* everything should be closed already -> success */
|
||||||
|
|
|
@ -285,6 +285,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 preserve_handle = close_options & PHP_STREAM_FREE_PRESERVE_HANDLE ? 1 : 0;
|
||||||
int release_cast = 1;
|
int release_cast = 1;
|
||||||
|
|
||||||
|
if (stream->flags & PHP_STREAM_FLAG_NO_CLOSE) {
|
||||||
|
preserve_handle = 1;
|
||||||
|
}
|
||||||
|
|
||||||
#if STREAM_DEBUG
|
#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);
|
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
|
#endif
|
||||||
|
|
|
@ -487,6 +487,12 @@ static void cli_register_file_handles(TSRMLS_D)
|
||||||
s_out = php_stream_open_wrapper_ex("php://stdout", "wb", 0, NULL, sc_out);
|
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);
|
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) {
|
if (s_in==NULL || s_out==NULL || s_err==NULL) {
|
||||||
FREE_ZVAL(zin);
|
FREE_ZVAL(zin);
|
||||||
FREE_ZVAL(zout);
|
FREE_ZVAL(zout);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue