ports/126527: www/lighttpd Add IPv6 support to mod_proxy
Tilman Linneweh
arved at FreeBSD.org
Thu Aug 14 07:40:02 UTC 2008
>Number: 126527
>Category: ports
>Synopsis: www/lighttpd Add IPv6 support to mod_proxy
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Thu Aug 14 07:40:01 UTC 2008
>Closed-Date:
>Last-Modified:
>Originator: Tilman Linneweh
>Release: FreeBSD 7.0-STABLE i386
>Organization:
>Environment:
System: FreeBSD freefall.freebsd.org 7.0-STABLE FreeBSD 7.0-STABLE #34: Sat Apr 12 11:52:18 UTC 2008 simon at freefall.freebsd.org:/usr/src/sys/i386/compile/FREEFALL i386
>Description:
lighttpd's mod_proxy does not support IPv6.
There has been a patch in lighttpd's trac, which works fine for me:
http://trac.lighttpd.net/trac/ticket/1537
>How-To-Repeat:
>Fix:
--- patch-mod_proxy.c begins here ---
--- src/mod_proxy.c 2007-08-18 03:17:00.000000000 +0500
+++ src/mod_proxy.c 2008-01-27 20:32:05.514825062 +0400
@@ -356,6 +356,7 @@
static int proxy_establish_connection(server *srv, handler_ctx *hctx) {
struct sockaddr *proxy_addr;
struct sockaddr_in proxy_addr_in;
+ struct sockaddr_in6 proxy_addr_in6;
socklen_t servlen;
plugin_data *p = hctx->plugin_data;
@@ -364,12 +365,20 @@
memset(&proxy_addr, 0, sizeof(proxy_addr));
- proxy_addr_in.sin_family = AF_INET;
- proxy_addr_in.sin_addr.s_addr = inet_addr(host->host->ptr);
- proxy_addr_in.sin_port = htons(host->port);
- servlen = sizeof(proxy_addr_in);
+ if (strstr(host->host->ptr,":")) {
+ proxy_addr_in6.sin6_family = AF_INET6;
+ inet_pton(AF_INET6,host->host->ptr,(char *)&proxy_addr_in6.sin6_addr);
+ proxy_addr_in6.sin6_port = htons(host->port);
+ servlen = sizeof(proxy_addr_in6);
+ proxy_addr = (struct sockaddr *) &proxy_addr_in6;
+ } else {
+ proxy_addr_in.sin_family = AF_INET;
+ proxy_addr_in.sin_addr.s_addr = inet_addr(host->host->ptr);
+ proxy_addr_in.sin_port = htons(host->port);
+ servlen = sizeof(proxy_addr_in);
+ proxy_addr = (struct sockaddr *) &proxy_addr_in;
+ }
- proxy_addr = (struct sockaddr *) &proxy_addr_in;
if (-1 == connect(proxy_fd, proxy_addr, servlen)) {
if (errno == EINPROGRESS || errno == EALREADY) {
@@ -740,9 +749,16 @@
switch(hctx->state) {
case PROXY_STATE_INIT:
- if (-1 == (hctx->fd = socket(AF_INET, SOCK_STREAM, 0))) {
+ if (strstr(host->host->ptr,":")) {
+ if (-1 == (hctx->fd = socket(AF_INET6, SOCK_STREAM, 0))) {
+ log_error_write(srv, __FILE__, __LINE__, "ss", "socket failed: ", strerror(errno));
+ return HANDLER_ERROR;
+ }
+ } else {
+ if (-1 == (hctx->fd = socket(AF_INET, SOCK_STREAM, 0))) {
log_error_write(srv, __FILE__, __LINE__, "ss", "socket failed: ", strerror(errno));
return HANDLER_ERROR;
+ }
}
hctx->fde_ndx = -1;
--- patch-mod_proxy.c ends here ---
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list