summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rw-r--r--ext/standard/basic_functions.c6
-rw-r--r--ext/standard/file.c4
-rw-r--r--ext/standard/streamsfuncs.c85
-rw-r--r--ext/standard/streamsfuncs.h3
-rw-r--r--ext/standard/tests/network/tcp4loop.phpt2
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) {