diff --git a/ext/libxml/tests/004.phpt b/ext/libxml/tests/004.phpt index d02fba2f6c65a..da96faad57ecc 100644 --- a/ext/libxml/tests/004.phpt +++ b/ext/libxml/tests/004.phpt @@ -12,11 +12,8 @@ $ctxs = array( new stdclass, array('a'), stream_context_create(), - stream_context_create(array('file')), - stream_context_create(array('file' => array('some_opt' => 'aaa'))) ); - foreach ($ctxs as $ctx) { try { var_dump(libxml_set_streams_context($ctx)); @@ -31,7 +28,6 @@ echo "Done\n"; ?> --EXPECTF-- -Warning: stream_context_create(): options should have the form ["wrappername"]["optionname"] = $value in %s004.php on line %d libxml_set_streams_context() expects parameter 1 to be resource, null given bool(true) libxml_set_streams_context() expects parameter 1 to be resource, string given @@ -44,8 +40,4 @@ libxml_set_streams_context() expects parameter 1 to be resource, array given bool(true) NULL bool(true) -NULL -bool(true) -NULL -bool(true) Done diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 1a18bd2af1f79..da97eabf75de2 100755 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -122,211 +122,6 @@ static void user_tick_function_dtor(user_tick_function_entry *tick_function_entr /* {{{ arginfo */ -/* {{{ streamsfuncs.c */ -#if HAVE_SOCKETPAIR -ZEND_BEGIN_ARG_INFO(arginfo_stream_socket_pair, 0) - ZEND_ARG_INFO(0, domain) - ZEND_ARG_INFO(0, type) - ZEND_ARG_INFO(0, protocol) -ZEND_END_ARG_INFO() -#endif - -ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_socket_client, 0, 0, 1) - ZEND_ARG_INFO(0, remoteaddress) - ZEND_ARG_INFO(1, errcode) - ZEND_ARG_INFO(1, errstring) - ZEND_ARG_INFO(0, timeout) - ZEND_ARG_INFO(0, flags) - ZEND_ARG_INFO(0, context) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_socket_server, 0, 0, 1) - ZEND_ARG_INFO(0, localaddress) - ZEND_ARG_INFO(1, errcode) - ZEND_ARG_INFO(1, errstring) - ZEND_ARG_INFO(0, flags) - ZEND_ARG_INFO(0, context) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_socket_accept, 0, 0, 1) - ZEND_ARG_INFO(0, serverstream) - ZEND_ARG_INFO(0, timeout) - ZEND_ARG_INFO(1, peername) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO(arginfo_stream_socket_get_name, 0) - ZEND_ARG_INFO(0, stream) - ZEND_ARG_INFO(0, want_peer) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_socket_sendto, 0, 0, 2) - ZEND_ARG_INFO(0, stream) - ZEND_ARG_INFO(0, data) - ZEND_ARG_INFO(0, flags) - ZEND_ARG_INFO(0, target_addr) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_socket_recvfrom, 0, 0, 2) - ZEND_ARG_INFO(0, stream) - ZEND_ARG_INFO(0, amount) - ZEND_ARG_INFO(0, flags) - ZEND_ARG_INFO(1, remote_addr) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_get_contents, 0, 0, 1) - ZEND_ARG_INFO(0, source) - ZEND_ARG_INFO(0, maxlen) - ZEND_ARG_INFO(0, offset) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_copy_to_stream, 0, 0, 2) - ZEND_ARG_INFO(0, source) - ZEND_ARG_INFO(0, dest) - ZEND_ARG_INFO(0, maxlen) - ZEND_ARG_INFO(0, pos) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO(arginfo_stream_get_meta_data, 0) - ZEND_ARG_INFO(0, fp) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO(arginfo_stream_get_transports, 0) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO(arginfo_stream_get_wrappers, 0) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO(arginfo_stream_resolve_include_path, 0) - ZEND_ARG_INFO(0, filename) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO(arginfo_stream_is_local, 0) - ZEND_ARG_INFO(0, stream) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_supports_lock, 0, 0, 1) - ZEND_ARG_INFO(0, stream) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_isatty, 0, 0, 1) - ZEND_ARG_INFO(0, stream) -ZEND_END_ARG_INFO() - -#ifdef PHP_WIN32 -ZEND_BEGIN_ARG_INFO_EX(arginfo_sapi_windows_vt100_support, 0, 0, 1) - ZEND_ARG_INFO(0, stream) - ZEND_ARG_INFO(0, enable) -ZEND_END_ARG_INFO() -#endif - -ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_select, 0, 0, 4) - ZEND_ARG_INFO(1, read_streams) /* ARRAY_INFO(1, read_streams, 1) */ - ZEND_ARG_INFO(1, write_streams) /* ARRAY_INFO(1, write_streams, 1) */ - ZEND_ARG_INFO(1, except_streams) /* ARRAY_INFO(1, except_streams, 1) */ - ZEND_ARG_INFO(0, tv_sec) - ZEND_ARG_INFO(0, tv_usec) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO(arginfo_stream_context_get_options, 0) - ZEND_ARG_INFO(0, stream_or_context) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_context_set_option, 0, 0, 2) - ZEND_ARG_INFO(0, stream_or_context) - ZEND_ARG_INFO(0, wrappername) - ZEND_ARG_INFO(0, optionname) - ZEND_ARG_INFO(0, value) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO(arginfo_stream_context_set_params, 0) - ZEND_ARG_INFO(0, stream_or_context) - ZEND_ARG_INFO(0, options) /* ARRAY_INFO(0, options, 1) */ -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_context_get_params, 0, ZEND_RETURN_VALUE, 1) - ZEND_ARG_INFO(0, stream_or_context) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_context_get_default, 0, 0, 0) - ZEND_ARG_INFO(0, options) /* ARRAY_INFO(0, options, 1) */ -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO(arginfo_stream_context_set_default, 0) - ZEND_ARG_INFO(0, options) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_context_create, 0, 0, 0) - ZEND_ARG_INFO(0, options) /* ARRAY_INFO(0, options, 1) */ - ZEND_ARG_INFO(0, params) /* ARRAY_INFO(0, params, 1) */ -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_filter_prepend, 0, 0, 2) - ZEND_ARG_INFO(0, stream) - ZEND_ARG_INFO(0, filtername) - ZEND_ARG_INFO(0, read_write) - ZEND_ARG_INFO(0, filterparams) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_filter_append, 0, 0, 2) - ZEND_ARG_INFO(0, stream) - ZEND_ARG_INFO(0, filtername) - ZEND_ARG_INFO(0, read_write) - ZEND_ARG_INFO(0, filterparams) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO(arginfo_stream_filter_remove, 0) - ZEND_ARG_INFO(0, stream_filter) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_get_line, 0, 0, 2) - ZEND_ARG_INFO(0, stream) - ZEND_ARG_INFO(0, maxlen) - ZEND_ARG_INFO(0, ending) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO(arginfo_stream_set_blocking, 0) - ZEND_ARG_INFO(0, socket) - ZEND_ARG_INFO(0, mode) -ZEND_END_ARG_INFO() - -#if HAVE_SYS_TIME_H || defined(PHP_WIN32) -ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_set_timeout, 0, 0, 2) - ZEND_ARG_INFO(0, stream) - ZEND_ARG_INFO(0, seconds) - ZEND_ARG_INFO(0, microseconds) -ZEND_END_ARG_INFO() -#endif - -ZEND_BEGIN_ARG_INFO(arginfo_stream_set_read_buffer, 0) - ZEND_ARG_INFO(0, fp) - ZEND_ARG_INFO(0, buffer) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO(arginfo_stream_set_write_buffer, 0) - ZEND_ARG_INFO(0, fp) - ZEND_ARG_INFO(0, buffer) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO(arginfo_stream_set_chunk_size, 0) - ZEND_ARG_INFO(0, fp) - ZEND_ARG_INFO(0, chunk_size) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_socket_enable_crypto, 0, 0, 2) - ZEND_ARG_INFO(0, stream) - ZEND_ARG_INFO(0, enable) - ZEND_ARG_INFO(0, cryptokind) - ZEND_ARG_INFO(0, sessionstream) -ZEND_END_ARG_INFO() - -#ifdef HAVE_SHUTDOWN -ZEND_BEGIN_ARG_INFO(arginfo_stream_socket_shutdown, 0) - ZEND_ARG_INFO(0, stream) - ZEND_ARG_INFO(0, how) -ZEND_END_ARG_INFO() -#endif -/* }}} */ - static const zend_function_entry basic_functions[] = { /* {{{ */ PHP_FE(constant, arginfo_constant) PHP_FE(bin2hex, arginfo_bin2hex) diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index f2313ff831718..d20f9c0bb7811 100755 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -1171,6 +1171,147 @@ function random_int(int $min, int $max): int {} function soundex(string $string): string|false {} +/* streamsfuncs.c */ + +function stream_select(?array &$read, ?array &$write, ?array &$except, ?int $tv_sec, int $tv_usec = 0): int|false {} + +/** @return resource */ +function stream_context_create(?array $options = null, ?array $params = null) {} + +/** @param resource $context */ +function stream_context_set_params($context, array $params): bool {} + +/** @param resource $context */ +function stream_context_get_params($context): array {} + +/** + * @param resource $context + * @param array|string $param2 + * @param mixed $value + */ +function stream_context_set_option($context, $param2, string $option_name = UNKNOWN, $value = UNKNOWN): bool {} + +/** @param resource $stream_or_context */ +function stream_context_get_options($stream_or_context): array {} + +/** @return resource */ +function stream_context_get_default(array $options = UNKNOWN) {} + +/** @return resource */ +function stream_context_set_default(array $options) {} + +/** + * @param resource $stream + * @param mixed $params + * @return resource|false + */ +function stream_filter_prepend($stream, string $filtername, int $read_write = 0, $params = UNKNOWN) {} + +/** + * @param resource $stream + * @param mixed $params + * @return resource|false + */ +function stream_filter_append($stream, string $filtername, int $read_write = 0, $params = UNKNOWN) {} + +/** @param resource $stream_filter */ +function stream_filter_remove($stream_filter): bool {} + +/** + * @param resource $context + * @return resource|false + */ +function stream_socket_client(string $remote_socket, &$errno = null, &$errstr = null, float $timeout = STREAM_CLIENT_CONNECT, int $flags = UNKNOWN, $context = null) {} + +/** + * @param resource $context + * @return resource|false + */ +function stream_socket_server(string $local_socket, &$errno = null, &$errstr = null, int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $context = null) {} + +/** + * @param resource $server_socket + * @param float $timeout + * @return resource|false + */ +function stream_socket_accept($server_socket, float $timeout = UNKNOWN, &$peername = null) {} + +/** @param resource $handle */ +function stream_socket_get_name($handle, bool $want_peer): string|false {} + +/** @param resource $socket */ +function stream_socket_recvfrom($socket, int $length, int $flags = 0, &$address = null): string|false {} + +/** @param resource $socket */ +function stream_socket_sendto($socket, string $data, int $flags = 0, string $address = ""): int|false {} + +/** + * @param resource $stream + * @param resource $session_stream + */ +function stream_socket_enable_crypto($stream, bool $enable, ?int $crypto_type = null, $session_stream = null): int|bool {} + +#ifdef HAVE_SHUTDOWN +/** @param resource $stream */ +function stream_socket_shutdown($stream, int $how): bool {} +#endif + +#if HAVE_SOCKETPAIR +function stream_socket_pair(int $domain, int $type, int $protocol): array|false {} +#endif + +/** + * @param resource $source + * @param resource $dest + */ +function stream_copy_to_stream($source, $dest, int $maxlength = UNKNOWN, int $position = 0): int|false {} + +/** @param resource $handle */ +function stream_get_contents($handle, int $maxlength = UNKNOWN, int $position = -1): string|false {} + +/** @param resource $stream */ +function stream_supports_lock($stream): bool {} + +/** @param resource $stream */ +function stream_set_write_buffer($stream, int $buffer): int {} + +/** @param resource $stream */ +function stream_set_read_buffer($stream, int $buffer): int {} + +/** @param resource $stream */ +function stream_set_blocking($stream, bool $mode): bool {} + +/** @param resource $stream */ +function stream_get_meta_data($stream): array {} + +/** @param resource $handle */ +function stream_get_line($handle, int $max_length, string $ending = ""): string|false {} + +function stream_resolve_include_path(string $filename): string|false {} + +function stream_get_wrappers(): array|false {} + +function stream_get_transports(): array|false {} + +/** @param mixed $stream */ +function stream_is_local($stream): bool {} + +/** @param resource $stream */ +function stream_isatty($stream): bool {} + +#ifdef PHP_WIN32 +/** @param resource $stream */ +function sapi_windows_vt100_support($stream, bool $enable): bool {} +#endif + +/** @param resource $stream */ +function stream_set_chunk_size($stream, int $size): int {} + +#if HAVE_SYS_TIME_H || defined(PHP_WIN32) +/** @param resource $socket */ +function stream_set_timeout($socket, int $seconds, int $microseconds = 0): bool {} +#endif + /* type.c */ /** @param mixed $var */ @@ -1253,6 +1394,16 @@ function get_headers(string $url, int $format = 0, $context = null): array|false /* user_filters.c */ +class php_user_filter { + public function filter($in, $out, &$consumed, $closing) {} + + /** @return void */ + public function onCreate() {} + + /** @return void */ + public function onClose() {} +} + /** @param resource $brigade */ function stream_bucket_make_writeable($brigade): ?object {} diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index 816e7c2427a21..c0d7f2a45fa2a 100755 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -1819,6 +1819,193 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_soundex, 0, 1, MAY_BE_STRING|MAY ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_select, 0, 4, MAY_BE_LONG|MAY_BE_FALSE) + ZEND_ARG_TYPE_INFO(1, read, IS_ARRAY, 1) + ZEND_ARG_TYPE_INFO(1, write, IS_ARRAY, 1) + ZEND_ARG_TYPE_INFO(1, except, IS_ARRAY, 1) + ZEND_ARG_TYPE_INFO(0, tv_sec, IS_LONG, 1) + ZEND_ARG_TYPE_INFO(0, tv_usec, IS_LONG, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_context_create, 0, 0, 0) + ZEND_ARG_TYPE_INFO(0, options, IS_ARRAY, 1) + ZEND_ARG_TYPE_INFO(0, params, IS_ARRAY, 1) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_context_set_params, 0, 2, _IS_BOOL, 0) + ZEND_ARG_INFO(0, context) + ZEND_ARG_TYPE_INFO(0, params, IS_ARRAY, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_context_get_params, 0, 1, IS_ARRAY, 0) + ZEND_ARG_INFO(0, context) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_context_set_option, 0, 2, _IS_BOOL, 0) + ZEND_ARG_INFO(0, context) + ZEND_ARG_INFO(0, param2) + ZEND_ARG_TYPE_INFO(0, option_name, IS_STRING, 0) + ZEND_ARG_INFO(0, value) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_context_get_options, 0, 1, IS_ARRAY, 0) + ZEND_ARG_INFO(0, stream_or_context) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_context_get_default, 0, 0, 0) + ZEND_ARG_TYPE_INFO(0, options, IS_ARRAY, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_context_set_default, 0, 0, 1) + ZEND_ARG_TYPE_INFO(0, options, IS_ARRAY, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_filter_prepend, 0, 0, 2) + ZEND_ARG_INFO(0, stream) + ZEND_ARG_TYPE_INFO(0, filtername, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, read_write, IS_LONG, 0) + ZEND_ARG_INFO(0, params) +ZEND_END_ARG_INFO() + +#define arginfo_stream_filter_append arginfo_stream_filter_prepend + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_filter_remove, 0, 1, _IS_BOOL, 0) + ZEND_ARG_INFO(0, stream_filter) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_socket_client, 0, 0, 1) + ZEND_ARG_TYPE_INFO(0, remote_socket, IS_STRING, 0) + ZEND_ARG_INFO(1, errno) + ZEND_ARG_INFO(1, errstr) + ZEND_ARG_TYPE_INFO(0, timeout, IS_DOUBLE, 0) + ZEND_ARG_TYPE_INFO(0, flags, IS_LONG, 0) + ZEND_ARG_INFO(0, context) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_socket_server, 0, 0, 1) + ZEND_ARG_TYPE_INFO(0, local_socket, IS_STRING, 0) + ZEND_ARG_INFO(1, errno) + ZEND_ARG_INFO(1, errstr) + ZEND_ARG_TYPE_INFO(0, flags, IS_LONG, 0) + ZEND_ARG_INFO(0, context) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_socket_accept, 0, 0, 1) + ZEND_ARG_INFO(0, server_socket) + ZEND_ARG_TYPE_INFO(0, timeout, IS_DOUBLE, 0) + ZEND_ARG_INFO(1, peername) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_socket_get_name, 0, 2, MAY_BE_STRING|MAY_BE_FALSE) + ZEND_ARG_INFO(0, handle) + ZEND_ARG_TYPE_INFO(0, want_peer, _IS_BOOL, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_socket_recvfrom, 0, 2, MAY_BE_STRING|MAY_BE_FALSE) + ZEND_ARG_INFO(0, socket) + ZEND_ARG_TYPE_INFO(0, length, IS_LONG, 0) + ZEND_ARG_TYPE_INFO(0, flags, IS_LONG, 0) + ZEND_ARG_INFO(1, address) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_socket_sendto, 0, 2, MAY_BE_LONG|MAY_BE_FALSE) + ZEND_ARG_INFO(0, socket) + ZEND_ARG_TYPE_INFO(0, data, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, flags, IS_LONG, 0) + ZEND_ARG_TYPE_INFO(0, address, IS_STRING, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_socket_enable_crypto, 0, 2, MAY_BE_LONG|MAY_BE_BOOL) + ZEND_ARG_INFO(0, stream) + ZEND_ARG_TYPE_INFO(0, enable, _IS_BOOL, 0) + ZEND_ARG_TYPE_INFO(0, crypto_type, IS_LONG, 1) + ZEND_ARG_INFO(0, session_stream) +ZEND_END_ARG_INFO() + +#if defined(HAVE_SHUTDOWN) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_socket_shutdown, 0, 2, _IS_BOOL, 0) + ZEND_ARG_INFO(0, stream) + ZEND_ARG_TYPE_INFO(0, how, IS_LONG, 0) +ZEND_END_ARG_INFO() +#endif + +#if HAVE_SOCKETPAIR +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_socket_pair, 0, 3, MAY_BE_ARRAY|MAY_BE_FALSE) + ZEND_ARG_TYPE_INFO(0, domain, IS_LONG, 0) + ZEND_ARG_TYPE_INFO(0, type, IS_LONG, 0) + ZEND_ARG_TYPE_INFO(0, protocol, IS_LONG, 0) +ZEND_END_ARG_INFO() +#endif + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_copy_to_stream, 0, 2, MAY_BE_LONG|MAY_BE_FALSE) + ZEND_ARG_INFO(0, source) + ZEND_ARG_INFO(0, dest) + ZEND_ARG_TYPE_INFO(0, maxlength, IS_LONG, 0) + ZEND_ARG_TYPE_INFO(0, position, IS_LONG, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_get_contents, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) + ZEND_ARG_INFO(0, handle) + ZEND_ARG_TYPE_INFO(0, maxlength, IS_LONG, 0) + ZEND_ARG_TYPE_INFO(0, position, IS_LONG, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_supports_lock, 0, 1, _IS_BOOL, 0) + ZEND_ARG_INFO(0, stream) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_set_write_buffer, 0, 2, IS_LONG, 0) + ZEND_ARG_INFO(0, stream) + ZEND_ARG_TYPE_INFO(0, buffer, IS_LONG, 0) +ZEND_END_ARG_INFO() + +#define arginfo_stream_set_read_buffer arginfo_stream_set_write_buffer + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_set_blocking, 0, 2, _IS_BOOL, 0) + ZEND_ARG_INFO(0, stream) + ZEND_ARG_TYPE_INFO(0, mode, _IS_BOOL, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_get_meta_data, 0, 1, IS_ARRAY, 0) + ZEND_ARG_INFO(0, stream) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_get_line, 0, 2, MAY_BE_STRING|MAY_BE_FALSE) + ZEND_ARG_INFO(0, handle) + ZEND_ARG_TYPE_INFO(0, max_length, IS_LONG, 0) + ZEND_ARG_TYPE_INFO(0, ending, IS_STRING, 0) +ZEND_END_ARG_INFO() + +#define arginfo_stream_resolve_include_path arginfo_filetype + +#define arginfo_stream_get_wrappers arginfo_net_get_interfaces + +#define arginfo_stream_get_transports arginfo_net_get_interfaces + +#define arginfo_stream_is_local arginfo_stream_supports_lock + +#define arginfo_stream_isatty arginfo_stream_supports_lock + +#if defined(PHP_WIN32) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sapi_windows_vt100_support, 0, 2, _IS_BOOL, 0) + ZEND_ARG_INFO(0, stream) + ZEND_ARG_TYPE_INFO(0, enable, _IS_BOOL, 0) +ZEND_END_ARG_INFO() +#endif + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_set_chunk_size, 0, 2, IS_LONG, 0) + ZEND_ARG_INFO(0, stream) + ZEND_ARG_TYPE_INFO(0, size, IS_LONG, 0) +ZEND_END_ARG_INFO() + +#if HAVE_SYS_TIME_H || defined(PHP_WIN32) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_set_timeout, 0, 2, _IS_BOOL, 0) + ZEND_ARG_INFO(0, socket) + ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0) + ZEND_ARG_TYPE_INFO(0, microseconds, IS_LONG, 0) +ZEND_END_ARG_INFO() +#endif + ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gettype, 0, 1, IS_STRING, 0) ZEND_ARG_INFO(0, var) ZEND_END_ARG_INFO() @@ -1901,6 +2088,17 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_get_headers, 0, 1, MAY_BE_ARRAY| ZEND_ARG_INFO(0, context) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_php_user_filter_filter, 0, 0, 4) + ZEND_ARG_INFO(0, in) + ZEND_ARG_INFO(0, out) + ZEND_ARG_INFO(1, consumed) + ZEND_ARG_INFO(0, closing) +ZEND_END_ARG_INFO() + +#define arginfo_class_php_user_filter_onCreate arginfo_tmpfile + +#define arginfo_class_php_user_filter_onClose arginfo_tmpfile + ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_bucket_make_writeable, 0, 1, IS_OBJECT, 1) ZEND_ARG_INFO(0, brigade) ZEND_END_ARG_INFO() diff --git a/ext/standard/streamsfuncs.c b/ext/standard/streamsfuncs.c index 89d5abd251480..c38010e03014c 100644 --- a/ext/standard/streamsfuncs.c +++ b/ext/standard/streamsfuncs.c @@ -383,8 +383,8 @@ PHP_FUNCTION(stream_socket_recvfrom) } if (to_read <= 0) { - php_error_docref(NULL, E_WARNING, "Length parameter must be greater than 0"); - RETURN_FALSE; + zend_value_error("Length parameter must be greater than 0"); + return; } read_buf = zend_string_alloc(to_read, 0); @@ -493,7 +493,7 @@ PHP_FUNCTION(stream_copy_to_stream) } /* }}} */ -/* {{{ proto array|false stream_get_meta_data(resource fp) +/* {{{ proto array stream_get_meta_data(resource fp) Retrieves header/meta data from streams/file pointers */ PHP_FUNCTION(stream_get_meta_data) { @@ -784,8 +784,8 @@ PHP_FUNCTION(stream_select) } if (!sets) { - php_error_docref(NULL, E_WARNING, "No stream arrays were passed"); - RETURN_FALSE; + zend_value_error("No stream arrays were passed"); + return; } PHP_SAFE_MAX_FD(max_fd, max_set_count); @@ -793,11 +793,11 @@ PHP_FUNCTION(stream_select) /* If seconds is not set to null, build the timeval, else we wait indefinitely */ if (!secnull) { if (sec < 0) { - php_error_docref(NULL, E_WARNING, "The seconds parameter must be greater than 0"); - RETURN_FALSE; + zend_value_error("The seconds parameter must be greater than 0"); + return; } else if (usec < 0) { - php_error_docref(NULL, E_WARNING, "The microseconds parameter must be greater than 0"); - RETURN_FALSE; + zend_value_error("The microseconds parameter must be greater than 0"); + return; } /* Windows, Solaris and BSD do not like microsecond values which are >= 1 sec */ @@ -827,7 +827,7 @@ PHP_FUNCTION(stream_select) retval = php_select(max_fd+1, &rfds, &wfds, &efds, tv_p); if (retval == -1) { - php_error_docref(NULL, E_WARNING, "unable to select [%d]: %s (max_fd=%d)", + php_error_docref(NULL, E_WARNING, "Unable to select [%d]: %s (max_fd=%d)", errno, strerror(errno), max_fd); RETURN_FALSE; } @@ -892,7 +892,8 @@ static int parse_context_options(php_stream_context *context, zval *options) } } ZEND_HASH_FOREACH_END(); } else { - php_error_docref(NULL, E_WARNING, "options should have the form [\"wrappername\"][\"optionname\"] = $value"); + zend_value_error("Options should have the form [\"wrappername\"][\"optionname\"] = $value"); + return FAILURE; } } ZEND_HASH_FOREACH_END(); @@ -918,9 +919,10 @@ static int parse_context_params(php_stream_context *context, zval *params) } if (NULL != (tmp = zend_hash_str_find(Z_ARRVAL_P(params), "options", sizeof("options")-1))) { if (Z_TYPE_P(tmp) == IS_ARRAY) { - parse_context_options(context, tmp); + return parse_context_options(context, tmp); } else { - php_error_docref(NULL, E_WARNING, "Invalid stream/context parameter"); + zend_type_error("Invalid stream/context parameter"); + return FAILURE; } } @@ -957,7 +959,7 @@ static php_stream_context *decode_context_param(zval *contextresource) } /* }}} */ -/* {{{ proto array|false stream_context_get_options(resource context|resource stream) +/* {{{ proto array stream_context_get_options(resource context|resource stream) Retrieve options for a stream/wrapper/context */ PHP_FUNCTION(stream_context_get_options) { @@ -970,8 +972,8 @@ PHP_FUNCTION(stream_context_get_options) context = decode_context_param(zcontext); if (!context) { - php_error_docref(NULL, E_WARNING, "Invalid stream/context parameter"); - RETURN_FALSE; + zend_type_error("Invalid stream/context parameter"); + return; } ZVAL_COPY(return_value, &context->options); @@ -995,8 +997,8 @@ PHP_FUNCTION(stream_context_set_option) /* figure out where the context is coming from exactly */ if (!(context = decode_context_param(zcontext))) { - php_error_docref(NULL, E_WARNING, "Invalid stream/context parameter"); - RETURN_FALSE; + zend_type_error("Invalid stream/context parameter"); + return; } RETURN_BOOL(parse_context_options(context, options) == SUCCESS); @@ -1014,8 +1016,8 @@ PHP_FUNCTION(stream_context_set_option) /* figure out where the context is coming from exactly */ if (!(context = decode_context_param(zcontext))) { - php_error_docref(NULL, E_WARNING, "Invalid stream/context parameter"); - RETURN_FALSE; + zend_type_error("Invalid stream/context parameter"); + return; } RETURN_BOOL(php_stream_context_set_option(context, wrappername, optionname, zvalue) == SUCCESS); @@ -1037,15 +1039,15 @@ PHP_FUNCTION(stream_context_set_params) context = decode_context_param(zcontext); if (!context) { - php_error_docref(NULL, E_WARNING, "Invalid stream/context parameter"); - RETURN_FALSE; + zend_type_error("Invalid stream/context parameter"); + return; } RETVAL_BOOL(parse_context_params(context, params) == SUCCESS); } /* }}} */ -/* {{{ proto array|false stream_context_get_params(resource context|resource stream) +/* {{{ proto array stream_context_get_params(resource context|resource stream) Get parameters of a file context */ PHP_FUNCTION(stream_context_get_params) { @@ -1058,8 +1060,8 @@ PHP_FUNCTION(stream_context_get_params) context = decode_context_param(zcontext); if (!context) { - php_error_docref(NULL, E_WARNING, "Invalid stream/context parameter"); - RETURN_FALSE; + zend_type_error("Invalid stream/context parameter"); + return; } array_init(return_value); @@ -1090,7 +1092,9 @@ PHP_FUNCTION(stream_context_get_default) context = FG(default_context); if (params) { - parse_context_options(context, params); + if (parse_context_options(context, params) == FAILURE) { + return; + } } php_stream_context_to_zval(context, return_value); @@ -1113,7 +1117,9 @@ PHP_FUNCTION(stream_context_set_default) } context = FG(default_context); - parse_context_options(context, options); + if (parse_context_options(context, options) == FAILURE) { + return; + } php_stream_context_to_zval(context, return_value); } @@ -1253,10 +1259,9 @@ PHP_FUNCTION(stream_filter_remove) Z_PARAM_RESOURCE(zfilter) ZEND_PARSE_PARAMETERS_END(); - filter = zend_fetch_resource(Z_RES_P(zfilter), NULL, php_file_le_stream_filter()); + filter = zend_fetch_resource(Z_RES_P(zfilter), "stream filter", php_file_le_stream_filter()); if (!filter) { - php_error_docref(NULL, E_WARNING, "Invalid resource given, not a stream filter"); - RETURN_FALSE; + return; } if (php_stream_filter_flush(filter, 1) == FAILURE) { @@ -1293,8 +1298,8 @@ PHP_FUNCTION(stream_get_line) ZEND_PARSE_PARAMETERS_END(); if (max_length < 0) { - php_error_docref(NULL, E_WARNING, "The maximum allowed length must be greater than or equal to zero"); - RETURN_FALSE; + zend_value_error("The maximum allowed length must be greater than or equal to zero"); + return; } if (!max_length) { max_length = PHP_SOCK_CHUNK_SIZE; @@ -1429,16 +1434,16 @@ PHP_FUNCTION(stream_set_chunk_size) ZEND_PARSE_PARAMETERS_END(); if (csize <= 0) { - php_error_docref(NULL, E_WARNING, "The chunk size must be a positive integer, given " ZEND_LONG_FMT, csize); - RETURN_FALSE; + zend_value_error("The chunk size must be a positive integer, " ZEND_LONG_FMT " given", csize); + return; } /* stream.chunk_size is actually a size_t, but php_stream_set_option * can only use an int to accept the new value and return the old one. * In any case, values larger than INT_MAX for a chunk size make no sense. */ if (csize > INT_MAX) { - php_error_docref(NULL, E_WARNING, "The chunk size cannot be larger than %d", INT_MAX); - RETURN_FALSE; + zend_value_error("The chunk size cannot be larger than %d", INT_MAX); + return; } php_stream_from_zval(stream, zstream); @@ -1504,8 +1509,8 @@ PHP_FUNCTION(stream_socket_enable_crypto) zval *val; if (!GET_CTX_OPT(stream, "ssl", "crypto_method", val)) { - php_error_docref(NULL, E_WARNING, "When enabling encryption you must specify the crypto type"); - RETURN_FALSE; + zend_value_error("When enabling encryption you must specify the crypto type"); + return; } cryptokind = Z_LVAL_P(val); @@ -1679,7 +1684,7 @@ PHP_FUNCTION(sapi_windows_vt100_support) "%s() was not able to analyze the specified stream", get_active_function_name() ); - RETURN_FALSE; + return; } /* Check if the file descriptor is a console */ diff --git a/ext/standard/tests/file/userstreams_002.phpt b/ext/standard/tests/file/userstreams_002.phpt index 3068c93b46c33..41aad59b5d82d 100644 --- a/ext/standard/tests/file/userstreams_002.phpt +++ b/ext/standard/tests/file/userstreams_002.phpt @@ -24,7 +24,7 @@ function test($name, $fd, $return_value) { $w = $e = null; try { var_dump(stream_select($r, $w, $e, 0) !== false); - } catch (TypeError $e) { + } catch (TypeError|ValueError $e) { echo $e->getMessage(), "\n"; } } @@ -55,34 +55,26 @@ bool(true) Warning: stream_select(): test_wrapper_base::stream_cast is not implemented! in %s Warning: stream_select(): cannot represent a stream of type user-space as a select()able descriptor in %s - -Warning: stream_select(): No stream arrays were passed in %s -bool(false) +No stream arrays were passed ------ return value is false: ------- Warning: stream_select(): cannot represent a stream of type user-space as a select()able descriptor in %s - -Warning: stream_select(): No stream arrays were passed in %s -bool(false) +No stream arrays were passed ------ return value not a stream resource: ------- Warning: stream_select(): test_wrapper::stream_cast must return a stream resource in %s Warning: stream_select(): cannot represent a stream of type user-space as a select()able descriptor in %s - -Warning: stream_select(): No stream arrays were passed in %s -stream_select(): supplied argument is not a valid stream resource +No stream arrays were passed ------ return value is stream itself: ------- Warning: stream_select(): test_wrapper::stream_cast must not return itself in %s Warning: stream_select(): cannot represent a stream of type user-space as a select()able descriptor in %s - -Warning: stream_select(): No stream arrays were passed in %s -bool(false) +No stream arrays were passed ------ return value cannot be casted: ------- @@ -91,6 +83,4 @@ Warning: stream_select(): test_wrapper_base::stream_cast is not implemented! in Warning: stream_select(): cannot represent a stream of type user-space as a select()able descriptor in %s Warning: stream_select(): cannot represent a stream of type user-space as a select()able descriptor in %s - -Warning: stream_select(): No stream arrays were passed in %s -bool(false) +No stream arrays were passed diff --git a/ext/standard/tests/filters/stream_filter_remove_error.phpt b/ext/standard/tests/filters/stream_filter_remove_error.phpt index f9d26837c880a..ff93358b31770 100644 --- a/ext/standard/tests/filters/stream_filter_remove_error.phpt +++ b/ext/standard/tests/filters/stream_filter_remove_error.phpt @@ -21,12 +21,20 @@ $filter = stream_filter_append( $fp, "string.rot13", STREAM_FILTER_WRITE ); echo "*** Testing stream_filter_remove() : error conditions ***\n"; echo "\n-- Testing stream_filter_remove() function with bad resource --\n"; -var_dump( stream_filter_remove( $fp ) ); +try { + stream_filter_remove($fp); +} catch (TypeError $exception) { + echo $exception->getMessage() . "\n"; +} echo "\n-- Testing stream_filter_remove() function with an already removed filter --\n"; // Double remove it -var_dump( stream_filter_remove( $filter ) ); -var_dump( stream_filter_remove( $filter ) ); +var_dump(stream_filter_remove( $filter )); +try { + stream_filter_remove($filter); +} catch (TypeError $exception) { + echo $exception->getMessage() . "\n"; +} fclose( $fp ); @@ -38,16 +46,12 @@ $file = __DIR__ . DIRECTORY_SEPARATOR . 'streamfilterTest.txt'; unlink( $file ); ?> ---EXPECTF-- +--EXPECT-- *** Testing stream_filter_remove() : error conditions *** -- Testing stream_filter_remove() function with bad resource -- - -Warning: stream_filter_remove(): Invalid resource given, not a stream filter in %s on line %d -bool(false) +stream_filter_remove(): supplied resource is not a valid stream filter resource -- Testing stream_filter_remove() function with an already removed filter -- bool(true) - -Warning: stream_filter_remove(): Invalid resource given, not a stream filter in %s on line %d -bool(false) +stream_filter_remove(): supplied resource is not a valid stream filter resource diff --git a/ext/standard/tests/streams/bug44712.phpt b/ext/standard/tests/streams/bug44712.phpt index a5a718351fdec..04b7e5ce40921 100644 --- a/ext/standard/tests/streams/bug44712.phpt +++ b/ext/standard/tests/streams/bug44712.phpt @@ -3,7 +3,11 @@ bug#44712 (stream_context_set_params segfaults on invalid arguments) --FILE-- 1)); +try { + stream_context_set_params($ctx, array("options" => 1)); +} catch (TypeError $exception) { + echo $exception->getMessage() . "\n"; +} ?> ---EXPECTF-- -Warning: stream_context_set_params(): Invalid stream/context parameter in %sbug44712.php on line %d +--EXPECT-- +Invalid stream/context parameter diff --git a/ext/standard/tests/streams/bug71884.phpt b/ext/standard/tests/streams/bug71884.phpt index 798c6b643146a..3c5f841b3d3d0 100644 --- a/ext/standard/tests/streams/bug71884.phpt +++ b/ext/standard/tests/streams/bug71884.phpt @@ -4,7 +4,11 @@ Bug #71884 (Null pointer deref (segfault) in stream_context_get_default) getMessage() . "\n"; +} ?> ---EXPECTF-- -Warning: stream_context_get_default(): options should have the form ["wrappername"]["optionname"] = $value in %sbug71884.php on line %d +--EXPECT-- +Options should have the form ["wrappername"]["optionname"] = $value diff --git a/ext/standard/tests/streams/stream_set_chunk_size.phpt b/ext/standard/tests/streams/stream_set_chunk_size.phpt index 9705580902a99..6b90f86cd0a9a 100644 --- a/ext/standard/tests/streams/stream_set_chunk_size.phpt +++ b/ext/standard/tests/streams/stream_set_chunk_size.phpt @@ -49,9 +49,17 @@ echo "should have no effect on writes\n"; var_dump(strlen(fwrite($f, str_repeat('b', 250)))); echo "\nerror conditions\n"; -var_dump(stream_set_chunk_size($f, 0)); -var_dump(stream_set_chunk_size($f, -1)); ---EXPECTF-- +try { + stream_set_chunk_size($f, 0); +} catch (ValueError $exception) { + echo $exception->getMessage() . "\n"; +} +try { + stream_set_chunk_size($f, -1); +} catch (ValueError $exception) { + echo $exception->getMessage() . "\n"; +} +--EXPECT-- bool(true) should return previous chunk size (8192) int(8192) @@ -76,9 +84,5 @@ write with size: 250 int(3) error conditions - -Warning: stream_set_chunk_size(): The chunk size must be a positive integer, given 0 in %s on line %d -bool(false) - -Warning: stream_set_chunk_size(): The chunk size must be a positive integer, given -1 in %s on line %d -bool(false) +The chunk size must be a positive integer, 0 given +The chunk size must be a positive integer, -1 given diff --git a/ext/standard/user_filters.c b/ext/standard/user_filters.c index 18843e85d55fb..383377902fd08 100644 --- a/ext/standard/user_filters.c +++ b/ext/standard/user_filters.c @@ -20,6 +20,7 @@ #include "php_globals.h" #include "ext/standard/basic_functions.h" #include "ext/standard/file.h" +#include "ext/standard/basic_functions_arginfo.h" #define PHP_STREAM_BRIGADE_RES_NAME "userfilter.bucket brigade" #define PHP_STREAM_BUCKET_RES_NAME "userfilter.bucket" @@ -41,23 +42,11 @@ static int le_bucket; PHP_FUNCTION(user_filter_nop) { } -ZEND_BEGIN_ARG_INFO(arginfo_php_user_filter_filter, 0) - ZEND_ARG_INFO(0, in) - ZEND_ARG_INFO(0, out) - ZEND_ARG_INFO(1, consumed) - ZEND_ARG_INFO(0, closing) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO(arginfo_php_user_filter_onCreate, 0) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO(arginfo_php_user_filter_onClose, 0) -ZEND_END_ARG_INFO() static const zend_function_entry user_filter_class_funcs[] = { - PHP_NAMED_FE(filter, PHP_FN(user_filter_nop), arginfo_php_user_filter_filter) - PHP_NAMED_FE(onCreate, PHP_FN(user_filter_nop), arginfo_php_user_filter_onCreate) - PHP_NAMED_FE(onClose, PHP_FN(user_filter_nop), arginfo_php_user_filter_onClose) + PHP_NAMED_FE(filter, PHP_FN(user_filter_nop), arginfo_class_php_user_filter_filter) + PHP_NAMED_FE(onCreate, PHP_FN(user_filter_nop), arginfo_class_php_user_filter_onCreate) + PHP_NAMED_FE(onClose, PHP_FN(user_filter_nop), arginfo_class_php_user_filter_onClose) PHP_FE_END };