cvs: php-src / NEWS /ext/ftp ftp.c /main network.c php_network.h /main/streams xp_socket.c

From: Date: Tue, 14 Jun 2005 02:39:43 +0000
Subject: cvs: php-src / NEWS /ext/ftp ftp.c /main network.c php_network.h /main/streams xp_socket.c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-32259@lists.php.net to get a copy of this message
iliaa Mon Jun 13 22:39:43 2005 EDT Modified files: /php-src/main network.c php_network.h /php-src/main/streams xp_socket.c /php-src/ext/ftp ftp.c /php-src NEWS Log: Added bindto socket context option.

http://cvs.php.net/diff.php/php-src/main/network.c?r1=1.114&r2=1.115&ty=u Index: php-src/main/network.c diff -u php-src/main/network.c:1.114 php-src/main/network.c:1.115 --- php-src/main/network.c:1.114 Wed Oct 6 09:22:21 2004 +++ php-src/main/network.c Mon Jun 13 22:39:42 2005 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: network.c,v 1.114 2004/10/06 13:22:21 hyanantha Exp $ */ +/* $Id: network.c,v 1.115 2005/06/14 02:39:42 iliaa Exp $ */ /*#define DEBUG_MAIN_NETWORK 1*/ @@ -722,7 +722,7 @@ /* {{{ php_network_connect_socket_to_host */ php_socket_t php_network_connect_socket_to_host(const char *host, unsigned short port, int socktype, int asynchronous, struct timeval *timeout, char **error_string, - int *error_code + int *error_code, char *bindto, unsigned short bindport TSRMLS_DC) { int num_addrs, n, fatal = 0; @@ -785,7 +785,39 @@ if (sa) { /* make a connection attempt */ + + if (bindto) { + struct sockaddr local_address; + if (sa->sa_family == AF_INET) { + struct sockaddr_in *in4 = (struct sockaddr_in*)&local_address; + + in4->sin_family = sa->sa_family; + in4->sin_port = htons(bindport); + if (!inet_aton(bindto, &in4->sin_addr)) { + goto bad_ip; + } + bzero(&(in4->sin_zero), 8); + } +#if HAVE_IPV6 && HAVE_INET_PTON + else { /* IPV6 */ + struct sockaddr_in6 *in6 = (struct sockaddr_in6*)&local_address; + + in6->sin6_family = sa->sa_family; + in6->sin6_port = htons(bindport); + if (inet_pton(AF_INET6, bindto, &in6->sin6_addr) < 1) { + goto bad_ip; + } + } +#endif + if (bind(sock, &local_address, sizeof(struct sockaddr))) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "failed to bind to '%s:%d', system said: %s", bindto, bindport, strerror(errno)); + } + goto bind_done; +bad_ip: + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid IP Address: %s", bindto); + } +bind_done: n = php_network_connect_socket(sock, sa, socklen, asynchronous, timeout ? &working_timeout : NULL, error_string, error_code); http://cvs.php.net/diff.php/php-src/main/php_network.h?r1=1.53&r2=1.54&ty=u Index: php-src/main/php_network.h diff -u php-src/main/php_network.h:1.53 php-src/main/php_network.h:1.54 --- php-src/main/php_network.h:1.53 Fri Sep 17 08:44:56 2004 +++ php-src/main/php_network.h Mon Jun 13 22:39:42 2005 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_network.h,v 1.53 2004/09/17 12:44:56 wez Exp $ */ +/* $Id: php_network.h,v 1.54 2005/06/14 02:39:42 iliaa Exp $ */ #ifndef _PHP_NETWORK_H #define _PHP_NETWORK_H @@ -223,7 +223,7 @@ BEGIN_EXTERN_C() PHPAPI php_socket_t php_network_connect_socket_to_host(const char *host, unsigned short port, int socktype, int asynchronous, struct timeval *timeout, char **error_string, - int *error_code + int *error_code, char *bindto, unsigned short bindport TSRMLS_DC); PHPAPI int php_network_connect_socket(php_socket_t sockfd, http://cvs.php.net/diff.php/php-src/main/streams/xp_socket.c?r1=1.30&r2=1.31&ty=u Index: php-src/main/streams/xp_socket.c diff -u php-src/main/streams/xp_socket.c:1.30 php-src/main/streams/xp_socket.c:1.31 --- php-src/main/streams/xp_socket.c:1.30 Fri Sep 17 10:36:55 2004 +++ php-src/main/streams/xp_socket.c Mon Jun 13 22:39:42 2005 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: xp_socket.c,v 1.30 2004/09/17 14:36:55 wez Exp $ */ +/* $Id: xp_socket.c,v 1.31 2005/06/14 02:39:42 iliaa Exp $ */ #include "php.h" #include "ext/standard/file.h" @@ -487,7 +487,7 @@ } #endif -static inline char *parse_ip_address(php_stream_xport_param *xparam, int *portno TSRMLS_DC) +static inline char *parse_ip_address_ex(const char *str, int str_len, int *portno, int get_err, char **err TSRMLS_DC) { char *colon; char *host = NULL; @@ -495,27 +495,27 @@ #ifdef HAVE_IPV6 char *p; - if (*(xparam->inputs.name) == '[') { + if (*(str) == '[') { /* IPV6 notation to specify raw address with port (i.e. [fe80::1]:80) */ - p = memchr(xparam->inputs.name + 1, ']', xparam->inputs.namelen - 2); + p = memchr(str + 1, ']', str_len - 2); if (!p || *(p + 1) != ':') { - if (xparam->want_errortext) { - spprintf(&xparam->outputs.error_text, 0, "Failed to parse IPv6 address \"%s\"", xparam->inputs.name); + if (get_err) { + spprintf(err, 0, "Failed to parse IPv6 address \"%s\"", str); } return NULL; } *portno = atoi(p + 2); - return estrndup(xparam->inputs.name + 1, p - xparam->inputs.name - 1); + return estrndup(str + 1, p - str - 1); } #endif - colon = memchr(xparam->inputs.name, ':', xparam->inputs.namelen - 1); + colon = memchr(str, ':', str_len - 1); if (colon) { *portno = atoi(colon + 1); - host = estrndup(xparam->inputs.name, colon - xparam->inputs.name); + host = estrndup(str, colon - str); } else { - if (xparam->want_errortext) { - spprintf(&xparam->outputs.error_text, 0, "Failed to parse address \"%s\"", xparam->inputs.name); + if (get_err) { + spprintf(err, 0, "Failed to parse address \"%s\"", str); } return NULL; } @@ -523,6 +523,11 @@ return host; } +static inline char *parse_ip_address(php_stream_xport_param *xparam, int *portno TSRMLS_DC) +{ + return parse_ip_address_ex(xparam->inputs.name, xparam->inputs.namelen, portno, xparam->want_errortext, &xparam->outputs.error_text); +} + static inline int php_tcp_sockop_bind(php_stream *stream, php_netstream_data_t *sock, php_stream_xport_param *xparam TSRMLS_DC) { @@ -572,10 +577,11 @@ static inline int php_tcp_sockop_connect(php_stream *stream, php_netstream_data_t *sock, php_stream_xport_param *xparam TSRMLS_DC) { - char *host = NULL; - int portno; + char *host = NULL, *bindto = NULL; + int portno, bindport; int err; int ret; + zval **tmpzval = NULL; #ifdef AF_UNIX if (stream->ops == &php_stream_unix_socket_ops || stream->ops == &php_stream_unixdg_socket_ops) { @@ -610,6 +616,16 @@ return -1; } + if (stream->context && php_stream_context_get_option(stream->context, "socket", "bindto", &tmpzval) == SUCCESS) { + if (Z_TYPE_PP(tmpzval) != IS_STRING) { + if (xparam->want_errortext) { + spprintf(&xparam->outputs.error_text, 0, "local_addr context option is not a string."); + } + return -1; + } + bindto = parse_ip_address_ex(Z_STRVAL_PP(tmpzval), Z_STRLEN_PP(tmpzval), &bindport, xparam->want_errortext, &xparam->outputs.error_text TSRMLS_CC); + } + /* Note: the test here for php_stream_udp_socket_ops is important, because we * want the default to be TCP sockets so that the openssl extension can * re-use this code. */ @@ -619,7 +635,9 @@ xparam->op == STREAM_XPORT_OP_CONNECT_ASYNC, xparam->inputs.timeout, xparam->want_errortext ? &xparam->outputs.error_text : NULL, - &err + &err, + bindto, + bindport TSRMLS_CC); ret = sock->socket == -1 ? -1 : 0; @@ -628,6 +646,9 @@ if (host) { efree(host); } + if (bindto) { + efree(bindto); + } #ifdef AF_UNIX out: http://cvs.php.net/diff.php/php-src/ext/ftp/ftp.c?r1=1.110&r2=1.111&ty=u Index: php-src/ext/ftp/ftp.c diff -u php-src/ext/ftp/ftp.c:1.110 php-src/ext/ftp/ftp.c:1.111 --- php-src/ext/ftp/ftp.c:1.110 Thu Mar 17 12:16:43 2005 +++ php-src/ext/ftp/ftp.c Mon Jun 13 22:39:42 2005 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: ftp.c,v 1.110 2005/03/17 17:16:43 iliaa Exp $ */ +/* $Id: ftp.c,v 1.111 2005/06/14 02:39:42 iliaa Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -136,7 +136,7 @@ ftp->fd = php_network_connect_socket_to_host(host, (unsigned short) (port ? port : 21), SOCK_STREAM, - 0, &tv, NULL, NULL TSRMLS_CC); + 0, &tv, NULL, NULL, NULL, 0 TSRMLS_CC); if (ftp->fd == -1) { goto bail; } http://cvs.php.net/diff.php/php-src/NEWS?r1=1.1917&r2=1.1918&ty=u Index: php-src/NEWS diff -u php-src/NEWS:1.1917 php-src/NEWS:1.1918 --- php-src/NEWS:1.1917 Mon Jun 13 18:20:05 2005 +++ php-src/NEWS Mon Jun 13 22:39:42 2005 @@ -1,6 +1,7 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? Jun 2005, PHP 5.1 Beta 2 +- Added bindto socket context option. (Ilia) - Fixed PDO shutdown problem (possible inifite loop running rollback on shutdown). (Wez) - Fixed PECL bug #3714 (beginTransaction doesn't work if you're in
« previous php.cvs (#32259) next »