@@ -54,7 +54,7 @@ PHP_FUNCTION(stream_socket_client)
54
54
char * hashkey = NULL ;
55
55
php_stream * stream = NULL ;
56
56
int err ;
57
- long flags = 0 ;
57
+ long flags = PHP_STREAM_CLIENT_CONNECT ;
58
58
char * errstr = NULL ;
59
59
php_stream_context * context = NULL ;
60
60
@@ -85,7 +85,7 @@ PHP_FUNCTION(stream_socket_client)
85
85
}
86
86
87
87
stream = php_stream_xport_create (host , host_len , ENFORCE_SAFE_MODE | REPORT_ERRORS ,
88
- STREAM_XPORT_CLIENT | STREAM_XPORT_CONNECT |
88
+ STREAM_XPORT_CLIENT | ( flags & PHP_STREAM_CLIENT_CONNECT ? STREAM_XPORT_CONNECT : 0 ) |
89
89
(flags & PHP_STREAM_CLIENT_ASYNC_CONNECT ? STREAM_XPORT_CONNECT_ASYNC : 0 ),
90
90
hashkey , & tv , context , & errstr , & err );
91
91
@@ -136,7 +136,7 @@ PHP_FUNCTION(stream_socket_server)
136
136
long host_len ;
137
137
zval * zerrno = NULL , * zerrstr = NULL , * zcontext = NULL ;
138
138
php_stream * stream = NULL ;
139
- int err ;
139
+ int err = 0 ;
140
140
long flags = STREAM_XPORT_BIND | STREAM_XPORT_LISTEN ;
141
141
char * errstr = NULL ;
142
142
php_stream_context * context = NULL ;
@@ -266,6 +266,85 @@ PHP_FUNCTION(stream_socket_get_name)
266
266
}
267
267
/* }}} */
268
268
269
+ /* {{{ proto long stream_socket_sendto(resouce stream, string data [, long flags [, string target_addr]])
270
+ Send data to a socket stream. If target_addr is specified it must be in dotted quad (or [ipv6]) format */
271
+ PHP_FUNCTION (stream_socket_sendto )
272
+ {
273
+ php_stream * stream ;
274
+ zval * zstream ;
275
+ long flags = 0 ;
276
+ char * data , * target_addr = NULL ;
277
+ long datalen , target_addr_len = 0 ;
278
+ php_sockaddr_storage sa ;
279
+ socklen_t sl = 0 ;
280
+
281
+ if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "rs|ls" , & zstream , & data , & datalen , & flags , & target_addr , & target_addr_len ) == FAILURE ) {
282
+ RETURN_FALSE ;
283
+ }
284
+ php_stream_from_zval (stream , & zstream );
285
+
286
+ if (target_addr ) {
287
+ /* parse the address */
288
+ if (FAILURE == php_network_parse_network_address_with_port (target_addr , target_addr_len , (struct sockaddr * )& sa , & sl TSRMLS_CC )) {
289
+ php_error_docref (NULL TSRMLS_CC , E_WARNING , "Failed to parse `%s' into a valid network address" , target_addr );
290
+ RETURN_FALSE ;
291
+ }
292
+ }
293
+
294
+ RETURN_LONG (php_stream_xport_sendto (stream , data , datalen , flags , target_addr ? & sa : NULL , sl TSRMLS_CC ));
295
+ }
296
+ /* }}} */
297
+
298
+ /* {{{ proto string stream_socket_recvfrom(resource stream, long amount [, long flags [, string &remote_addr]])
299
+ Receives data from a socket stream */
300
+ PHP_FUNCTION (stream_socket_recvfrom )
301
+ {
302
+ php_stream * stream ;
303
+ zval * zstream , * zremote = NULL ;
304
+ long to_read = 0 ;
305
+ char * read_buf ;
306
+ long flags = 0 ;
307
+ int recvd ;
308
+
309
+ if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "rl|lz" , & zstream , & to_read , & flags , & zremote ) == FAILURE ) {
310
+ RETURN_FALSE ;
311
+ }
312
+
313
+ php_stream_from_zval (stream , & zstream );
314
+
315
+ if (zremote ) {
316
+ zval_dtor (zremote );
317
+ ZVAL_NULL (zremote );
318
+ Z_STRLEN_P (zremote ) = 0 ;
319
+ }
320
+
321
+ read_buf = emalloc (to_read + 1 );
322
+
323
+ recvd = php_stream_xport_recvfrom (stream , read_buf , to_read , flags , NULL , NULL ,
324
+ zremote ? & Z_STRVAL_P (zremote ) : NULL ,
325
+ zremote ? & Z_STRLEN_P (zremote ) : NULL
326
+ TSRMLS_CC );
327
+
328
+ if (recvd >= 0 ) {
329
+ if (zremote && Z_STRLEN_P (zremote )) {
330
+ Z_TYPE_P (zremote ) = IS_STRING ;
331
+ }
332
+ read_buf [recvd ] = '\0' ;
333
+
334
+ if (PG (magic_quotes_runtime )) {
335
+ Z_TYPE_P (return_value ) = IS_STRING ;
336
+ Z_STRVAL_P (return_value ) = php_addslashes (Z_STRVAL_P (return_value ),
337
+ Z_STRLEN_P (return_value ), & Z_STRLEN_P (return_value ), 1 TSRMLS_CC );
338
+ return ;
339
+ } else {
340
+ RETURN_STRINGL (read_buf , recvd , 0 );
341
+ }
342
+ }
343
+
344
+ RETURN_FALSE ;
345
+ }
346
+ /* }}} */
347
+
269
348
/* {{{ proto long stream_get_contents(resource source [, long maxlen ])
270
349
Reads all remaining bytes (or up to maxlen bytes) from a stream and returns them as a string. */
271
350
PHP_FUNCTION (stream_get_contents )
0 commit comments