diff options
Diffstat (limited to 'ext')
| -rw-r--r-- | ext/standard/basic_functions.c | 6 | ||||
| -rw-r--r-- | ext/standard/file.c | 4 | ||||
| -rw-r--r-- | ext/standard/streamsfuncs.c | 85 | ||||
| -rw-r--r-- | ext/standard/streamsfuncs.h | 3 | ||||
| -rw-r--r-- | ext/standard/tests/network/tcp4loop.phpt | 2 |
5 files changed, 94 insertions, 6 deletions
diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 3e8698af4d..fb1dbbec15 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -731,10 +731,12 @@ function_entry basic_functions[] = { PHP_FE(stream_socket_server, second_and_third_args_force_ref) PHP_FE(stream_socket_accept, third_arg_force_ref) PHP_FE(stream_socket_get_name, NULL) + PHP_FE(stream_socket_recvfrom, fourth_arg_force_ref) + PHP_FE(stream_socket_sendto, NULL) PHP_FE(stream_copy_to_stream, NULL) PHP_FE(stream_get_contents, NULL) PHP_FE(fgetcsv, NULL) - PHP_FE(flock, NULL) + PHP_FE(flock, third_arg_force_ref) PHP_FE(get_meta_tags, NULL) PHP_FE(stream_set_write_buffer, NULL) PHP_FALIAS(set_file_buffer, stream_set_write_buffer, NULL) @@ -1098,7 +1100,7 @@ PHP_MINIT_FUNCTION(basic) REGISTER_LONG_CONSTANT("INI_PERDIR", ZEND_INI_PERDIR, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("INI_SYSTEM", ZEND_INI_SYSTEM, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("INI_ALL", ZEND_INI_ALL, CONST_CS | CONST_PERSISTENT); - + REGISTER_LONG_CONSTANT("SUNFUNCS_RET_TIMESTAMP", SUNFUNCS_RET_TIMESTAMP, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SUNFUNCS_RET_STRING", SUNFUNCS_RET_STRING, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SUNFUNCS_RET_DOUBLE", SUNFUNCS_RET_DOUBLE, CONST_CS | CONST_PERSISTENT); diff --git a/ext/standard/file.c b/ext/standard/file.c index 4b3ec87444..55c0096ba2 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -201,6 +201,10 @@ PHP_MINIT_FUNCTION(file) REGISTER_LONG_CONSTANT("STREAM_CLIENT_PERSISTENT", PHP_STREAM_CLIENT_PERSISTENT, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CLIENT_ASYNC_CONNECT", PHP_STREAM_CLIENT_ASYNC_CONNECT, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("STREAM_CLIENT_CONNECT", PHP_STREAM_CLIENT_CONNECT, CONST_CS | CONST_PERSISTENT); + + REGISTER_LONG_CONSTANT("STREAM_PEEK", STREAM_PEEK, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("STREAM_OOB", STREAM_OOB, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_SERVER_BIND", STREAM_XPORT_BIND, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_SERVER_LISTEN", STREAM_XPORT_LISTEN, CONST_CS | CONST_PERSISTENT); diff --git a/ext/standard/streamsfuncs.c b/ext/standard/streamsfuncs.c index 888efd53db..572aac1cb2 100644 --- a/ext/standard/streamsfuncs.c +++ b/ext/standard/streamsfuncs.c @@ -54,7 +54,7 @@ PHP_FUNCTION(stream_socket_client) char *hashkey = NULL; php_stream *stream = NULL; int err; - long flags = 0; + long flags = PHP_STREAM_CLIENT_CONNECT; char *errstr = NULL; php_stream_context *context = NULL; @@ -85,7 +85,7 @@ PHP_FUNCTION(stream_socket_client) } stream = php_stream_xport_create(host, host_len, ENFORCE_SAFE_MODE | REPORT_ERRORS, - STREAM_XPORT_CLIENT | STREAM_XPORT_CONNECT | + STREAM_XPORT_CLIENT | (flags & PHP_STREAM_CLIENT_CONNECT ? STREAM_XPORT_CONNECT : 0) | (flags & PHP_STREAM_CLIENT_ASYNC_CONNECT ? STREAM_XPORT_CONNECT_ASYNC : 0), hashkey, &tv, context, &errstr, &err); @@ -136,7 +136,7 @@ PHP_FUNCTION(stream_socket_server) long host_len; zval *zerrno = NULL, *zerrstr = NULL, *zcontext = NULL; php_stream *stream = NULL; - int err; + int err = 0; long flags = STREAM_XPORT_BIND | STREAM_XPORT_LISTEN; char *errstr = NULL; php_stream_context *context = NULL; @@ -266,6 +266,85 @@ PHP_FUNCTION(stream_socket_get_name) } /* }}} */ +/* {{{ proto long stream_socket_sendto(resouce stream, string data [, long flags [, string target_addr]]) + Send data to a socket stream. If target_addr is specified it must be in dotted quad (or [ipv6]) format */ +PHP_FUNCTION(stream_socket_sendto) +{ + php_stream *stream; + zval *zstream; + long flags = 0; + char *data, *target_addr = NULL; + long datalen, target_addr_len = 0; + php_sockaddr_storage sa; + socklen_t sl = 0; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|ls", &zstream, &data, &datalen, &flags, &target_addr, &target_addr_len) == FAILURE) { + RETURN_FALSE; + } + php_stream_from_zval(stream, &zstream); + + if (target_addr) { + /* parse the address */ + if (FAILURE == php_network_parse_network_address_with_port(target_addr, target_addr_len, (struct sockaddr*)&sa, &sl TSRMLS_CC)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to parse `%s' into a valid network address", target_addr); + RETURN_FALSE; + } + } + + RETURN_LONG(php_stream_xport_sendto(stream, data, datalen, flags, target_addr ? &sa : NULL, sl TSRMLS_CC)); +} +/* }}} */ + +/* {{{ proto string stream_socket_recvfrom(resource stream, long amount [, long flags [, string &remote_addr]]) + Receives data from a socket stream */ +PHP_FUNCTION(stream_socket_recvfrom) +{ + php_stream *stream; + zval *zstream, *zremote = NULL; + long to_read = 0; + char *read_buf; + long flags = 0; + int recvd; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl|lz", &zstream, &to_read, &flags, &zremote) == FAILURE) { + RETURN_FALSE; + } + + php_stream_from_zval(stream, &zstream); + + if (zremote) { + zval_dtor(zremote); + ZVAL_NULL(zremote); + Z_STRLEN_P(zremote) = 0; + } + + read_buf = emalloc(to_read + 1); + + recvd = php_stream_xport_recvfrom(stream, read_buf, to_read, flags, NULL, NULL, + zremote ? &Z_STRVAL_P(zremote) : NULL, + zremote ? &Z_STRLEN_P(zremote) : NULL + TSRMLS_CC); + + if (recvd >= 0) { + if (zremote && Z_STRLEN_P(zremote)) { + Z_TYPE_P(zremote) = IS_STRING; + } + read_buf[recvd] = '\0'; + + if (PG(magic_quotes_runtime)) { + Z_TYPE_P(return_value) = IS_STRING; + Z_STRVAL_P(return_value) = php_addslashes(Z_STRVAL_P(return_value), + Z_STRLEN_P(return_value), &Z_STRLEN_P(return_value), 1 TSRMLS_CC); + return; + } else { + RETURN_STRINGL(read_buf, recvd, 0); + } + } + + RETURN_FALSE; +} +/* }}} */ + /* {{{ proto long stream_get_contents(resource source [, long maxlen ]) Reads all remaining bytes (or up to maxlen bytes) from a stream and returns them as a string. */ PHP_FUNCTION(stream_get_contents) diff --git a/ext/standard/streamsfuncs.h b/ext/standard/streamsfuncs.h index 8b308985e2..e0fd5e08c4 100644 --- a/ext/standard/streamsfuncs.h +++ b/ext/standard/streamsfuncs.h @@ -21,11 +21,14 @@ /* Flags for stream_socket_client */ #define PHP_STREAM_CLIENT_PERSISTENT 1 #define PHP_STREAM_CLIENT_ASYNC_CONNECT 2 +#define PHP_STREAM_CLIENT_CONNECT 4 PHP_FUNCTION(stream_socket_client); PHP_FUNCTION(stream_socket_server); PHP_FUNCTION(stream_socket_accept); PHP_FUNCTION(stream_socket_get_name); +PHP_FUNCTION(stream_socket_recvfrom); +PHP_FUNCTION(stream_socket_sendto); PHP_FUNCTION(stream_copy_to_stream); PHP_FUNCTION(stream_get_contents); diff --git a/ext/standard/tests/network/tcp4loop.phpt b/ext/standard/tests/network/tcp4loop.phpt index 8bd1c46d7e..afd955918e 100644 --- a/ext/standard/tests/network/tcp4loop.phpt +++ b/ext/standard/tests/network/tcp4loop.phpt @@ -1,7 +1,7 @@ --TEST-- Streams Based IPv4 TCP Loopback test --FILE-- -<?php +<?php # vim:ft=php: /* Setup socket server */ $server = stream_socket_server('tcp://127.0.0.1:31337'); if (!$server) { |
