diff options
| author | Ilia Alshanetsky <iliaa@php.net> | 2005-06-14 02:39:42 +0000 |
|---|---|---|
| committer | Ilia Alshanetsky <iliaa@php.net> | 2005-06-14 02:39:42 +0000 |
| commit | b36d4ae02c918118c9e93ac44f6d792e79a26129 (patch) | |
| tree | 2ed87301a0c68ee1e25423d53e9e159fb3c87d2c /main/network.c | |
| parent | 8d91c1a46d157067406f8f53d961e20e44f4afab (diff) | |
| download | php-git-b36d4ae02c918118c9e93ac44f6d792e79a26129.tar.gz | |
Added bindto socket context option.
Diffstat (limited to 'main/network.c')
| -rw-r--r-- | main/network.c | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/main/network.c b/main/network.c index a89f87c197..bf0ef35d8e 100644 --- a/main/network.c +++ b/main/network.c @@ -722,7 +722,7 @@ PHPAPI php_socket_t php_network_accept_incoming(php_socket_t srvsock, /* {{{ 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 @@ php_socket_t php_network_connect_socket_to_host(const char *host, unsigned short 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); |
