diff -Nur apache_1.3.26/README.v6 apache_1.3.26-ipv6/README.v6
--- apache_1.3.26/README.v6	Thu Jan  1 09:00:00 1970
+++ apache_1.3.26-ipv6/README.v6	Wed Jun 19 08:05:27 2002
@@ -0,0 +1,173 @@
+IPv6-ready apache 1.3.x
+KAME Project
+$Id: README.v6,v 1.29 2001/03/09 13:15:30 itojun Exp $
+
+This patchkit enables apache 1.3.x to perform HTTP connection over IPv6.
+Most of optional modules are left unchanged, i.e. some of them won't support
+IPv6, and some of them may not compile.
+
+
+CAVEAT: This patchkit may change some of apache module API, to avoid
+IPv4-dependent structure member variable (like use of u_long to hold
+IPv4 address, or whatever).  Therefore, it is almost impossible for the
+IPv6 patch to be used with other module patches, at the same time
+(including mod_ssl, mod_perl and others).  We have no plan to fix it.
+
+http://www.imasy.or.jp/~ume/ipv6/test/ has an experimental patch against
+mod_ssl, which makes SSL over IPv6 work with the patch.
+
+
+Basically you can write IPv6 address where IPv4 address fits.
+
+extra command-line argument:
+	-4	Assume IPv4 address on ambiguous directives
+	-6	Assume IPv6 address on ambiguous directives (default)
+
+	The above two can be used, for example, to disambiguate
+	"BindAddress *".
+
+base commands:
+    Listen
+	Listen is expanded to take one or two arguments.
+		Listen port
+		Listen address:port
+		Listen address port
+	This is to let you specify "Listen :: 80", since "Listen :::80"
+	won't work.
+
+mod_access:
+    deny from
+    allow from
+	"deny from" and "allow from" supports IPv6 addresses, under the
+	following forms:
+		{deny,allow} from v6addr
+		{deny,allow} from v6addr/v6mask
+		{deny,allow} from v6addr/prefixlen
+	Also, wildcard ("*") and string hostname matches IPv6 hosts as well.
+
+mod_proxy:
+    ProxyRequests on
+	http/ftp proxying for both IPv4 and IPv6 is possible.
+	Access control functions (NoProxy) are not updated yet.
+
+	NOTE: for security reasons, we recommend you to filter out
+	outsider's access to your proxy, by directives like below:
+		<Directory proxy:*>
+		order deny,allow
+		deny from all
+		allow from 10.0.0.0/8
+		allow from 3ffe:9999:8888:7777::/64
+		</Directory>
+
+virtual host:
+	If you would like to this feature, you must describe 'Listen'
+	part on configuration file explicitly. like below:
+		Listen :: 80
+		Listen 0.0.0.0 80
+
+    NameVirtualHost
+	NameVirtualHost is expanded to take one more two arguments.
+		NameVirtualHost address
+		NameVirtualHost address:port
+		NameVirtualHost address port
+	This is to let you specify IPv6 address into address part.
+
+	Note that, if colon is found in the specified address string,
+	the code will to resolve the address in the following way:
+	1. try to resolve as address:port (most of IPv6 address fails)
+	2. if (1) is failed, try to resolve as address only
+	If there's ambiguity, i.e. 3ffe:0501::1:2, the address may not be
+	parsed as you expect (3ffe:0501::1 with port 2, or 3ffe:0501::1:2
+	with default port).  To get the right effect you are encouraged
+	to specify it without ambiguity.  In IPv6 case "address port"
+	(specify address and port separated by a space) is the safest way.
+
+    <VirtualHost host:port [host:port ...]>
+	If you would like to specify IPv6 numeric address in host part,
+	use bracketed format like below:
+		<VirtualHost [::1]:80>
+	Note: Now we DO NOT handle old non-bracketed format, 
+		<VirtualHost 0:0:0:0:0:0:0:1:80>
+	      so configuration file must be updated.
+	Note: The following is bad example to specify host ::1 port 80.
+	      This will treated as host ::1:80.
+		<VirtualHost ::1:80>
+
+logresolve (src/support)
+	error statistics in nameserver cache code is omitted.
+
+mod_unique_id
+	Originally mod_unique_id used IPv4 address as a seed for UNIQUE_ID,
+	and took IPv4 address registered onto DNS for the hostname (UNIX
+	hostname taken by gethostname(3)).  Therefore, this does not work
+	for IPv6-only hosts as they do not have IPv4 address for them.
+
+	Now, UNIQUE_ID can be generated using IPv6 address.  IPv6 address can
+	be used as the seed for UNIQUE_ID.
+	Because of this, UNIQUE_ID will be longer than normal apache.  This
+	may cause problem with some of the CGI scripts.
+	The preference of the addresses is based on the order returned
+	by getaddrinfo().  If your getaddrinfo() returns IPv4 address, IPv4
+	adderss will be used as a seed.
+	Note that some of IPv6 addresses are "scoped"; If you happened to use
+	link-local or site-local address as a seed, the UNIQUE_ID may not be
+	worldwide unique.
+
+	If longer UNIQUE_ID causes a problem, define SHORT_UNIQUE_ID in
+	mod_unique_id.c.  In this case, length of UNIQUE_ID will be kept the
+	same.  However, for IPv6 addresses mod_unique_id.c will use the last
+	32bit (not the whole 128bit) as the seed.  Therefore, there can be
+	collision in UNIQUE_ID.
+
+	The behavior should be improved in the near future; we welcome your
+	inputs.
+
+Modules known to be incompatible with IPv6
+	(please report us)
+
+configure
+	Configure has extra option, --enable-rule=INET6.  if the option
+	is specified, IPv6 code will be enabled.
+
+configuration file
+	We do not support IPv4 mapped address (IPv6 address format like
+	::ffff:10.1.1.1) in configuration file. 
+
+This kit assumes that you have working(*) getaddrinfo() and getnameinfo()
+library functions.  Even if you don't have one, don't panic.  We have
+included last-resort version (which support IPv4 only) into the kit.
+For more complete implementation you might want to check BIND 8.2.
+(*) NOTE: we have noticed that some of IPv6 stack is shipped with broken
+getaddrinfo().  In such cases, you should get and install BIND 8.2.
+
+When compiling this kit onto IPv6, you may need to specify some additional
+library paths or cpp defs (like -linet6 or -DINET6).
+Now you don't have to specify --enable-rule=INET6.  The "configure" script
+will give you some warnings if the IPv6 stack is not known to the 
+"configure" script.  Currently, the following IPv6 stacks are supported:
+- KAME IPv6 stack, http://www.kame.net/
+	use configure.v6 for convenience,
+- Linux IPv6 stack, http://www.linux.org/
+	use configure.v6 for convenience.
+- Solaris 8 IPv6 stack, http://www.sun.com/
+	use configure.v6 for convenience.
+To disable IPv6 support, specify --disable-rule=INET6 to the "configure"
+script.
+
+Acknowledgements
+	Thanks to all people submitted patches/fixes for this patch kit,
+	including:
+		"Chris P. Ross" <cross@eng.us.uu.net>
+
+Author contacts
+	Jun-ichiro itojun Hagino, KAME project
+	 http://www.kame.net/
+	 mailto:core@kame.net
+Linux Port
+	Arkadiusz Miskiewicz, Polish Linux Distribution project (IPv6)
+	 http://www.pld.org.pl/
+	 mailto:pld-list@pld.org.pl
+	Satoshi SHIDA, Linux IPv6 Users Group JP
+	 http://www.v6.linux.or.jp/
+	YOSHIFUJI Hideaki, USAGI Project
+	 http://www.linux-ipv6.org/
diff -Nur apache_1.3.26/conf/httpd.conf-dist apache_1.3.26-ipv6/conf/httpd.conf-dist
--- apache_1.3.26/conf/httpd.conf-dist	Wed Mar  6 01:19:12 2002
+++ apache_1.3.26-ipv6/conf/httpd.conf-dist	Wed Jun 19 08:05:27 2002
@@ -174,6 +174,11 @@
 #Listen 3000
 #Listen 12.34.56.78:80
 
+# Listen can take two arguments.
+# (this is an extension for supporting IPv6 addresses)
+#Listen :: 80
+#Listen 0.0.0.0 80
+
 #
 # BindAddress: You can support virtual hosts with this option. This directive
 # is used to tell the server which IP address to listen to. It can either
diff -Nur apache_1.3.26/configure.v6 apache_1.3.26-ipv6/configure.v6
--- apache_1.3.26/configure.v6	Thu Jan  1 09:00:00 1970
+++ apache_1.3.26-ipv6/configure.v6	Wed Jun 19 08:05:27 2002
@@ -0,0 +1,3 @@
+#! /bin/sh
+
+./configure --enable-rule=INET6 --enable-module=proxy $*
diff -Nur apache_1.3.26/src/Configuration.tmpl apache_1.3.26-ipv6/src/Configuration.tmpl
--- apache_1.3.26/src/Configuration.tmpl	Thu Jan 17 22:20:50 2002
+++ apache_1.3.26-ipv6/src/Configuration.tmpl	Wed Jun 19 08:05:27 2002
@@ -187,6 +187,7 @@
 Rule IRIXN32=yes
 Rule PARANOID=no
 Rule EXPAT=default
+Rule INET6=no
 Rule CYGWIN_WINSOCK=no 
 
 # DEV_RANDOM:
diff -Nur apache_1.3.26/src/Configure apache_1.3.26-ipv6/src/Configure
--- apache_1.3.26/src/Configure	Tue Jun 18 14:20:33 2002
+++ apache_1.3.26-ipv6/src/Configure	Wed Jun 19 08:05:28 2002
@@ -238,6 +238,7 @@
 RULE_CYGWIN_WINSOCK=`./helpers/CutRule CYGWIN_WINSOCK $file` 
 RULE_SHARED_CORE=`./helpers/CutRule SHARED_CORE $file`
 RULE_SHARED_CHAIN=`./helpers/CutRule SHARED_CHAIN $file`
+RULE_INET6=`./helpers/CutRule INET6 $file`
 
 ####################################################################
 ## Rule SHARED_CORE implies required DSO support
@@ -1701,6 +1702,124 @@
     esac
 fi
 
+# INET6 support.
+if [ "$RULE_INET6" = "yes" ]; then
+    echo " + enabling INET6 support"
+    CFLAGS="$CFLAGS -DINET6"
+    CFLAGS="$CFLAGS -Dss_family=__ss_family -Dss_len=__ss_len"
+    IPV6_STACKTYPE="UNKNOWN"
+    for i in KAME Linux Solaris; do
+	case "$i" in
+	KAME)
+	    if [ -f /usr/include/netinet6/in6.h -a "x`egrep '__KAME__' /usr/include/netinet6/in6.h 2>/dev/null`" != "x" ]; then
+		IPV6_STACKTYPE=$i
+	    fi
+	    ;;
+	Linux)
+	    if [ /usr/include/netinet/ip6.h -a -d /usr/include/linux ]; then
+		IPV6_STACKTYPE=$i
+	    fi
+	    ;;
+	Solaris)
+	    SOL_VERSION=`(uname -v) 2>/dev/null` || SOL_VERSION="unknown"
+	    case "${PLAT}-${SOL_VERSION}" in
+		*-solaris2.27*-*IPv6*)
+		    if [ -f /etc/hostname -o -f /etc/hostname.[a-z]*[0-9] ]; then
+			IPV6_STACKTYPE="Solaris 7 (${SOL_VERSION})"
+		    fi
+		    ;;
+	    esac
+	    ;;
+	esac
+	if [ "$IPV6_STACKTYPE" != "UNKNOWN" ]; then
+	    break
+	fi
+    done
+    if [ "$IPV6_STACKTYPE" != "UNKNOWN" ]; then
+	echo " + You seem to be using $IPV6_STACKTYPE stack"
+	if ./helpers/TestCompile func getaddrinfo; then
+	    echo "   - Assuming you have working getaddrinfo in libc" 
+	else
+	    if [ -f /usr/local/v6/lib/libinet6.a -a "x`egrep '^EXTRA_L' Makefile.config | grep linet6`" = "x" ]; then
+		LIBS="$LIBS -L/usr/local/v6/lib -linet6"
+		echo "   - using getaddrinfo in libinet6" 
+	    elif [ -f /usr/local/lib/libinet6.a -a "x`egrep '^EXTRA_L' Makefile.config | grep linet6`" = "x" ]; then
+		LIBS="$LIBS -L/usr/local/lib -linet6"
+		echo "   - using getaddrinfo in libinet6"
+	    elif [ -f /usr/inet6/lib/libinet6.a -a "x`egrep '^EXTRA_L' Makefile.config | grep linet6`" = "x" ]; then
+		echo "   - using getaddrinfo in libinet6"
+	    else
+		echo "** WARNING: No getaddrinfo found, linkage may fail" 
+	    fi
+	fi
+    else
+	echo ""
+	echo "** WARNING: We have no explicit knowledge about the IPv6"
+	echo "** implementation on this host.  You may need to specify"
+	echo "** EXTRA_LIBS so that we can find getaddrinfo() and"
+	echo "** getnameinfo() library functions."
+	echo ""
+    fi
+    case $PLAT in
+	*-solaris2* )
+	    LIBS="$LIBS -lresolv"
+	    ;;
+    esac
+else
+    CFLAGS="$CFLAGS -DNEED_GETADDRINFO -DNEED_GETNAMEINFO"
+    if [ -f /usr/include/netdb.h -a "x`egrep 'addrinfo' /usr/include/netdb.h`" = "x" ]; then
+	CFLAGS="$CFLAGS -DNEED_ADDRINFO"
+    fi
+fi
+
+echo '#include <sys/types.h>' >testfunc.c
+echo '#include <sys/socket.h>' >>testfunc.c
+echo 'int testfunc(){ struct sockaddr sa; int i = sa.sa_len; };' >>testfunc.c
+rm -f testfunc.o
+eval "${MAKE-make} -f Makefile.config testfunc.o >/dev/null 2>/dev/null"
+if [ -f testfunc.o ]; then
+    echo " + you have sa_len in struct sockaddr."
+    CFLAGS="$CFLAGS -DHAVE_SOCKADDR_LEN"
+else
+    echo " + you don't have sa_len in struct sockaddr."
+fi
+rm -f testfunc.c testfunc.o
+
+echo '#include <sys/types.h>' >testfunc.c
+echo '#include <sys/socket.h>' >>testfunc.c
+echo 'struct sockaddr_storage sockaddr_storage;' >>testfunc.c
+rm -f testfunc.o
+eval "${MAKE-make} -f Makefile.config testfunc.o >/dev/null 2>/dev/null"
+if [ -f testfunc.o ]; then
+    echo " + assuming you have struct sockaddr_storage"
+else
+    CFLAGS="$CFLAGS -DNEED_SOCKADDR_STORAGE"
+    echo " + you need struct sockaddr_storage"
+fi
+rm -f testfunc.c testfunc.o
+
+echo '#include <sys/types.h>' >testfunc.c
+echo '#include <sys/socket.h>' >>testfunc.c
+echo 'int testfunc(){ socklen_t t; }' >>testfunc.c
+rm -f testfunc.o
+eval "${MAKE-make} -f Makefile.config testfunc.o >/dev/null 2>/dev/null"
+if [ ! -f testfunc.o ]; then
+    CFLAGS="$CFLAGS -Dsocklen_t=int"
+fi
+rm -f testfunc.c testfunc.o
+
+echo '#include <sys/types.h>' >testfunc.c
+echo '#include <sys/socket.h>' >>testfunc.c
+echo 'struct sockaddr_in sin;' >>testfunc.c
+echo 'int main(){ int i = sin.sin_len; }' >>testfunc.c
+rm -f testfunc.o
+eval "${MAKE-make} -f Makefile.config testfunc.o >/dev/null 2>/dev/null"
+if [ -f testfunc.o ]; then
+    CFLAGS="$CFLAGS -DSIN_LEN"
+fi
+rm -f testfunc.c testfunc.o
+
+
 ####################################################################
 ## Find out what modules we want and try and configure things for them
 ## Module lines can look like this:
@@ -2229,6 +2348,38 @@
 echo "#ifndef AP_LONGEST_LONG" >>$AP_CONFIG_AUTO_H
 echo "#define AP_LONGEST_LONG $AP_LONGEST_LONG" >>$AP_CONFIG_AUTO_H
 echo "#endif" >>$AP_CONFIG_AUTO_H
+
+if [ x`./helpers/TestCompile -r sizeof 'uint32_t'` != x"" ]; then
+    echo "" >>$AP_CONFIG_AUTO_H
+    echo "/* determine: use uint32_t as 32bit unsigned int */" >>$AP_CONFIG_AUTO_H
+    echo "#ifndef ap_uint32_t" >>$AP_CONFIG_AUTO_H
+    echo "#define ap_uint32_t uint32_t" >>$AP_CONFIG_AUTO_H
+    echo "#endif" >>$AP_CONFIG_AUTO_H
+    echo "   - use uint32_t as 32bit unsigned int"
+elif [ x`./helpers/TestCompile -r sizeof 'u_int32_t'` != x"" ]; then
+    echo "" >>$AP_CONFIG_AUTO_H
+    echo "/* determine: use u_int32_t as 32bit unsigned int */" >>$AP_CONFIG_AUTO_H
+    echo "#ifndef ap_uint32_t" >>$AP_CONFIG_AUTO_H
+    echo "#define ap_uint32_t u_int32_t" >>$AP_CONFIG_AUTO_H
+    echo "#endif" >>$AP_CONFIG_AUTO_H
+    echo "   - use u_int32_t as 32bit unsigned int"
+elif [ x`./helpers/TestCompile -r sizeof 'unsigned int'` = x"4" ]; then
+    echo "" >>$AP_CONFIG_AUTO_H
+    echo "/* determine: use unsigned int as 32bit unsigned int */" >>$AP_CONFIG_AUTO_H
+    echo "#ifndef ap_uint32_t" >>$AP_CONFIG_AUTO_H
+    echo "#define ap_uint32_t unsigned int" >>$AP_CONFIG_AUTO_H
+    echo "#endif" >>$AP_CONFIG_AUTO_H
+    echo "   - use unsigned int as 32bit unsigned int"
+elif [ x`./helpers/TestCompile -r sizeof 'unsigned long int'` = x"4" ]; then
+    echo "" >>$AP_CONFIG_AUTO_H
+    echo "/* determine: use unsigned long int as 32bit unsigned int */" >>$AP_CONFIG_AUTO_H
+    echo "#ifndef uint32_t" >>$AP_CONFIG_AUTO_H
+    echo "#define uint32_t unsigned long int" >>$AP_CONFIG_AUTO_H
+    echo "#endif" >>$AP_CONFIG_AUTO_H
+    echo "   - use unsigned long int as 32bit unsigned int"
+else
+    echo "  - Warning: cannot determine what type should we use as 32bit unsigned int"
+fi
 
 ####################################################################
 ## More building ap_config_auto.h
diff -Nur apache_1.3.26/src/ap/ap_snprintf.c apache_1.3.26-ipv6/src/ap/ap_snprintf.c
--- apache_1.3.26/src/ap/ap_snprintf.c	Thu Mar 14 21:08:06 2002
+++ apache_1.3.26-ipv6/src/ap/ap_snprintf.c	Wed Jun 19 08:05:29 2002
@@ -76,6 +76,7 @@
 #ifdef WIN32
 #include <float.h>
 #endif
+#include "sa_len.h"
 
 typedef enum {
     NO = 0, YES = 1
@@ -504,6 +505,42 @@
 
 
 
+#ifdef INET6
+static char *conv_sockaddr(struct sockaddr *sa, char *buf_end, int *len)
+{
+    char *p = buf_end;
+    char hostnamebuf[MAXHOSTNAMELEN];
+    char portnamebuf[MAXHOSTNAMELEN];
+    char *q;
+    int salen;
+
+#ifndef SIN6_LEN
+    salen = SA_LEN(sa);
+#else
+    salen = sa->sa_len;
+#endif
+    if (getnameinfo(sa, salen, hostnamebuf, sizeof(hostnamebuf),
+	    portnamebuf, sizeof(portnamebuf), NI_NUMERICHOST | NI_NUMERICSERV)) {
+	strcpy(hostnamebuf, "???");
+	strcpy(portnamebuf, "???");
+    }
+    if (strcmp(portnamebuf,"0") == 0)
+	strcpy(portnamebuf, "*");
+    q = portnamebuf + strlen(portnamebuf);
+    while (portnamebuf < q)
+	*--p = *--q;
+    *--p = ':';
+    q = hostnamebuf + strlen(hostnamebuf);
+    while (hostnamebuf < q)
+	*--p = *--q;
+
+    *len = buf_end - p;
+    return (p);
+}
+#endif /*INET6*/
+
+
+
 /*
  * Convert a floating point number to a string formats 'f', 'e' or 'E'.
  * The result is placed in buf, and len denotes the length of the string
@@ -1055,6 +1092,7 @@
 		    /* print a struct sockaddr_in as a.b.c.d:port */
 		case 'I':
 		    {
+#ifndef INET6
 			struct sockaddr_in *si;
 
 			si = va_arg(ap, struct sockaddr_in *);
@@ -1063,6 +1101,16 @@
 			    if (adjust_precision && precision < s_len)
 				s_len = precision;
 			}
+#else
+			struct sockaddr *sa;
+
+			sa = va_arg(ap, struct sockaddr *);
+			if (sa != NULL) {
+			    s = conv_sockaddr(sa, &num_buf[NUM_BUF_SIZE], &s_len);
+			    if (adjust_precision && precision < s_len)
+				s_len = precision;
+			}
+#endif
 			else {
 			    s = S_NULL;
 			    s_len = S_NULL_LEN;
diff -Nur apache_1.3.26/src/include/ap.h apache_1.3.26-ipv6/src/include/ap.h
--- apache_1.3.26/src/include/ap.h	Tue Jun 18 13:19:45 2002
+++ apache_1.3.26-ipv6/src/include/ap.h	Wed Jun 19 08:05:29 2002
@@ -95,7 +95,8 @@
  * with some extensions.  The extensions are:
  *
  * %pA	takes a struct in_addr *, and prints it as a.b.c.d
- * %pI	takes a struct sockaddr_in * and prints it as a.b.c.d:port
+ * %pI	takes a struct sockaddr * and prints it as a.b.c.d:port, or
+ *	ipv6-numeric-addr:port
  * %pp  takes a void * and outputs it in hex
  *
  * The %p hacks are to force gcc's printf warning code to skip
diff -Nur apache_1.3.26/src/include/ap_config.h apache_1.3.26-ipv6/src/include/ap_config.h
--- apache_1.3.26/src/include/ap_config.h	Mon Jun  3 21:28:27 2002
+++ apache_1.3.26-ipv6/src/include/ap_config.h	Wed Jun 19 08:05:29 2002
@@ -407,6 +407,10 @@
 #endif
 #ifndef S_IWOTH
 #define S_IWOTH 000002
+#ifndef rlim_t
+typedef int rlim_t;
+#endif
+typedef u_long n_long;
 #endif
 
 #define STDIN_FILENO  0
@@ -1507,6 +1511,70 @@
 
 #ifndef ap_wait_t
 #define ap_wait_t int
+#endif
+
+#ifndef INET6
+#define sockaddr_storage	sockaddr
+#define ss_family		sa_family
+#define ss_len			sa_len
+#else
+#include "sockaddr_storage.h"	/* sshida@st.rim.or.jp */
+#endif
+
+#ifndef INET6_ADDRSTRLEN
+#define INET6_ADDRSTRLEN	46
+#endif
+#ifndef INET_ADDRSTRLEN
+#define INET_ADDRSTRLEN		16
+#endif
+#ifndef NI_MAXHOST
+#define NI_MAXHOST		1025
+#endif
+#ifndef NI_MAXSERV
+#define	NI_MAXSERV		32
+#endif
+
+#if defined(NEED_GETADDRINFO) || defined(NEED_GETNAMEINFO)
+/*
+ * minimal definitions for fake getaddrinfo()/getnameinfo().
+ */
+#ifndef EAI_NODATA
+#define EAI_NODATA	1
+#define EAI_MEMORY	2
+#endif
+
+#ifndef AI_PASSIVE
+#define AI_PASSIVE	1
+#define AI_CANONNAME	2
+#define AI_NUMERICHOST	4
+#define NI_NUMERICHOST	8
+#define NI_NAMEREQD	16
+#define NI_NUMERICSERV	32
+#endif
+#endif
+
+#ifdef NEED_GETADDRINFO
+#ifdef NEED_ADDRINFO
+struct addrinfo {
+	int	ai_flags;	/* AI_PASSIVE, AI_CANONNAME */
+	int	ai_family;	/* PF_xxx */
+	int	ai_socktype;	/* SOCK_xxx */
+	int	ai_protocol;	/* 0 or IPPROTO_xxx for IPv4 and IPv6 */
+	size_t	ai_addrlen;	/* length of ai_addr */
+	char	*ai_canonname;	/* canonical name for hostname */
+	struct sockaddr *ai_addr;	/* binary address */
+	struct addrinfo *ai_next;	/* next structure in linked list */
+};
+#endif
+extern char *gai_strerror(int ecode);
+extern void freeaddrinfo(struct addrinfo *ai);
+extern int getaddrinfo(const char *hostname, const char *servname,
+	const struct addrinfo *hints, struct addrinfo **res);
+#endif
+#ifdef NEED_GETNAMEINFO
+extern int getnameinfo(const struct sockaddr *sa, size_t salen,
+	char *host, size_t hostlen, char *serv, size_t servlen,
+	int flag);
 #endif
 
 #ifdef __cplusplus
diff -Nur apache_1.3.26/src/include/http_conf_globals.h apache_1.3.26-ipv6/src/include/http_conf_globals.h
--- apache_1.3.26/src/include/http_conf_globals.h	Thu Mar 14 06:05:29 2002
+++ apache_1.3.26-ipv6/src/include/http_conf_globals.h	Wed Jun 19 08:05:29 2002
@@ -82,7 +82,8 @@
 extern API_VAR_EXPORT int ap_max_requests_per_child;
 extern API_VAR_EXPORT int ap_threads_per_child;
 extern API_VAR_EXPORT int ap_excess_requests_per_child;
-extern API_VAR_EXPORT struct in_addr ap_bind_address;
+extern struct sockaddr_storage ap_bind_address;
+extern API_VAR_EXPORT int ap_default_family;
 extern listen_rec *ap_listeners;
 extern API_VAR_EXPORT int ap_daemons_to_start;
 extern API_VAR_EXPORT int ap_daemons_min_free;
diff -Nur apache_1.3.26/src/include/http_vhost.h apache_1.3.26-ipv6/src/include/http_vhost.h
--- apache_1.3.26/src/include/http_vhost.h	Thu Mar 14 06:05:29 2002
+++ apache_1.3.26-ipv6/src/include/http_vhost.h	Wed Jun 19 08:05:29 2002
@@ -73,7 +73,7 @@
 API_EXPORT(const char *) ap_parse_vhost_addrs(pool *p, const char *hostname, server_rec *s);
 
 /* handle NameVirtualHost directive */
-API_EXPORT_NONSTD(const char *) ap_set_name_virtual_host (cmd_parms *cmd, void *dummy, char *arg);
+API_EXPORT_NONSTD(const char *) ap_set_name_virtual_host (cmd_parms *cmd, void *dummy, char *h, char *p);
 
 /* given an ip address only, give our best guess as to what vhost it is */
 API_EXPORT(void) ap_update_vhost_given_ip(conn_rec *conn);
diff -Nur apache_1.3.26/src/include/httpd.h apache_1.3.26-ipv6/src/include/httpd.h
--- apache_1.3.26/src/include/httpd.h	Wed Jun 19 03:14:02 2002
+++ apache_1.3.26-ipv6/src/include/httpd.h	Wed Jun 19 08:05:29 2002
@@ -64,6 +64,13 @@
 #endif
 
 /*
+ * Define APACHE6 so that additional modules depending on Apache can
+ * tell if this a pacthed apache-1.3.*. With this definition apache6
+ * is working together with e.g. the ap-perl module in NetBSD.
+ */
+#define APACHE6 1
+
+/*
  * httpd.h: header for simple (ha! not anymore) http daemon
  */
 
@@ -866,8 +873,8 @@
 
     /* Who is the client? */
 
-    struct sockaddr_in local_addr;	/* local address */
-    struct sockaddr_in remote_addr;	/* remote address */
+    struct sockaddr_storage local_addr;	/* local address */
+    struct sockaddr_storage remote_addr; /* remote address */
     char *remote_ip;		/* Client's IP address */
     char *remote_host;		/* Client's DNS name, if known.
 				 * NULL if DNS hasn't been checked,
@@ -906,8 +913,8 @@
 typedef struct server_addr_rec server_addr_rec;
 struct server_addr_rec {
     server_addr_rec *next;
-    struct in_addr host_addr;	/* The bound address, for this server */
-    unsigned short host_port;	/* The bound port, for this server */
+    struct sockaddr_storage host_addr;	/* The bound address, for this server */
+    unsigned short host_port;	/* The bound port, for this server XXX */
     char *virthost;		/* The name given in <VirtualHost> */
 };
 
@@ -971,7 +978,7 @@
 /* These are more like real hosts than virtual hosts */
 struct listen_rec {
     listen_rec *next;
-    struct sockaddr_in local_addr;	/* local IP address and port */
+    struct sockaddr_storage local_addr;	/* local IP address and port */
     int fd;
     int used;			/* Only used during restart */        
 /* more stuff here, like which protocol is bound to the port */
@@ -1139,7 +1146,7 @@
 #endif /*#ifdef CHARSET_EBCDIC*/
 
 API_EXPORT(char *) ap_get_local_host(pool *);
-API_EXPORT(unsigned long) ap_get_virthost_addr(char *hostname, unsigned short *port);
+API_EXPORT(struct sockaddr *) ap_get_virthost_addr(char *hostname, unsigned short *port);
 
 extern API_VAR_EXPORT time_t ap_restart_time;
 
diff -Nur apache_1.3.26/src/include/sa_len.h apache_1.3.26-ipv6/src/include/sa_len.h
--- apache_1.3.26/src/include/sa_len.h	Thu Jan  1 09:00:00 1970
+++ apache_1.3.26-ipv6/src/include/sa_len.h	Wed Jun 19 08:05:29 2002
@@ -0,0 +1,41 @@
+/* sa_len.h : tiny version of SA_LEN (written by <yoshfuji@ecei.tohoku.ac.jp>) */
+ 
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <sys/un.h>
+
+#ifndef HAVE_SOCKADDR_LEN
+#ifndef SA_LEN
+#define SA_LEN(s_)	ap_sa_len((s_)->sa_family)
+
+static NET_SIZE_T ap_sa_len (sa_family_t af)
+{
+    switch (af){
+#if defined(AF_INET)
+    case AF_INET:
+	return (sizeof(struct sockaddr_in));
+#endif /* AF_INET */
+#if defined(AF_INET6)
+    case AF_INET6:
+	return (sizeof(struct sockaddr_in6));
+#endif
+#ifdef AF_LOCAL
+    case AF_LOCAL:
+#endif /* AF_LOCAL */
+#if defined(AF_UNIX) && (AF_UNIX != AF_LOCAL)
+    case AF_UNIX:
+#endif /* AF_UNIX */
+#if defined(AF_FILE) && (AF_FILE != AF_LOCAL || AF_FILE != AF_UNIX)
+    case AF_FILE:
+#endif /* AF_FILE */
+#if defined(AF_LOCAL) || defined(AF_UNIX) || defined(AF_FILE)
+	return (sizeof(struct sockaddr_un));
+#endif /* defined(AF_LOCAL) || defined(AF_UNIX) || defined(AF_FILE) */
+    default:
+	return 0;
+    }
+    return 0;
+}
+#endif /* SA_LEN */
+#endif /* HAVE_SOCKADDR_LEN */
diff -Nur apache_1.3.26/src/include/sockaddr_storage.h apache_1.3.26-ipv6/src/include/sockaddr_storage.h
--- apache_1.3.26/src/include/sockaddr_storage.h	Thu Jan  1 09:00:00 1970
+++ apache_1.3.26-ipv6/src/include/sockaddr_storage.h	Wed Jun 19 08:05:30 2002
@@ -0,0 +1,53 @@
+/*
+struct sockaddr_storage
+
+   RFC2553 proposes struct sockaddr_storage.
+   This is a placeholder for all sockaddr-variant structures. This is
+   implemented like follows:
+
+   You should use this structure to hold any of sockaddr-variant
+   structures.
+*/
+#ifdef NEED_SOCKADDR_STORAGE
+
+struct sockaddr_storage {
+#ifdef HAVE_SOCKADDR_LEN
+	u_char ss_len;
+	u_char ss_family;
+#else
+	u_short ss_family;
+#endif
+	u_char __padding[128 - 2];
+};
+
+/*
+union sockunion
+
+   Alternatively, you may want to implement sockunion.h, with the
+   following content:
+
+   NOTE: For better portability, struct sockaddr_storage should be used.
+   union sockunion is okay, but is not really portable enough.
+*/
+union sockunion {
+	struct sockinet {
+#ifdef HAVE_SOCKADDR_LEN
+		u_char si_len;
+		u_char si_family;
+#else
+		u_short si_family;
+#endif
+		u_short si_port;
+	} su_si;
+	struct sockaddr_in  su_sin;
+#ifdef INET6
+	struct sockaddr_in6 su_sin6;
+#endif
+};
+#ifdef HAVE_SOCKADDR_LEN
+#define su_len		su_si.si_len
+#endif
+#define su_family	su_si.si_family
+#define su_port		su_si.si_port
+
+#endif /* NEED_SOCKADDR_STORAGE */
diff -Nur apache_1.3.26/src/main/getaddrinfo.c apache_1.3.26-ipv6/src/main/getaddrinfo.c
--- apache_1.3.26/src/main/getaddrinfo.c	Thu Jan  1 09:00:00 1970
+++ apache_1.3.26-ipv6/src/main/getaddrinfo.c	Wed Jun 19 08:05:30 2002
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project.
+ * All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the project nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+/*
+ * fake library for ssh v6 enabler patch
+ *
+ * This file includes getaddrinfo(), freeaddrinfo() and gai_strerror().
+ * These funtions are defined in rfc2133.
+ *
+ * But these functions are not implemented correctly. The minimum subset
+ * is implemented for ssh use only. For exapmle, this routine assumes
+ * that ai_family is AF_INET. Don't use it for another purpose.
+ * 
+ * In the case not using 'configure --enable-ipv6', this getaddrinfo.c
+ * will be used if you have broken getaddrinfo or no getaddrinfo.
+ */
+
+#if 0
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#include "gai.h"
+#endif
+
+static struct addrinfo *
+malloc_ai(port, addr, socktype, protocol)
+int port;
+u_long addr;
+int socktype;
+int protocol;
+{
+  struct addrinfo *ai;
+
+  if (ai = (struct addrinfo *)malloc(sizeof(struct addrinfo) +
+				     sizeof(struct sockaddr_in))) {
+    memset(ai, 0, sizeof(struct addrinfo) + sizeof(struct sockaddr_in));
+    ai->ai_addr = (struct sockaddr *)(ai + 1);
+#if defined(HAVE_SOCKADDR_LEN)
+    ai->ai_addr->sa_len = 
+#endif
+      ai->ai_addrlen = sizeof(struct sockaddr_in);
+    ai->ai_addr->sa_family = ai->ai_family = AF_INET;
+    ai->ai_socktype = socktype;
+    ai->ai_protocol = protocol;
+    ((struct sockaddr_in *)(ai)->ai_addr)->sin_port = port;
+    ((struct sockaddr_in *)(ai)->ai_addr)->sin_addr.s_addr = addr;
+    return ai;
+  } else {
+    return NULL;
+  }
+}
+
+char *
+gai_strerror(ecode)
+int ecode;
+{
+  switch (ecode) {
+  case EAI_NODATA:
+    return "no address associated with hostname.";
+  case EAI_MEMORY:
+    return "memory allocation failure.";
+  default:
+    return "unknown error.";
+  }
+}    
+
+void
+freeaddrinfo(ai)
+struct addrinfo *ai;
+{
+  struct addrinfo *next;
+  
+  do {
+    next = ai->ai_next;
+    free(ai);
+  } while (ai = next);
+}
+
+int
+getaddrinfo(hostname, servname, hints, res)
+const char *hostname, *servname;
+const struct addrinfo *hints;
+struct addrinfo **res;
+{
+  struct addrinfo *cur, *prev = NULL;
+  struct hostent *hp;
+  int i, port;
+  
+  if (servname)
+    port = htons(atoi(servname));
+  else
+    port = 0;
+  if (hints && hints->ai_flags & AI_PASSIVE)
+    if (*res = malloc_ai(port, htonl(0x00000000), 
+			 res->ai_socktype ? res->ai_socktype : SOCK_STREAM,
+			 res->ai_protocol))
+      return 0;
+    else
+      return EAI_MEMORY;
+  if (!hostname)
+    if (*res = malloc_ai(port, htonl(0x7f000001),
+			 res->ai_socktype ? res->ai_socktype : SOCK_STREAM,
+			 res->ai_protocol))
+      return 0;
+    else
+      return EAI_MEMORY;
+  if (inet_addr(hostname) != -1)
+    if (*res = malloc_ai(port, inet_addr(hostname),
+			 res->ai_socktype ? res->ai_socktype : SOCK_STREAM,
+			 res->ai_protocol))
+      return 0;
+    else
+      return EAI_MEMORY;
+  if ((hp = gethostbyname(hostname)) &&
+      hp->h_name && hp->h_name[0] && hp->h_addr_list[0]) {
+    for (i = 0; hp->h_addr_list[i]; i++)
+      if (cur = malloc_ai(port,
+			  ((struct in_addr *)hp->h_addr_list[i])->s_addr,
+			  res->ai_socktype ? res->ai_socktype : SOCK_STREAM,
+			  res->ai_protocol)) {
+	if (prev)
+	  prev->ai_next = cur;
+	else
+	  *res = cur;
+	prev = cur;
+      } else {
+	if (*res)
+	  freeaddrinfo(*res);
+	return EAI_MEMORY;
+      }
+    return 0;
+  }
+  return EAI_NODATA;
+}
diff -Nur apache_1.3.26/src/main/getnameinfo.c apache_1.3.26-ipv6/src/main/getnameinfo.c
--- apache_1.3.26/src/main/getnameinfo.c	Thu Jan  1 09:00:00 1970
+++ apache_1.3.26-ipv6/src/main/getnameinfo.c	Wed Jun 19 08:05:30 2002
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project.
+ * All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the project nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+/*
+ * fake library for ssh v6 enabler patch
+ *
+ * This file includes getnameinfo().
+ * These funtions are defined in rfc2133.
+ *
+ * But these functions are not implemented correctly. The minimum subset
+ * is implemented for ssh use only. For exapmle, this routine assumes
+ * that ai_family is AF_INET. Don't use it for another purpose.
+ * 
+ * In the case not using 'configure --enable-ipv6', this getnameinfo.c
+ * will be used if you have broken getnameinfo or no getnameinfo.
+ */
+
+#if 0
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <string.h>
+#include "gai.h"
+#endif
+
+int
+getnameinfo(sa, salen, host, hostlen, serv, servlen, flags)
+const struct sockaddr *sa;
+size_t salen;
+char *host;
+size_t hostlen;
+char *serv;
+size_t servlen;
+int flags;
+{
+  struct sockaddr_in *sin = (struct sockaddr_in *)sa;
+  struct hostent *hp;
+  char tmpserv[16];
+  
+  if (serv) {
+    sprintf(tmpserv, "%d", ntohs(sin->sin_port));
+    if (strlen(tmpserv) > servlen)
+      return EAI_MEMORY;
+    else
+      strcpy(serv, tmpserv);
+  }
+  if (host)
+    if (flags & NI_NUMERICHOST)
+      if (strlen(inet_ntoa(sin->sin_addr)) > hostlen)
+	return EAI_MEMORY;
+      else {
+	strcpy(host, inet_ntoa(sin->sin_addr));
+	return 0;
+      }
+    else
+      if (hp = gethostbyaddr((char *)&sin->sin_addr, sizeof(struct in_addr),
+			     AF_INET))
+	if (strlen(hp->h_name) > hostlen)
+	  return EAI_MEMORY;
+	else {
+	  strcpy(host, hp->h_name);
+	  return 0;
+	}
+      else
+	return EAI_NODATA;
+  return 0;
+}
diff -Nur apache_1.3.26/src/main/http_config.c apache_1.3.26-ipv6/src/main/http_config.c
--- apache_1.3.26/src/main/http_config.c	Thu Mar 14 06:05:30 2002
+++ apache_1.3.26-ipv6/src/main/http_config.c	Wed Jun 19 08:05:30 2002
@@ -1510,7 +1510,6 @@
     ap_scoreboard_fname = DEFAULT_SCOREBOARD;
     ap_lock_fname = DEFAULT_LOCKFILE;
     ap_max_requests_per_child = DEFAULT_MAX_REQUESTS_PER_CHILD;
-    ap_bind_address.s_addr = htonl(INADDR_ANY);
     ap_listeners = NULL;
     ap_listenbacklog = DEFAULT_LISTENBACKLOG;
     ap_extended_status = 0;
@@ -1543,7 +1542,13 @@
     s->next = NULL;
     s->addrs = ap_pcalloc(p, sizeof(server_addr_rec));
     /* NOT virtual host; don't match any real network interface */
-    s->addrs->host_addr.s_addr = htonl(INADDR_ANY);
+    memset(&s->addrs->host_addr, 0, sizeof(s->addrs->host_addr));
+#if 0
+    s->addrs->host_addr.ss_family = ap_default_family; /* XXX: needed?, XXX: PF_xxx can be different from AF_xxx */
+#endif
+#ifdef HAVE_SOCKADDR_LEN
+    s->addrs->host_addr.ss_len = sizeof(s->addrs->host_addr); /* XXX: needed ? */
+#endif
     s->addrs->host_port = 0;	/* matches any port */
     s->addrs->virthost = "";	/* must be non-NULL */
     s->names = s->wild_names = NULL;
@@ -1558,21 +1563,36 @@
 static void default_listeners(pool *p, server_rec *s)
 {
     listen_rec *new;
+    struct addrinfo hints, *res0, *res;
+    int gai;
+    char servbuf[NI_MAXSERV];
 
     if (ap_listeners != NULL) {
 	return;
     }
+     ap_snprintf(servbuf, sizeof(servbuf), "%d", s->port ? s->port : DEFAULT_HTTP_PORT);
+     memset (&hints, 0, sizeof(hints));
+     hints.ai_family = ap_default_family;
+     hints.ai_socktype = SOCK_STREAM;
+     hints.ai_flags = AI_PASSIVE;
+     gai = getaddrinfo(NULL, servbuf, &hints, &res0);
+     if (gai){
+       fprintf(stderr, "default_listeners(): getaddrinfo(PASSIVE) for family %u: %s\n",
+               ap_default_family, gai_strerror(gai));
+       exit (1);
+     }
+
     /* allocate a default listener */
     new = ap_pcalloc(p, sizeof(listen_rec));
-    new->local_addr.sin_family = AF_INET;
-    new->local_addr.sin_addr = ap_bind_address;
-    /* Buck ugly cast to get around terniary op bug in some (MS) compilers */
-    new->local_addr.sin_port = htons((unsigned short)(s->port ? s->port 
-                                                        : DEFAULT_HTTP_PORT));
+     memcpy(&new->local_addr, res0->ai_addr, res0->ai_addrlen);
+
     new->fd = -1;
     new->used = 0;
     new->next = NULL;
     ap_listeners = new;
+
+     freeaddrinfo(res0);
+
 }
 
 
diff -Nur apache_1.3.26/src/main/http_core.c apache_1.3.26-ipv6/src/main/http_core.c
--- apache_1.3.26/src/main/http_core.c	Tue Jun 18 09:59:57 2002
+++ apache_1.3.26-ipv6/src/main/http_core.c	Wed Jun 19 08:13:07 2002
@@ -71,6 +71,7 @@
 #include "util_md5.h"
 #include "scoreboard.h"
 #include "fnmatch.h"
+#include "sa_len.h"
 
 #ifdef USE_MMAP_FILES
 #include <sys/mman.h>
@@ -638,7 +639,9 @@
  */
 static ap_inline void do_double_reverse (conn_rec *conn)
 {
-    struct hostent *hptr;
+    struct addrinfo hints, *res, *res0;
+    char hostbuf1[128], hostbuf2[128]; /* INET6_ADDRSTRLEN(=46) is enough */
+    int ok = 0;
 
     if (conn->double_reverse) {
 	/* already done */
@@ -650,19 +653,43 @@
         conn->remote_host = ""; /* prevent another lookup */
 	return;
     }
-    hptr = gethostbyname(conn->remote_host);
-    if (hptr) {
-	char **haddr;
-
-	for (haddr = hptr->h_addr_list; *haddr; haddr++) {
-	    if (((struct in_addr *)(*haddr))->s_addr
-		== conn->remote_addr.sin_addr.s_addr) {
-		conn->double_reverse = 1;
-		return;
-	    }
+    memset(&hints, 0, sizeof(hints));
+    hints.ai_family = PF_UNSPEC;
+    hints.ai_socktype = SOCK_STREAM;
+    if (getaddrinfo(conn->remote_host, NULL, &hints, &res0)) {
+      conn->double_reverse = -1;
+      return;
+    }
+    for (res = res0; res; res = res->ai_next) {
+      if (res->ai_addr->sa_family != conn->remote_addr.ss_family ||
+          !(res->ai_family == AF_INET
+#ifdef INET6
+            || res->ai_family == AF_INET6
+#endif
+            )
+          )
+          continue;
+#ifndef HAVE_SOCKADDR_LEN
+      if (res->ai_addrlen != SA_LEN((struct sockaddr *)&conn->remote_addr))
+#else
+      if (res->ai_addr->sa_len != conn->remote_addr.ss_len)
+#endif
+          continue;
+      if (getnameinfo(res->ai_addr, res->ai_addrlen,
+            hostbuf1, sizeof(hostbuf1), NULL, 0,
+            NI_NUMERICHOST))
+          continue;
+      if (getnameinfo(((struct sockaddr *)&conn->remote_addr), res->ai_addrlen,
+            hostbuf2, sizeof(hostbuf2), NULL, 0,
+            NI_NUMERICHOST))
+          continue;
+      if (strcmp(hostbuf1, hostbuf2) == 0){
+          ok = 1;
+          break;
 	}
     }
-    conn->double_reverse = -1;
+    conn->double_reverse = ok ? 1 : -1;
+    freeaddrinfo(res0);
     /* invalidate possible reverse-resolved hostname if forward lookup fails */
     conn->remote_host = "";
 }
@@ -670,10 +697,9 @@
 API_EXPORT(const char *) ap_get_remote_host(conn_rec *conn, void *dir_config,
 					    int type)
 {
-    struct in_addr *iaddr;
-    struct hostent *hptr;
     int hostname_lookups;
     int old_stat = SERVER_DEAD;	/* we shouldn't ever be in this state */
+    char hostnamebuf[MAXHOSTNAMELEN];
 
     /* If we haven't checked the host name, and we want to */
     if (dir_config) {
@@ -695,10 +721,14 @@
 	    || hostname_lookups != HOSTNAME_LOOKUP_OFF)) {
 	old_stat = ap_update_child_status(conn->child_num, SERVER_BUSY_DNS,
 					  (request_rec*)NULL);
-	iaddr = &(conn->remote_addr.sin_addr);
-	hptr = gethostbyaddr((char *)iaddr, sizeof(struct in_addr), AF_INET);
-	if (hptr != NULL) {
-	    conn->remote_host = ap_pstrdup(conn->pool, (void *)hptr->h_name);
+	if (!getnameinfo((struct sockaddr *)&conn->remote_addr,
+#ifndef SIN6_LEN
+		SA_LEN((struct sockaddr *)&conn->remote_addr),
+#else
+		conn->remote_addr.ss_len,
+#endif
+		hostnamebuf, sizeof(hostnamebuf), NULL, 0, 0)) {
+	    conn->remote_host = ap_pstrdup(conn->pool, (void *)hostnamebuf);
 	    ap_str_tolower(conn->remote_host);
 	   
 	    if (hostname_lookups == HOSTNAME_LOOKUP_DOUBLE) {
@@ -776,6 +806,7 @@
 {
     conn_rec *conn = r->connection;
     core_dir_config *d;
+    char hbuf[MAXHOSTNAMELEN];
 
     d = (core_dir_config *)ap_get_module_config(r->per_dir_config,
 						&core_module);
@@ -785,23 +816,22 @@
     }
     if (d->use_canonical_name == USE_CANONICAL_NAME_DNS) {
         if (conn->local_host == NULL) {
-	    struct in_addr *iaddr;
-	    struct hostent *hptr;
             int old_stat;
 	    old_stat = ap_update_child_status(conn->child_num,
 					      SERVER_BUSY_DNS, r);
-	    iaddr = &(conn->local_addr.sin_addr);
-	    hptr = gethostbyaddr((char *)iaddr, sizeof(struct in_addr),
-				 AF_INET);
-	    if (hptr != NULL) {
-	        conn->local_host = ap_pstrdup(conn->pool,
-					      (void *)hptr->h_name);
-		ap_str_tolower(conn->local_host);
-	    }
-	    else {
-	        conn->local_host = ap_pstrdup(conn->pool,
-					      r->server->server_hostname);
+	    if (getnameinfo((struct sockaddr *)&conn->local_addr,
+#ifndef SIN6_LEN
+		    SA_LEN((struct sockaddr *)&conn->local_addr),
+#else
+		    conn->local_addr.ss_len,
+#endif
+		    hbuf, sizeof(hbuf), NULL, 0, 0) == 0) {
+		conn->local_host = ap_pstrdup(conn->pool, hbuf);
+	    } else {
+		conn->local_host = ap_pstrdup(conn->pool,
+		    r->server->server_hostname);
 	    }
+	    ap_str_tolower(conn->local_host);
 	    (void) ap_update_child_status(conn->child_num, old_stat, r);
 	}
 	return conn->local_host;
@@ -820,11 +850,13 @@
 
     if (d->use_canonical_name == USE_CANONICAL_NAME_OFF
 	|| d->use_canonical_name == USE_CANONICAL_NAME_DNS) {
-        return r->hostname ? ntohs(r->connection->local_addr.sin_port)
-			   : port;
-    }
-    /* default */
-    return port;
+        return r->hostname
+	    ?  ntohs(((struct sockaddr_in *)&r->connection->local_addr)->sin_port)
+	    : port;
+    }
+    return r->hostname
+	? ntohs(((struct sockaddr_in *)&r->connection->local_addr)->sin_port)
+	: port;
 }
 
 API_EXPORT(char *) ap_construct_url(pool *p, const char *uri,
@@ -2556,12 +2588,25 @@
 
 static const char *set_bind_address(cmd_parms *cmd, void *dummy, char *arg) 
 {
+    struct addrinfo hints, *res;
+    struct sockaddr *sa;
+    size_t sa_len;
+    int error;
     const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
     if (err != NULL) {
         return err;
     }
 
-    ap_bind_address.s_addr = ap_get_virthost_addr(arg, NULL);
+    if (strcmp(arg, "*") == 0)
+      arg = NULL;
+
+    sa = ap_get_virthost_addr(arg, NULL);
+#ifdef HAVE_SOCKADDR_LEN
+    sa_len = sa->sa_len;
+#else
+    sa_len = SA_LEN(sa);
+#endif
+    memcpy(&ap_bind_address, &sa, sa_len);
     return NULL;
 }
 
@@ -2593,44 +2638,70 @@
     return NULL;
 }
 
-static const char *set_listener(cmd_parms *cmd, void *dummy, char *ips)
+static const char *set_listener(cmd_parms *cmd, void *dummy, char *h, char *p)
 {
     listen_rec *new;
-    char *ports;
-    unsigned short port;
+    char *host, *port;
+    struct addrinfo hints, *res;
+    int error;
     
     const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
     if (err != NULL) {
         return err;
     }
 
-    ports = strchr(ips, ':');
-    if (ports != NULL) {
-	if (ports == ips) {
-	    return "Missing IP address";
-	}
-	else if (ports[1] == '\0') {
-	    return "Address must end in :<port-number>";
+    host = port = NULL;
+    if (!p) {
+	port = strrchr(h, ':');
+	if (port != NULL) {
+	    if (port == h) {
+		return "Missing IP address";
+	    }
+	    else if (port[1] == '\0') {
+		return "Address must end in :<port-number>";
+	    }
+	    *(port++) = '\0';
+	    if (*h)
+		host = h;
+	} else {
+	    host = NULL;
+	    port = h;
 	}
-	*(ports++) = '\0';
-    }
-    else {
-	ports = ips;
+    } else {
+	host = h;
+	port = p;
     }
 
-    new=ap_pcalloc(cmd->pool, sizeof(listen_rec));
-    new->local_addr.sin_family = AF_INET;
-    if (ports == ips) { /* no address */
-	new->local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
-    }
-    else {
-	new->local_addr.sin_addr.s_addr = ap_get_virthost_addr(ips, NULL);
-    }
-    port = atoi(ports);
-    if (!port) {
-	return "Port must be numeric";
+    if (host && strcmp(host, "*") == 0)
+	host = NULL;
+    
+    new = ap_pcalloc(cmd->pool, sizeof(listen_rec));
+
+    memset(&hints, 0, sizeof(hints));
+    hints.ai_family = host ? PF_UNSPEC : ap_default_family;
+    hints.ai_flags = AI_PASSIVE;
+    hints.ai_socktype = SOCK_STREAM;
+    error = getaddrinfo(host, port, &hints, &res);
+    if (error || !res) {
+	fprintf(stderr, "could not resolve ");
+	if (host)
+	    fprintf(stderr, "host \"%s\" ", host);
+	if (port)
+	    fprintf(stderr, "port \"%s\" ", port);
+	fprintf(stderr, "--- %s\n", gai_strerror(error));
+	exit(1);
+    }
+    if (res->ai_next) {
+        if (host)
+	    fprintf(stderr, "host \"%s\" ", host);
+	if (port)
+	    fprintf(stderr, "port \"%s\" ", port);
+	fprintf(stderr, "resolved to multiple addresses, ambiguous.\n");
+	exit(1);
     }
-    new->local_addr.sin_port = htons(port);
+
+    memcpy(&new->local_addr, res->ai_addr, res->ai_addrlen);
+
     new->fd = -1;
     new->used = 0;
     new->next = ap_listeners;
@@ -3353,7 +3424,7 @@
 { "ThreadStackSize", set_threadstacksize, NULL, RSRC_CONF, TAKE1,
   "Stack size each created thread will use."},
 #endif
-{ "Listen", set_listener, NULL, RSRC_CONF, TAKE1,
+{ "Listen", set_listener, NULL, RSRC_CONF, TAKE12,
   "A port number or a numeric IP address and a port number"},
 { "SendBufferSize", set_send_buffer_size, NULL, RSRC_CONF, TAKE1,
   "Send buffer size in bytes"},
@@ -3387,7 +3458,7 @@
   "Name of the config file to be included" },
 { "LogLevel", set_loglevel, NULL, RSRC_CONF, TAKE1,
   "Level of verbosity in error logging" },
-{ "NameVirtualHost", ap_set_name_virtual_host, NULL, RSRC_CONF, TAKE1,
+{ "NameVirtualHost", ap_set_name_virtual_host, NULL, RSRC_CONF, TAKE12,
   "A numeric IP address:port, or the name of a host" },
 #ifdef _OSD_POSIX
 { "BS2000Account", set_bs2000_account, NULL, RSRC_CONF, TAKE1,
diff -Nur apache_1.3.26/src/main/http_main.c apache_1.3.26-ipv6/src/main/http_main.c
--- apache_1.3.26/src/main/http_main.c	Wed Jun  5 13:53:15 2002
+++ apache_1.3.26-ipv6/src/main/http_main.c	Wed Jun 19 08:20:08 2002
@@ -124,6 +124,8 @@
 #include <bstring.h>		/* for IRIX, FD_SET calls bzero() */
 #endif
 
+#include "sa_len.h"
+
 #ifdef MULTITHREAD
 /* special debug stuff -- PCS */
 
@@ -249,7 +251,13 @@
 API_VAR_EXPORT char *ap_scoreboard_fname=NULL;
 API_VAR_EXPORT char *ap_lock_fname=NULL;
 API_VAR_EXPORT char *ap_server_argv0=NULL;
-API_VAR_EXPORT struct in_addr ap_bind_address={0};
+#ifdef INET6
+API_VAR_EXPORT int ap_default_family = PF_INET6;
+#else
+API_VAR_EXPORT int ap_default_family = PF_INET;
+#endif
+struct sockaddr_storage ap_bind_address;
+
 API_VAR_EXPORT int ap_daemons_to_start=0;
 API_VAR_EXPORT int ap_daemons_min_free=0;
 API_VAR_EXPORT int ap_daemons_max_free=0;
@@ -1351,7 +1359,11 @@
 #ifdef WIN32
     fprintf(stderr, "Usage: %s [-D name] [-d directory] [-f file] [-n service]\n", bin);
     fprintf(stderr, "       %s [-C \"directive\"] [-c \"directive\"] [-k signal]\n", pad);
-    fprintf(stderr, "       %s [-v] [-V] [-h] [-l] [-L] [-S] [-t] [-T]\n", pad);
+    fprintf(stderr, "       %s [-v] [-V] [-h] [-l] [-L] [-S] [-t] [-T]"
+#ifdef INET6
+                      " [-46]"
+#endif
+                      "\n", pad);
 #else /* !WIN32 */
 #ifdef SHARED_CORE
     fprintf(stderr, "Usage: %s [-R directory] [-D name] [-d directory] [-f file]\n", bin);
@@ -1382,6 +1394,10 @@
 #endif
     fprintf(stderr, "  -t               : run syntax check for config files (with docroot check)\n");
     fprintf(stderr, "  -T               : run syntax check for config files (without docroot check)\n");
+#ifdef INET6
+    fprintf(stderr, "  -4               : assume IPv4 on parsing configuration file\n");
+    fprintf(stderr, "  -6               : assume IPv6 on parsing configuration file\n");
+#endif
 #ifndef WIN32
     fprintf(stderr, "  -F               : run main process in foreground, for process supervisors\n");
 #endif
@@ -3546,11 +3562,13 @@
 
 
 static conn_rec *new_connection(pool *p, server_rec *server, BUFF *inout,
-			     const struct sockaddr_in *remaddr,
-			     const struct sockaddr_in *saddr,
+			     const struct sockaddr *remaddr,
+			     const struct sockaddr *saddr,
 			     int child_num)
 {
     conn_rec *conn = (conn_rec *) ap_pcalloc(p, sizeof(conn_rec));
+    char hostnamebuf[MAXHOSTNAMELEN];
+    size_t addr_len;
 
     /* Got a connection structure, so initialize what fields we can
      * (the rest are zeroed out by pcalloc).
@@ -3559,17 +3577,29 @@
     conn->child_num = child_num;
 
     conn->pool = p;
-    conn->local_addr = *saddr;
-    conn->local_ip = ap_pstrdup(conn->pool,
-				inet_ntoa(conn->local_addr.sin_addr));
+#ifndef SIN6_LEN
+    addr_len = SA_LEN(saddr);
+#else
+    addr_len = saddr->sa_len;
+#endif
+    memcpy(&conn->local_addr, saddr, addr_len);
+    getnameinfo((struct sockaddr *)&conn->local_addr, addr_len,
+	hostnamebuf, sizeof(hostnamebuf), NULL, 0, NI_NUMERICHOST);
+    conn->local_ip = ap_pstrdup(conn->pool, hostnamebuf);
     conn->server = server; /* just a guess for now */
     ap_update_vhost_given_ip(conn);
     conn->base_server = conn->server;
     conn->client = inout;
 
-    conn->remote_addr = *remaddr;
-    conn->remote_ip = ap_pstrdup(conn->pool,
-			      inet_ntoa(conn->remote_addr.sin_addr));
+#ifndef SIN6_LEN
+    addr_len = SA_LEN(remaddr);
+#else
+    addr_len = remaddr->sa_len;
+#endif
+    memcpy(&conn->remote_addr, remaddr, addr_len);
+    getnameinfo((struct sockaddr *)&conn->remote_addr, addr_len,
+	hostnamebuf, sizeof(hostnamebuf), NULL, 0, NI_NUMERICHOST);
+    conn->remote_ip = ap_pstrdup(conn->pool, hostnamebuf);
 
     return conn;
 }
@@ -3602,21 +3632,47 @@
 #define sock_disable_nagle(s)	/* NOOP */
 #endif
 
-static int make_sock(pool *p, const struct sockaddr_in *server)
+static int make_sock(pool *p, const struct sockaddr *server)
 {
     int s;
     int one = 1;
-    char addr[512];
+    char addr[INET6_ADDRSTRLEN + 128];
+    char a0[INET6_ADDRSTRLEN];
+    char p0[NI_MAXSERV];
+#ifdef MPE
+    int privport = 0;
+#endif
 
-    if (server->sin_addr.s_addr != htonl(INADDR_ANY))
-	ap_snprintf(addr, sizeof(addr), "address %s port %d",
-		inet_ntoa(server->sin_addr), ntohs(server->sin_port));
-    else
-	ap_snprintf(addr, sizeof(addr), "port %d", ntohs(server->sin_port));
+    switch(server->sa_family){
+    case AF_INET:
+#ifdef INET6
+    case AF_INET6:
+#endif
+      break;
+    default:
+      ap_log_error(APLOG_MARK, APLOG_CRIT, server_conf,
+                   "make_sock: unsupported address family %u", 
+		   server->sa_family);
+      ap_unblock_alarms();
+      exit(1);
+    }
+    
+    getnameinfo(server,
+#ifndef SIN6_LEN
+		SA_LEN(server),
+#else
+		server->sa_len,
+#endif
+		a0, sizeof(a0), p0, sizeof(p0), NI_NUMERICHOST | NI_NUMERICSERV);
+    ap_snprintf(addr, sizeof(addr), "address %s port %s", a0, p0);
+#ifdef MPE
+    if (atoi(p0) < 1024)
+      privport++;
+#endif
 
     /* note that because we're about to slack we don't use psocket */
     ap_block_alarms();
-    if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
+    if ((s = socket(server->sa_family, SOCK_STREAM, IPPROTO_TCP)) == -1) {
 	    ap_log_error(APLOG_MARK, APLOG_CRIT, server_conf,
 		    "make_sock: failed to get a socket for %s", addr);
 
@@ -3719,15 +3775,19 @@
 
 #ifdef MPE
 /* MPE requires CAP=PM and GETPRIVMODE to bind to ports less than 1024 */
-    if (ntohs(server->sin_port) < 1024)
+    if (privport)
 	GETPRIVMODE();
 #endif
-
-    if (bind(s, (struct sockaddr *) server, sizeof(struct sockaddr_in)) == -1) {
+#ifndef SIN6_LEN
+    if (bind(s, server, SA_LEN(server)) == -1)
+#else
+    if (bind(s, server, server->sa_len) == -1)
+#endif
+    {
 	ap_log_error(APLOG_MARK, APLOG_CRIT, server_conf,
 	    "make_sock: could not bind to %s", addr);
 #ifdef MPE
-	if (ntohs(server->sin_port) < 1024)
+	if (privport)
 	    GETUSERMODE();
 #endif
 
@@ -3740,7 +3800,7 @@
 	exit(1);
     }
 #ifdef MPE
-    if (ntohs(server->sin_port) < 1024)
+    if (privport)
 	GETUSERMODE();
 #endif
 
@@ -3893,15 +3953,17 @@
     for (;;) {
 	fd = find_listener(lr);
 	if (fd < 0) {
-	    fd = make_sock(p, &lr->local_addr);
+	    fd = make_sock(p, (struct sockaddr *)&lr->local_addr);
 	}
 	else {
 	    ap_note_cleanups_for_socket(p, fd);
 	}
 	/* if we get here, (fd >= 0) && (fd < FD_SETSIZE) */
-	FD_SET(fd, &listenfds);
-	if (fd > listenmaxfd)
-	    listenmaxfd = fd;
+	if (fd >= 0) {
+	    FD_SET(fd, &listenfds);
+	    if (fd > listenmaxfd)
+		listenmaxfd = fd;
+	}
 	lr->fd = fd;
 	if (lr->next == NULL)
 	    break;
@@ -4191,8 +4253,8 @@
 static void child_main(int child_num_arg)
 {
     NET_SIZE_T clen;
-    struct sockaddr sa_server;
-    struct sockaddr sa_client;
+    struct sockaddr_storage sa_server;
+    struct sockaddr_storage sa_client;
     listen_rec *lr;
 
     /* All of initialization is a critical section, we don't care if we're
@@ -4364,7 +4426,7 @@
 	    usr1_just_die = 0;
 	    for (;;) {
 		clen = sizeof(sa_client);
-		csd = ap_accept(sd, &sa_client, &clen);
+		csd = ap_accept(sd, (struct sockaddr *)&sa_client, &clen);
 		if (csd >= 0 || errno != EINTR)
 		    break;
 		if (deferred_die) {
@@ -4527,7 +4589,7 @@
 	 */
 
 	clen = sizeof(sa_server);
-	if (getsockname(csd, &sa_server, &clen) < 0) {
+	if (getsockname(csd, (struct sockaddr *)&sa_server, &clen) < 0) {
 	    ap_log_error(APLOG_MARK, APLOG_ERR, server_conf, "getsockname");
 	    continue;
 	}
@@ -4572,8 +4634,8 @@
 	ap_bpushfd(conn_io, csd, dupped_csd);
 
 	current_conn = new_connection(ptrans, server_conf, conn_io,
-				          (struct sockaddr_in *) &sa_client,
-				          (struct sockaddr_in *) &sa_server,
+				          (struct sockaddr *)&sa_client,
+				          (struct sockaddr *)&sa_server,
 				          my_child_num);
 
 	/*
@@ -4719,12 +4781,13 @@
 
 #ifdef _OSD_POSIX
     /* BS2000 requires a "special" version of fork() before a setuid() call */
-    if ((pid = os_fork(ap_user_name)) == -1) {
+    if ((pid = os_fork(ap_user_name)) == -1)
 #elif defined(TPF)
-    if ((pid = os_fork(s, slot)) == -1) {
+    if ((pid = os_fork(s, slot)) == -1)
 #else
-    if ((pid = fork()) == -1) {
+    if ((pid = fork()) == -1)
 #endif
+    {
 	ap_log_error(APLOG_MARK, APLOG_ERR, s, "fork: Unable to fork new process");
 
 	/* fork didn't succeed. Fix the scoreboard or else
@@ -5337,6 +5400,10 @@
 
     while ((c = getopt(argc, argv,
 				    "D:C:c:xXd:Ff:vVlLR:StTh"
+                                  "D:C:c:xXd:f:vVlLR:StTh4"
+#ifdef INET6
+                                  "6"
+#endif
 #ifdef DEBUG_SIGSTOP
 				    "Z:"
 #endif
@@ -5414,8 +5481,14 @@
 	    ap_configtestonly = 1;
 	    ap_docrootcheck = 0;
 	    break;
-	case 'h':
-	    usage(argv[0]);
+	case '4':
+	    ap_default_family = PF_INET;
+	    break;
+#ifdef INET6
+	case '6':
+	    ap_default_family = PF_INET6;
+	    break;
+#endif
 	case '?':
 	    usage(argv[0]);
 	}
@@ -5488,9 +5561,10 @@
     else {
 	conn_rec *conn;
 	request_rec *r;
-	struct sockaddr sa_server, sa_client;
 	BUFF *cio;
+	struct sockaddr_storage sa_server, sa_client;
 	NET_SIZE_T l;
+	char servbuf[NI_MAXSERV];
 
 	ap_set_version();
 	/* Yes this is called twice. */
@@ -5545,25 +5619,32 @@
 #endif
 
 	l = sizeof(sa_client);
-	if ((getpeername(sock_in, &sa_client, &l)) < 0) {
+	if ((getpeername(sock_in, (struct sockaddr *)&sa_client, &l)) < 0) {
 /* get peername will fail if the input isn't a socket */
 	    perror("getpeername");
 	    memset(&sa_client, '\0', sizeof(sa_client));
 	}
 
 	l = sizeof(sa_server);
-	if (getsockname(sock_in, &sa_server, &l) < 0) {
+	if (getsockname(sock_in, (struct sockaddr *)&sa_server, &l) < 0) {
 	    perror("getsockname");
 	    fprintf(stderr, "Error getting local address\n");
 	    exit(1);
 	}
-	server_conf->port = ntohs(((struct sockaddr_in *) &sa_server)->sin_port);
+	if (getnameinfo(((struct sockaddr *)&sa_server), l,
+			NULL, 0, servbuf, sizeof(servbuf), 
+			NI_NUMERICSERV)){
+	    fprintf(stderr, "getnameinfo(): family=%d\n", sa_server.ss_family);
+	    exit(1);
+	}
+	servbuf[sizeof(servbuf)-1] = '\0';
+	server_conf->port = atoi(servbuf);
 	cio = ap_bcreate(ptrans, B_RDWR | B_SOCKET);
         cio->fd = sock_out;
         cio->fd_in = sock_in;
 	conn = new_connection(ptrans, server_conf, cio,
-			          (struct sockaddr_in *) &sa_client,
-			          (struct sockaddr_in *) &sa_server, -1);
+			          (struct sockaddr *)&sa_client,
+			          (struct sockaddr *)&sa_server, -1);
 
 	while ((r = ap_read_request(conn)) != NULL) {
 
@@ -7260,7 +7341,12 @@
 
     while ((c = getopt(argc, argv, "D:C:c:Xd:f:vVlLz:Z:wiuStThk:n:W:")) != -1) {
 #else /* !WIN32 */
-    while ((c = getopt(argc, argv, "D:C:c:Xd:fF:vVlLesStTh")) != -1) {
+    while ((c = getopt(argc, argv, "D:C:c:Xd:fF:vVlLesStTh4"
+#ifdef INET6
+              "6"
+#endif
+              )) != -1) {
+
 #endif
         char **new;
 	switch (c) {
@@ -7799,6 +7885,10 @@
 	case 't':
 	case 'T':
 	case 'h':
+	case '4':
+#ifdef INET6
+	case '6':
+#endif
 	case '?':
 	    break;
 	case 'R':
diff -Nur apache_1.3.26/src/main/http_vhost.c apache_1.3.26-ipv6/src/main/http_vhost.c
--- apache_1.3.26/src/main/http_vhost.c	Thu Mar 14 06:05:31 2002
+++ apache_1.3.26-ipv6/src/main/http_vhost.c	Wed Jun 19 08:05:32 2002
@@ -68,6 +68,7 @@
 #include "http_log.h"
 #include "http_vhost.h"
 #include "http_protocol.h"
+#include "sa_len.h"
 
 /*
  * After all the definitions there's an explanation of how it's all put
@@ -165,78 +166,114 @@
  * *paddr is the variable used to keep track of **paddr between calls
  * port is the default port to assume
  */
-static const char *get_addresses(pool *p, char *w, server_addr_rec ***paddr,
-			    unsigned port)
+static const char *get_addresses(pool *p, char *w, char *pstr,
+	server_addr_rec ***paddr, unsigned port)
 {
-    struct hostent *hep;
-    unsigned long my_addr;
+    struct addrinfo hints, *res, *res0;
     server_addr_rec *sar;
-    char *t;
-    int i, is_an_ip_addr;
+    char *t = NULL, *u = NULL, *v = NULL;
+    char *hoststr = NULL, *portstr = NULL;
+    char portpool[10];
+    int error;
+    char servbuf[NI_MAXSERV];
 
-    if (*w == 0)
+    if (w == 0 || *w == 0)
 	return NULL;
 
-    t = strchr(w, ':');
-    if (t) {
-	if (strcmp(t + 1, "*") == 0) {
-	    port = 0;
+    portstr = portpool;
+    ap_snprintf(portpool, sizeof(portpool), "%u", port);
+    if (!pstr) {
+	v = w;
+	u = NULL;
+	if (*w == '['){
+	    u = strrchr(w, ']');
+	    if (u) {	/* [host]:port or [host] */
+		w++;
+		*u = '\0';
+		v = u + 1;
+	    }
 	}
-	else if ((i = atoi(t + 1))) {
-	    port = i;
+	/*        w   uv     ,       w=v        , w=v  */  
+	/* u!=0: [host]:port , u==0: [host:port , host */
+	t = strchr(v, ':');
+	if (t != NULL && strchr(t+1, ':') == NULL) {
+	    /* [host]:port-w/o-colons, host-without-colons:port-w/o-colons */
+	    *t = '\0';
+	    portstr = t + 1;
 	}
 	else {
-	    return ":port must be numeric";
+	    portstr = "0";
 	}
-	*t = 0;
+    } else {
+	portstr = pstr;
     }
 
-    is_an_ip_addr = 0;
-    if (strcmp(w, "*") == 0) {
-	my_addr = htonl(INADDR_ANY);
-	is_an_ip_addr = 1;
-    }
-    else if (strcasecmp(w, "_default_") == 0
-	     || strcmp(w, "255.255.255.255") == 0) {
-	my_addr = DEFAULT_VHOST_ADDR;
-	is_an_ip_addr = 1;
-    }
-    else if ((my_addr = ap_inet_addr(w)) != INADDR_NONE) {
-	is_an_ip_addr = 1;
+    memset(&hints, 0, sizeof(hints));
+    hints.ai_socktype = SOCK_STREAM;
+    if (strcmp(w, "*") == 0 || strlen(w) == 0) {
+	hoststr = NULL;
+	hints.ai_family = PF_UNSPEC;
+	hints.ai_flags = AI_PASSIVE;
+    }
+    else if (strcasecmp(w, "_default4_") == 0 ||
+	     ((ap_default_family == PF_INET
+#ifndef INET6
+	       || ap_default_family == PF_UNSPEC
+#endif
+	       ) && strcasecmp(w, "_default_") == 0)){
+	hoststr = "255.255.255.255";
+	hints.ai_family = PF_INET;
+    }
+#ifdef INET6
+    else if (strcasecmp(w, "_default6_") == 0 ||
+	     ((ap_default_family == PF_INET6
+	       || ap_default_family == PF_UNSPEC
+	       ) && strcasecmp(w, "_default_") == 0)){
+	hoststr = "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff";
+	hints.ai_family = PF_INET6;
     }
-    if (is_an_ip_addr) {
-	sar = ap_pcalloc(p, sizeof(server_addr_rec));
-	**paddr = sar;
-	*paddr = &sar->next;
-	sar->host_addr.s_addr = my_addr;
-	sar->host_port = port;
-	sar->virthost = ap_pstrdup(p, w);
-	if (t != NULL)
-	    *t = ':';
-	return NULL;
+#endif
+    else{
+	hoststr = w;
+	hints.ai_family = PF_UNSPEC;
     }
 
-    hep = gethostbyname(w);
-
-    if ((!hep) || (hep->h_addrtype != AF_INET || !hep->h_addr_list[0])) {
+    error = getaddrinfo(hoststr, portstr, &hints, &res0);
+    if (error || !res0) {
 	ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, NULL,
-	    "Cannot resolve host name %s --- ignoring!", w);
-	if (t != NULL)
-	    *t = ':';
+	    "Cannot resolve host %s port %s --- ignoring!", hoststr, portstr);
+	if (t != NULL) *t = ':';
+	if (u != NULL) *u = ']';
 	return NULL;
     }
-
-    for (i = 0; hep->h_addr_list[i]; ++i) {
+    for (res=res0; res; res=res->ai_next) {
+	switch (res->ai_addr->sa_family) {
+	case AF_INET:
+#ifdef INET6
+	case AF_INET6:
+#endif
+	    break;
+	default:
+	    ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, NULL,
+			 "Unsupported address family %u, for host %s port %s --- ignoring!",
+			 res->ai_addr->sa_family, hoststr, portstr);
+	    continue;
+	}
 	sar = ap_pcalloc(p, sizeof(server_addr_rec));
 	**paddr = sar;
 	*paddr = &sar->next;
-	sar->host_addr = *(struct in_addr *) hep->h_addr_list[i];
-	sar->host_port = port;
+	memcpy(&sar->host_addr, res->ai_addr, res->ai_addrlen);
+	if (getnameinfo(res->ai_addr, res->ai_addrlen, NULL, 0, servbuf,
+			sizeof(servbuf), NI_NUMERICSERV) == 0)
+		sar->host_port = atoi(servbuf);
+	else
+		sar->host_port = 0;
 	sar->virthost = ap_pstrdup(p, w);
     }
 
-    if (t != NULL)
-	*t = ':';
+    freeaddrinfo(res0);
+    if (t != NULL) *t = ':';
+    if (u != NULL) *u = ']';
     return NULL;
 }
 
@@ -250,7 +287,8 @@
     /* start the list of addreses */
     addrs = &s->addrs;
     while (hostname[0]) {
-	err = get_addresses(p, ap_getword_conf(p, &hostname), &addrs, s->port);
+	err = get_addresses(p, ap_getword_conf(p, &hostname), NULL,
+		&addrs, s->port);
 	if (err) {
 	    *addrs = NULL;
 	    return err;
@@ -268,10 +306,11 @@
 }
 
 
-API_EXPORT_NONSTD(const char *) ap_set_name_virtual_host (cmd_parms *cmd, void *dummy, char *arg)
+API_EXPORT_NONSTD(const char *) ap_set_name_virtual_host (cmd_parms *cmd, void *dummy, char *h, char *p)
+
 {
     /* use whatever port the main server has at this point */
-    return get_addresses(cmd->pool, arg, &name_vhost_list_tail,
+    return get_addresses(cmd->pool, h, p, &name_vhost_list_tail,
 			    cmd->server->port);
 }
 
@@ -345,6 +384,19 @@
     return ((key >> 8) ^ key) % IPHASH_TABLE_SIZE;
 }
 
+static unsigned hash_addr(struct sockaddr *sa)
+{
+    switch (sa->sa_family) {
+    case AF_INET:
+	return hash_inaddr(((struct sockaddr_in *)sa)->sin_addr.s_addr);
+#ifdef INET6
+    case AF_INET6:
+	return hash_inaddr(((struct sockaddr_in6 *)sa)->sin6_addr.s6_addr[12]);
+#endif
+    default:
+	return hash_inaddr(sa->sa_family);
+    }
+}
 
 
 static ipaddr_chain *new_ipaddr_chain(pool *p,
@@ -372,25 +424,77 @@
     return new;
 }
 
-
-static ap_inline ipaddr_chain *find_ipaddr(struct in_addr *server_ip,
-    unsigned port)
+static ap_inline ipaddr_chain *find_ipaddr(struct sockaddr *sa)
 {
     unsigned bucket;
     ipaddr_chain *trav;
-    unsigned addr;
+    char a[NI_MAXHOST], b[NI_MAXHOST];
 
     /* scan the hash table for an exact match first */
-    addr = server_ip->s_addr;
-    bucket = hash_inaddr(addr);
+    bucket = hash_addr(sa);
     for (trav = iphash_table[bucket]; trav; trav = trav->next) {
 	server_addr_rec *sar = trav->sar;
-	if ((sar->host_addr.s_addr == addr)
-	    && (sar->host_port == 0 || sar->host_port == port
-		|| port == 0)) {
-	    return trav;
+	if (sar->host_addr.ss_family != sa->sa_family)
+	    continue;
+	switch (sa->sa_family) {
+	case AF_INET:
+	  {
+	    struct sockaddr_in *sin1, *sin2;
+	    sin1 = (struct sockaddr_in *)&sar->host_addr;
+	    sin2 = (struct sockaddr_in *)sa;
+	    if (sin1->sin_port == 0 || sin2->sin_port == 0
+	     || sin1->sin_port == sin2->sin_port) {
+		if (memcmp(&sin1->sin_addr, &sin2->sin_addr,
+			sizeof(sin1->sin_addr)) == 0) {
+		    return trav;
+		}
+	    }
+	    break;
+	  }
+#ifdef INET6
+	case AF_INET6:
+	  {
+	    struct sockaddr_in6 *sin1, *sin2;
+	    sin1 = (struct sockaddr_in6 *)&sar->host_addr;
+	    sin2 = (struct sockaddr_in6 *)sa;
+	    if (sin1->sin6_port == 0 || sin2->sin6_port == 0
+	     || sin1->sin6_port == sin2->sin6_port) {
+		if (memcmp(&sin1->sin6_addr, &sin2->sin6_addr,
+			sizeof(sin1->sin6_addr)) == 0) {
+		    return trav;
+		}
+	    }
+	    break;
+	  }
+#endif
+	default: /*unsupported*/
+	    break;
 	}
     }
+
+#ifdef INET6
+    if (sa->sa_family == AF_INET6 &&
+	IN6_IS_ADDR_V4MAPPED(&((struct sockaddr_in6 *)sa)->sin6_addr)) {
+	/*
+	 * This is just horrible.  I just hate IPv4 mapped address.  It
+	 * complicates access control too much.
+	 * Due to hashed lookup, we need to visit it again.
+	 */
+	struct sockaddr_in sin;
+
+	memset(&sin, 0, sizeof(sin));
+	sin.sin_family = AF_INET;
+#ifdef SIN6_LEN
+	sin.sin_len = sizeof(sin);
+#endif
+	sin.sin_port = ((struct sockaddr_in6 *)sa)->sin6_port;
+	memcpy(&sin.sin_addr,
+	    &((struct sockaddr_in6 *)sa)->sin6_addr.s6_addr[12],
+	    sizeof(sin.sin_addr));
+	return find_ipaddr((struct sockaddr *)&sin);
+    }
+#endif
+
     return NULL;
 }
 
@@ -416,21 +520,7 @@
     int len;
     char buf[MAX_STRING_LEN];
 
-    if (ic->sar->host_addr.s_addr == DEFAULT_VHOST_ADDR) {
-	len = ap_snprintf(buf, sizeof(buf), "_default_:%u",
-		ic->sar->host_port);
-    }
-    else if (ic->sar->host_addr.s_addr == INADDR_ANY) {
-	len = ap_snprintf(buf, sizeof(buf), "*:%u",
-		ic->sar->host_port);
-    }
-    else {
-	len = ap_snprintf(buf, sizeof(buf), "%pA:%u",
-		&ic->sar->host_addr, ic->sar->host_port);
-    }
-    if (ic->sar->host_port == 0) {
-	buf[len-1] = '*';
-    }
+    len = ap_snprintf(buf, sizeof(buf), "%pI", &ic->sar->host_addr);
     if (ic->names == NULL) {
 	if (ic->server == NULL)
 	    fprintf(f, "%-22s WARNING: No <VirtualHost> defined for this NameVirtualHost!\n", buf);
@@ -558,10 +648,37 @@
      * occured in the config file, we'll copy it in that order.
      */
     for (sar = name_vhost_list; sar; sar = sar->next) {
-	unsigned bucket = hash_inaddr(sar->host_addr.s_addr);
+	unsigned bucket = hash_addr((struct sockaddr *)&sar->host_addr);
 	ipaddr_chain *ic = new_ipaddr_chain(p, NULL, sar);
+	int wildcard;
 
-	if (sar->host_addr.s_addr != INADDR_ANY) {
+	wildcard = 0;
+	switch (sar->host_addr.ss_family) {
+	case AF_INET:
+	  {
+	    struct sockaddr_in *sin;
+	    sin = (struct sockaddr_in *)&sar->host_addr;
+	    if (sin->sin_addr.s_addr == INADDR_ANY)
+		wildcard++;
+	    break;
+	  }
+#ifdef INET6
+	case AF_INET6:
+	  {
+	    struct sockaddr_in6 *sin6;
+	    sin6 = (struct sockaddr_in6 *)&sar->host_addr;
+	    if (*(ap_uint32_t *)&sin6->sin6_addr.s6_addr[0] == 0
+	     && *(ap_uint32_t *)&sin6->sin6_addr.s6_addr[4] == 0
+	     && *(ap_uint32_t *)&sin6->sin6_addr.s6_addr[8] == 0
+	     && *(ap_uint32_t *)&sin6->sin6_addr.s6_addr[12] == 0) {
+		wildcard++;
+	    }
+	    break;
+	  }
+#endif
+	}
+
+	if (!wildcard) {
 	    *iphash_table_tail[bucket] = ic;
 	    iphash_table_tail[bucket] = &ic->next;
 	}
@@ -588,12 +705,45 @@
 	has_default_vhost_addr = 0;
 	for (sar = s->addrs; sar; sar = sar->next) {
 	    ipaddr_chain *ic;
+	    int wildcard;
 
-	    if (sar->host_addr.s_addr == DEFAULT_VHOST_ADDR
-		|| sar->host_addr.s_addr == INADDR_ANY) {
-		ic = find_default_server(sar->host_port);
-		if (!ic || !add_name_vhost_config(p, main_s, s, sar, ic)) {
-		    if (ic && ic->sar->host_port != 0) {
+	    wildcard = 0;
+	    switch (sar->host_addr.ss_family) {
+	    case AF_INET:
+	      {
+		struct sockaddr_in *sin;
+		sin = (struct sockaddr_in *)&sar->host_addr;
+		if (sin->sin_addr.s_addr == DEFAULT_VHOST_ADDR)
+		    wildcard++;
+		else if (sin->sin_addr.s_addr == INADDR_ANY)
+		    wildcard++;
+		break;
+	      }
+#ifdef INET6
+	    case AF_INET6:
+	      {
+		struct sockaddr_in6 *sin6;
+		sin6 = (struct sockaddr_in6 *)&sar->host_addr;
+		if (*(ap_uint32_t *)&sin6->sin6_addr.s6_addr[0] == ~0
+		 && *(ap_uint32_t *)&sin6->sin6_addr.s6_addr[4] == ~0
+		 && *(ap_uint32_t *)&sin6->sin6_addr.s6_addr[8] == ~0
+		 && *(ap_uint32_t *)&sin6->sin6_addr.s6_addr[12] == ~0) {
+		    wildcard++;
+		}
+		break;
+	      }
+#endif
+	    }
+
+	    if (wildcard) {
+		/* add it to default bucket for each appropriate sar
+		 * since we need to do a port test
+		 */
+		ipaddr_chain *other;
+
+		other = find_default_server(sar->host_port);
+		if (!other || !add_name_vhost_config(p, main_s, s, sar, other)) {
+		    if (other && other->sar->host_port != 0) {
 			ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_WARNING,
 			    main_s, "_default_ VirtualHost overlap on port %u,"
 			    " the first has precedence", sar->host_port);
@@ -606,10 +756,11 @@
 	    }
 	    else {
 		/* see if it matches something we've already got */
-		ic = find_ipaddr(&sar->host_addr, sar->host_port);
+		ic = find_ipaddr((struct sockaddr *)&sar->host_addr);
 
 		if (!ic) {
-		    unsigned bucket = hash_inaddr(sar->host_addr.s_addr);
+		    unsigned bucket =
+		        hash_addr((struct sockaddr *)&sar->host_addr);
 
 		    ic = new_ipaddr_chain(p, s, sar);
 		    ic->next = *iphash_table_tail[bucket];
@@ -646,19 +797,33 @@
 	    }
 	    else {
 		struct hostent *h;
+		char hostnamebuf[MAXHOSTNAMELEN];
 
-		if ((h = gethostbyaddr((char *) &(s->addrs->host_addr),
-					sizeof(struct in_addr), AF_INET))) {
-		    s->server_hostname = ap_pstrdup(p, (char *) h->h_name);
+		if (!getnameinfo((struct sockaddr *)&s->addrs->host_addr,
+#ifndef SIN6_LEN
+			SA_LEN((struct sockaddr *)&s->addrs->host_addr),
+#else	
+			s->addrs->host_addr.ss_len,
+#endif
+			hostnamebuf, sizeof(hostnamebuf),
+			NULL, 0, 0)) {
+		    s->server_hostname = ap_pstrdup(p, hostnamebuf);
 		}
 		else {
 		    /* again, what can we do?  They didn't specify a
 		       ServerName, and their DNS isn't working. -djg */
+		    getnameinfo((struct sockaddr *)&s->addrs->host_addr,
+#ifndef SIN6_LEN
+			SA_LEN((struct sockaddr *)&s->addrs->host_addr),
+#else	
+			s->addrs->host_addr.ss_len,
+#endif
+			hostnamebuf, sizeof(hostnamebuf),
+			NULL, 0, NI_NUMERICHOST);
 		    ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, main_s,
 			    "Failed to resolve server name "
 			    "for %s (check DNS) -- or specify an explicit "
-			    "ServerName",
-			    inet_ntoa(s->addrs->host_addr));
+			    "ServerName", hostnamebuf);
 		    s->server_hostname =
 			ap_pstrdup(p, "bogus_host_without_reverse_dns");
 		}
@@ -705,35 +870,58 @@
     char *host = ap_palloc(r->pool, strlen(r->hostname) + 1);
     const char *src;
     char *dst;
+    const char *u = NULL, *v = NULL;
 
     /* check and copy the host part */
-    src = r->hostname;
+    u = src = r->hostname;
 
     dst = host;
-    while (*src) {
-	if (*src == '.') {
-	    *dst++ = *src++;
-	    if (*src == '.')
-		goto bad;
-	    else
-		continue;
-	}
-	if (*src == '/' || *src == '\\') {
-	    goto bad;
+    if (*u == '[') { /* IPv6 numeral address in brackets */
+        v = strchr(u, ']');
+	if (v == NULL) {
+	    /* missing closing bracket */
+            goto bad;
+	}
+        if (v == (u + 1)) {
+            /* bad empty address */
+            goto bad;
+	}
+	for (src = u+1; src < v; src++)  /* copy IPv6 adress */
+	    *dst = *src;
+	v++;
+	if (*v == ':') {
+	   v++;
+	   while (*v) {  /* check if portnum is correct */
+	       if (!ap_isdigit(*v++))
+		   goto bad;
+	   }
 	}
-        if (*src == ':') {
-            /* check the port part */
-            while (*++src) {
-                if (!ap_isdigit(*src)) {
-                    goto bad;
-                }
-            }
-            if (src[-1] == ':')
-                goto bad;
-            else
-                break;
+    } else {
+        while (*src) {
+	    if (*src == '.') {
+		*dst++ = *src++;
+		if (*src == '.')
+		    goto bad;
+		else
+		    continue;
+	    }
+	    if (*src == '/' || *src == '\\') {
+		goto bad;
+	    }
+	    if (*src == ':') {
+		/* sheck the port part */
+		while (*++src) {
+		    if (!ap_isdigit(*src)) {
+			goto bad;
+		    }
+		}
+		if (src[-1] == ':')
+		    goto bad;
+		else
+		    break;
+	    }
+	    *dst++ = *src++;
         }
-	*dst++ = *src++;
     }
     /* strip trailing gubbins */
     if (dst > host && dst[-1] == '.') {
@@ -748,7 +936,7 @@
 bad:
     r->status = HTTP_BAD_REQUEST;
     ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
-		  "Client sent malformed Host header");
+		  "Client sent malformed Host header <<%s>>",u);
     return;
 }
 
@@ -851,11 +1039,25 @@
      *   names we'll match have ports associated with them
      */
     const char *host = r->hostname;
-    unsigned port = ntohs(r->connection->local_addr.sin_port);
+    unsigned port;
     server_rec *s;
     server_rec *last_s;
     name_chain *src;
 
+    switch (r->connection->local_addr.ss_family) {
+    case AF_INET:
+    	port = ntohs(((struct sockaddr_in *)
+		    &r->connection->local_addr)->sin_port);
+	break;
+#ifdef INET6
+    case AF_INET6:
+    	port = ntohs(((struct sockaddr_in6 *)
+		    &r->connection->local_addr)->sin6_port);
+	break;
+#endif
+    default:
+	port = 0;	/*XXX*/
+    }
     last_s = NULL;
 
     /* Recall that the name_chain is a list of server_addr_recs, some of
@@ -910,7 +1112,22 @@
     server_rec *s;
     server_rec *last_s;
     name_chain *src;
-    unsigned port = ntohs(r->connection->local_addr.sin_port);
+    unsigned port;
+
+    switch (r->connection->local_addr.ss_family) {
+    case AF_INET:
+    	port = ntohs(((struct sockaddr_in *)
+		    &r->connection->local_addr)->sin_port);
+	break;
+#ifdef INET6
+    case AF_INET6:
+    	port = ntohs(((struct sockaddr_in6 *)
+		    &r->connection->local_addr)->sin6_port);
+	break;
+#endif
+    default:
+	port = 0;	/*XXX*/
+    }
 
     /*
      * This is in conjunction with the ServerPath code in http_core, so we
@@ -970,10 +1187,22 @@
 API_EXPORT(void) ap_update_vhost_given_ip(conn_rec *conn)
 {
     ipaddr_chain *trav;
-    unsigned port = ntohs(conn->local_addr.sin_port);
+    char portbuf[NI_MAXSERV];
+    unsigned port;
+
+    if (getnameinfo((struct sockaddr *)&conn->local_addr,
+#ifndef SIN6_LEN
+	SA_LEN((struct sockaddr *)&conn->local_addr),
+#else	
+	conn->local_addr.ss_len,
+#endif
+	NULL, 0, portbuf, sizeof(portbuf), NI_NUMERICSERV) != 0) {
+	goto fail;
+    }
+    port = atoi(portbuf);
 
     /* scan the hash table for an exact match first */
-    trav = find_ipaddr(&conn->local_addr.sin_addr, port);
+    trav = find_ipaddr((struct sockaddr *)&conn->local_addr);
     if (trav) {
 	/* save the name_chain for later in case this is a name-vhost */
 	conn->vhost_lookup_data = trav->names;
@@ -991,6 +1220,7 @@
 	return;
     }
 
+fail:
     /* otherwise we're stuck with just the main server
      * and no name-based vhosts
      */
diff -Nur apache_1.3.26/src/main/rfc1413.c apache_1.3.26-ipv6/src/main/rfc1413.c
--- apache_1.3.26/src/main/rfc1413.c	Thu Mar 14 06:05:31 2002
+++ apache_1.3.26-ipv6/src/main/rfc1413.c	Wed Jun 19 08:05:32 2002
@@ -82,6 +82,7 @@
 #include "http_log.h"		/* for aplog_error */
 #include "rfc1413.h"
 #include "http_main.h"		/* set_callback_and_alarm */
+#include "sa_len.h"
 
 /* Local stuff. */
 /* Semi-well-known port */
@@ -109,12 +110,13 @@
 
 /* bind_connect - bind both ends of a socket */
 /* Ambarish fix this. Very broken */
-static int get_rfc1413(int sock, const struct sockaddr_in *our_sin,
-		       const struct sockaddr_in *rmt_sin, 
+static int get_rfc1413(int sock, const struct sockaddr *our_sin,
+		       const struct sockaddr *rmt_sin, 
 		       char user[RFC1413_USERLEN+1], server_rec *srv)
 {
-    struct sockaddr_in rmt_query_sin, our_query_sin;
-    unsigned int rmt_port, our_port;
+    struct sockaddr_storage rmt_query_sin, our_query_sin;
+    unsigned int o_rmt_port, o_our_port;	/* original port pair */
+    unsigned int rmt_port, our_port;		/* replied port pair */
     int i;
     char *cp;
     char buffer[RFC1413_MAXDATA + 1];
@@ -129,16 +131,47 @@
      * addresses from the query socket.
      */
 
-    our_query_sin = *our_sin;
-    our_query_sin.sin_port = htons(ANY_PORT);
-#ifdef MPE 
-    our_query_sin.sin_addr.s_addr = INADDR_ANY;
+#ifndef SIN6_LEN
+    memcpy(&our_query_sin, our_sin, SA_LEN(our_sin));
+    memcpy(&rmt_query_sin, rmt_sin, SA_LEN(rmt_sin));
+#else
+    memcpy(&our_query_sin, our_sin, our_sin->sa_len);
+    memcpy(&rmt_query_sin, rmt_sin, rmt_sin->sa_len);
 #endif
-    rmt_query_sin = *rmt_sin;
-    rmt_query_sin.sin_port = htons(RFC1413_PORT);
+    switch (our_sin->sa_family) {
+    case AF_INET:
+#ifdef MPE
+      ((struct sockaddr_in *)&our_query_sin)->sin_addr.s_addr = INADDR_ANY; /* XXX: htonl(??) */
+#endif
+      ((struct sockaddr_in *)&our_query_sin)->sin_port = htons(ANY_PORT);
+      o_our_port = ntohs(((struct sockaddr_in *)our_sin)->sin_port);
+      ((struct sockaddr_in *)&rmt_query_sin)->sin_port = htons(RFC1413_PORT);
+      o_rmt_port = ntohs(((struct sockaddr_in *)rmt_sin)->sin_port);
+      break;
+#ifdef INET6
+    case AF_INET6:
+#ifdef MPE
+      memcpy(&((struct sockaddr_in6 *)&our_query_sin)->sin6_addr, 
+	     &in6addr_any, sizeof(struct in6_addr));
+#endif
+      ((struct sockaddr_in6 *)&our_query_sin)->sin6_port = htons(ANY_PORT);
+      o_our_port = ntohs(((struct sockaddr_in6 *)our_sin)->sin6_port);
+      ((struct sockaddr_in6 *)&rmt_query_sin)->sin6_port = htons(RFC1413_PORT);
+      o_rmt_port = ntohs(((struct sockaddr_in6 *)rmt_sin)->sin6_port);
+      break;
+#endif
+    default:
+      /* unsupported AF */
+      return -1;
+    }
 
     if (bind(sock, (struct sockaddr *) &our_query_sin,
-	     sizeof(struct sockaddr_in)) < 0) {
+#ifndef SIN6_LEN
+	     SA_LEN((struct sockaddr *) &our_query_sin)
+#else
+	     our_query_sin.ss_len
+#endif
+	     ) < 0) {
 	ap_log_error(APLOG_MARK, APLOG_CRIT, srv,
 		    "bind: rfc1413: Error binding to local port");
 	return -1;
@@ -149,12 +182,18 @@
  * the service
  */
     if (connect(sock, (struct sockaddr *) &rmt_query_sin,
-		sizeof(struct sockaddr_in)) < 0)
-	            return -1;
+#ifndef SIN6_LEN
+		SA_LEN((struct sockaddr *) &rmt_query_sin)
+#else
+		rmt_query_sin.ss_len
+#endif
+		) < 0) {
+	return -1;
+    }
 
 /* send the data */
-    buflen = ap_snprintf(buffer, sizeof(buffer), "%u,%u\r\n", ntohs(rmt_sin->sin_port),
-		ntohs(our_sin->sin_port));
+    buflen = ap_snprintf(buffer, sizeof(buffer), "%u,%u\r\n", o_rmt_port,
+		o_our_port);
 
     /* send query to server. Handle short write. */
 #ifdef CHARSET_EBCDIC
@@ -219,9 +258,9 @@
     ascii2ebcdic(buffer, buffer, (size_t)i);
 #endif
     if (sscanf(buffer, "%u , %u : USERID :%*[^:]:%512s", &rmt_port, &our_port,
-	       user) != 3 || ntohs(rmt_sin->sin_port) != rmt_port
-	|| ntohs(our_sin->sin_port) != our_port)
+	       user) != 3 || o_rmt_port != rmt_port || o_our_port != our_port) {
 	return -1;
+    }
 
     /*
      * Strip trailing carriage return. It is part of the
@@ -243,7 +282,7 @@
 
     result = FROM_UNKNOWN;
 
-    sock = ap_psocket(conn->pool, AF_INET, SOCK_STREAM, IPPROTO_TCP);
+    sock = ap_psocket(conn->pool, conn->remote_addr.ss_family, SOCK_STREAM, IPPROTO_TCP);
     if (sock < 0) {
 	ap_log_error(APLOG_MARK, APLOG_CRIT, srv,
 		    "socket: rfc1413: error creating socket");
@@ -256,8 +295,10 @@
     if (ap_setjmp(timebuf) == 0) {
 	ap_set_callback_and_alarm(ident_timeout, ap_rfc1413_timeout);
 
-	if (get_rfc1413(sock, &conn->local_addr, &conn->remote_addr, user, srv) >= 0)
+	if (get_rfc1413(sock, (struct sockaddr *)&conn->local_addr,
+		(struct sockaddr *)&conn->remote_addr, user, srv) >= 0) {
 	    result = user;
+	}
     }
     ap_set_callback_and_alarm(NULL, 0);
     ap_pclosesocket(conn->pool, sock);
diff -Nur apache_1.3.26/src/main/util.c apache_1.3.26-ipv6/src/main/util.c
--- apache_1.3.26/src/main/util.c	Tue Jun 18 09:59:58 2002
+++ apache_1.3.26-ipv6/src/main/util.c	Wed Jun 19 08:05:33 2002
@@ -2017,52 +2017,90 @@
  * Parses a host of the form <address>[:port]
  * :port is permitted if 'port' is not NULL
  */
-API_EXPORT(unsigned long) ap_get_virthost_addr(char *w, unsigned short *ports)
+API_EXPORT(struct sockaddr *) ap_get_virthost_addr(char *w, unsigned short *ports)
 {
-    struct hostent *hep;
-    unsigned long my_addr;
-    char *p;
+    static struct sockaddr_storage ss;
+    struct addrinfo hints, *res;
+    char *p, *r;
+    char *host;
+    char *port = "0";
+    int error;
+    char servbuf[NI_MAXSERV];
+
+    if (w == NULL)
+      w = "*";
+    p = r = NULL;
+    if (*w == '['){
+      if (r = strrchr(w+1, ']')){
+          *r = '\0';
+          p = r + 1;
+          switch(*p){
+          case ':':
+            p++;
+            /* nobreak; */
+          case '\0':
+            w++;
+            break;
+          default:
+            p = NULL;
+          }
+      }
+    }
+    else{
+      p = strchr(w, ':');
+      if (p != NULL && strchr(p+1, ':') != NULL)
+          p = NULL;
+    }
 
-    p = strchr(w, ':');
     if (ports != NULL) {
-	*ports = 0;
-	if (p != NULL && strcmp(p + 1, "*") != 0)
-	    *ports = atoi(p + 1);
+      if (p != NULL && *p && strcmp(p + 1, "*") != 0)
+          port = p + 1;
     }
 
+    memset(&hints, 0, sizeof(hints));
+    hints.ai_socktype = SOCK_STREAM;
     if (p != NULL)
 	*p = '\0';
     if (strcmp(w, "*") == 0) {
-	if (p != NULL)
-	    *p = ':';
-	return htonl(INADDR_ANY);
+      host = NULL;
+      hints.ai_flags = AI_PASSIVE;
+      hints.ai_family = ap_default_family;
+    } else {
+      host = w;
+      hints.ai_family = PF_UNSPEC;
     }
 
-    my_addr = ap_inet_addr((char *)w);
-    if (my_addr != INADDR_NONE) {
-	if (p != NULL)
-	    *p = ':';
-	return my_addr;
-    }
+    error = getaddrinfo(host, port, &hints, &res);
 
-    hep = gethostbyname(w);
 
-    if ((!hep) || (hep->h_addrtype != AF_INET || !hep->h_addr_list[0])) {
-	fprintf(stderr, "Cannot resolve host name %s --- exiting!\n", w);
+    if (error || !res) {
+      fprintf(stderr, "ap_get_vitrhost_addr(): getaddrinfo(%s):%s --- exiting!\n", w, gai_strerror(error));
 	exit(1);
     }
 
-    if (hep->h_addr_list[1]) {
-	fprintf(stderr, "Host %s has multiple addresses ---\n", w);
+    if (res->ai_next) {
+      fprintf(stderr, "ap_get_vitrhost_addr(): Host %s has multiple addresses ---\n", w);
 	fprintf(stderr, "you must choose one explicitly for use as\n");
 	fprintf(stderr, "a virtual host.  Exiting!!!\n");
 	exit(1);
     }
 
+    if (r != NULL)
+      *r = ']';
+
     if (p != NULL)
 	*p = ':';
 
-    return ((struct in_addr *) (hep->h_addr))->s_addr;
+    memcpy(&ss, res->ai_addr, res->ai_addrlen);
+    if (getnameinfo(res->ai_addr, res->ai_addrlen,
+                  NULL, 0, servbuf, sizeof(servbuf),
+                  NI_NUMERICSERV)){
+      fprintf(stderr, "ap_get_virthost_addr(): getnameinfo() failed --- Exiting!!!\n");
+      exit(1);
+    }
+    if (ports) *ports = atoi(servbuf);
+    freeaddrinfo(res);
+    return (struct sockaddr *)&ss;
 }
 
 
@@ -2090,32 +2128,40 @@
 #endif
     char str[MAXHOSTNAMELEN];
     char *server_hostname = NULL;
-    struct hostent *p;
+    struct addrinfo hints, *res;
+    int error;
 
 #ifdef BEOS /* BeOS returns zero as an error for gethostname */
-    if (gethostname(str, sizeof(str) - 1) == 0) {
+    if (gethostname(str, sizeof(str) - 1) == 0)
 #else    
-    if (gethostname(str, sizeof(str) - 1) != 0) {
+    if (gethostname(str, sizeof(str) - 1) != 0)
 #endif /* BeOS */
+    {
 	ap_log_error(APLOG_MARK, APLOG_WARNING, NULL,
 	             "%s: gethostname() failed to determine ServerName\n",
                      ap_server_argv0);
     }
     else 
     {
-        str[sizeof(str) - 1] = '\0';
-        if ((!(p = gethostbyname(str))) 
-            || (!(server_hostname = find_fqdn(a, p)))) {
-            /* Recovery - return the default servername by IP: */
-            if (p && p->h_addr_list && p->h_addr_list[0]) {
-                ap_snprintf(str, sizeof(str), "%pA", p->h_addr_list[0]);
-	        server_hostname = ap_pstrdup(a, str);
-                /* We will drop through to report the IP-named server */
-            }
-        }
+	str[sizeof(str) - 1] = '\0';
+	memset(&hints, 0, sizeof(hints));
+	hints.ai_family = PF_UNSPEC;
+	hints.ai_flags = AI_CANONNAME;
+	res = NULL;
+	error = getaddrinfo(str, NULL, &hints, &res);
+	if (error == 0 && res)
+	{
+	    /* Since we found a fdqn, return it with no logged message. */
+	    server_hostname = ap_pstrdup(a, res->ai_canonname);
+	    freeaddrinfo(res);
+	    return server_hostname;
+	}
 	else
-            /* Since we found a fqdn, return it with no logged message. */
-            return server_hostname;
+	{
+	    /* Recovery - return the default servername by IP: */
+	    server_hostname = ap_pstrdup(a, str);
+	    /* We will drop through to report the IP-named server */
+        }
     }
 
     /* If we don't have an fdqn or IP, fall back to the loopback addr */
@@ -2127,6 +2173,8 @@
                  "domain name, using %s for ServerName",
                  ap_server_argv0, server_hostname);
     
+    if (res)
+	freeaddrinfo(res);
     return server_hostname;
 }
 
@@ -2369,3 +2417,11 @@
     }
     *dest = 0;
 }
+
+#ifdef NEED_GETADDRINFO
+#include "getaddrinfo.c"
+#endif
+
+#ifdef NEED_GETNAMEINFO
+#include "getnameinfo.c"
+#endif
diff -Nur apache_1.3.26/src/main/util_script.c apache_1.3.26-ipv6/src/main/util_script.c
--- apache_1.3.26/src/main/util_script.c	Fri Mar 22 01:07:02 2002
+++ apache_1.3.26-ipv6/src/main/util_script.c	Wed Jun 19 08:05:33 2002
@@ -67,6 +67,7 @@
 #include "http_request.h"	/* for sub_req_lookup_uri() */
 #include "util_script.h"
 #include "util_date.h"		/* For parseHTTPdate() */
+#include "sa_len.h"
 
 #ifdef OS2
 #define INCL_DOS
@@ -203,6 +204,7 @@
     array_header *hdrs_arr = ap_table_elts(r->headers_in);
     table_entry *hdrs = (table_entry *) hdrs_arr->elts;
     int i;
+    char servbuf[NI_MAXSERV];
 
     /* use a temporary table which we'll overlap onto
      * r->subprocess_env later
@@ -293,8 +295,16 @@
     ap_table_addn(e, "SERVER_ADMIN", s->server_admin);	/* Apache */
     ap_table_addn(e, "SCRIPT_FILENAME", r->filename);	/* Apache */
 
-    ap_table_addn(e, "REMOTE_PORT",
-		  ap_psprintf(r->pool, "%d", ntohs(c->remote_addr.sin_port)));
+    servbuf[0] = '\0';
+    if (!getnameinfo((struct sockaddr *)&c->remote_addr,
+#ifndef HAVE_SOCKADDR_LEN
+		     SA_LEN((struct sockaddr *)&c->remote_addr),
+#else
+		     c->remote_addr.ss_len,
+#endif
+		     NULL, 0, servbuf, sizeof(servbuf), NI_NUMERICSERV)){
+	ap_table_addn(e, "REMOTE_PORT", ap_pstrdup(r->pool, servbuf));
+    }
 
     if (c->user) {
 	ap_table_addn(e, "REMOTE_USER", c->user);
diff -Nur apache_1.3.26/src/main/util_uri.c apache_1.3.26-ipv6/src/main/util_uri.c
--- apache_1.3.26/src/main/util_uri.c	Tue Jun 18 09:59:58 2002
+++ apache_1.3.26-ipv6/src/main/util_uri.c	Wed Jun 19 08:15:44 2002
@@ -413,31 +413,36 @@
         --s;
     } while (s >= hostinfo && *s != '@');
     if (s < hostinfo) {
-        /* again we want the common case to be fall through */
-      deal_with_host:
-        /* We expect hostinfo to point to the first character of
-         * the hostname.  If there's a port it is the first colon.
-         */
-        s = memchr(hostinfo, ':', uri - hostinfo);
-        if (s == NULL) {
-            /* we expect the common case to have no port */
-            uptr->hostname = ap_pstrndup(p, hostinfo, uri - hostinfo);
-            goto deal_with_path;
-        }
-        uptr->hostname = ap_pstrndup(p, hostinfo, s - hostinfo);
-        ++s;
-        uptr->port_str = ap_pstrndup(p, s, uri - s);
-        if (uri != s) {
-            port = ap_strtol(uptr->port_str, &endstr, 10);
-            uptr->port = port;
-            if (*endstr == '\0') {
-                goto deal_with_path;
-            }
-            /* Invalid characters after ':' found */
-            return HTTP_BAD_REQUEST;
-        }
-        uptr->port = ap_default_port_for_scheme(uptr->scheme);
-        goto deal_with_path;
+      /* again we want the common case to be fall through */
+deal_with_host:
+      /* We expect hostinfo to point to the first character of
+       * the hostname.  If there's a port it is the first colon.
+       */
+      if (*hostinfo == '[') {
+          s = memchr(hostinfo+1, ']', uri - hostinfo - 1);
+          if (s)
+              s = strchr(s, ':');
+      } else
+          s = memchr(hostinfo, ':', uri - hostinfo);
+      if (s == NULL) {
+          /* we expect the common case to have no port */
+          uptr->hostname = ap_pstrndup(p, hostinfo, uri - hostinfo);
+          goto deal_with_path;
+      }
+      uptr->hostname = ap_pstrndup(p, hostinfo, s - hostinfo);
+      ++s;
+      uptr->port_str = ap_pstrndup(p, s, uri - s);
+      if (uri != s) {
+          port = strtol(uptr->port_str, &endstr, 10);
+          uptr->port = port;
+          if (*endstr == '\0') {
+              goto deal_with_path;
+          }
+          /* Invalid characters after ':' found */
+          return HTTP_BAD_REQUEST;
+      }
+      uptr->port = ap_default_port_for_scheme(uptr->scheme);
+      goto deal_with_path;
     }
 
     /* first colon delimits username:password */
@@ -475,7 +480,12 @@
     /* We expect hostinfo to point to the first character of
      * the hostname.  There must be a port, separated by a colon
      */
-    s = strchr(hostinfo, ':');
+    if (*hostinfo == '[') {
+        s = strchr(hostinfo+1, ']');
+        if (s)
+            s = strchr(s, ':');
+    } else
+        s = strchr(hostinfo, ':');
     if (s == NULL) {
         return HTTP_BAD_REQUEST;
     }
diff -Nur apache_1.3.26/src/modules/proxy/mod_proxy.c apache_1.3.26-ipv6/src/modules/proxy/mod_proxy.c
--- apache_1.3.26/src/modules/proxy/mod_proxy.c	Tue Jun 18 09:59:59 2002
+++ apache_1.3.26-ipv6/src/modules/proxy/mod_proxy.c	Wed Jun 19 08:05:33 2002
@@ -537,7 +537,7 @@
     new = ap_push_array(conf->proxies);
     new->scheme = f;
     new->protocol = r;
-    new->hostname = p + 3;
+    new->hostname = bl;
     new->port = port;
     return NULL;
 }
diff -Nur apache_1.3.26/src/modules/proxy/mod_proxy.h apache_1.3.26-ipv6/src/modules/proxy/mod_proxy.h
--- apache_1.3.26/src/modules/proxy/mod_proxy.h	Sun Apr 21 20:35:07 2002
+++ apache_1.3.26-ipv6/src/modules/proxy/mod_proxy.h	Wed Jun 19 08:05:33 2002
@@ -310,7 +310,7 @@
 int ap_proxy_is_domainname(struct dirconn_entry *This, pool *p);
 int ap_proxy_is_hostname(struct dirconn_entry *This, pool *p);
 int ap_proxy_is_word(struct dirconn_entry *This, pool *p);
-int ap_proxy_doconnect(int sock, struct sockaddr_in *addr, request_rec *r);
+int ap_proxy_doconnect(int sock, struct sockaddr *addr, request_rec *r);
 int ap_proxy_garbage_init(server_rec *, pool *);
 /* This function is called by ap_table_do() for all header lines */
 int ap_proxy_send_hdr_line(void *p, const char *key, const char *value);
diff -Nur apache_1.3.26/src/modules/proxy/proxy_connect.c apache_1.3.26-ipv6/src/modules/proxy/proxy_connect.c
--- apache_1.3.26/src/modules/proxy/proxy_connect.c	Mon Mar 25 18:21:58 2002
+++ apache_1.3.26-ipv6/src/modules/proxy/proxy_connect.c	Wed Jun 19 08:05:34 2002
@@ -113,14 +113,15 @@
                                  const char *proxyhost, int proxyport)
 {
     struct sockaddr_in server;
-    struct in_addr destaddr;
-    struct hostent server_hp;
-    const char *host, *err;
+    struct addrinfo hints, *res, *res0;
+    const char *hoststr;
+    const char *portstr = NULL;
     char *p;
     int port, sock;
     char buffer[HUGE_STRING_LEN];
-    int nbytes, i, j;
+    int nbytes, i;
     fd_set fds;
+    int error;
 
     void *sconf = r->server->module_config;
     proxy_server_conf *conf =
diff -Nur apache_1.3.26/src/modules/proxy/proxy_ftp.c apache_1.3.26-ipv6/src/modules/proxy/proxy_ftp.c
--- apache_1.3.26/src/modules/proxy/proxy_ftp.c	Mon Apr  8 03:57:36 2002
+++ apache_1.3.26-ipv6/src/modules/proxy/proxy_ftp.c	Wed Jun 19 08:09:52 2002
@@ -62,6 +62,7 @@
 #include "http_main.h"
 #include "http_log.h"
 #include "http_core.h"
+#include "sa_len.h"
 
 #define AUTODETECT_PWD
 
@@ -555,8 +556,10 @@
     const char *err;
     int port, i, j, len, rc, nocache = 0;
     int csd = 0, sock = -1, dsock = -1;
-    struct sockaddr_in server;
-    struct hostent server_hp;
+    struct sockaddr_storage server;
+    struct addrinfo hints, *res, *res0;
+    char portbuf[10];
+    int error;
     struct in_addr destaddr;
     table *resp_hdrs;
     BUFF *ctrl = NULL;
@@ -577,11 +580,18 @@
     unsigned int presult, h0, h1, h2, h3, p0, p1;
     unsigned int paddr;
     unsigned short pport;
-    struct sockaddr_in data_addr;
+    struct sockaddr_storage data_addr;
+    struct sockaddr_in *sin;
     int pasvmode = 0;
     char pasv[64];
     char *pstr;
 
+/* stuff for LPSV/EPSV */
+    unsigned int paf, holen, ho[16], polen, po[2];
+    struct sockaddr_in6 *sin6;
+    int lpsvmode = 0;
+    char *cmd;
+
 /* stuff for responses */
     char resp[MAX_STRING_LEN];
     char *size = NULL;
@@ -944,7 +954,7 @@
     }
 
 /* try to set up PASV data connection first */
-    dsock = ap_psocket(p, PF_INET, SOCK_STREAM, IPPROTO_TCP);
+    dsock = ap_psocket(p, server.ss_family, SOCK_STREAM, IPPROTO_TCP);
     if (dsock == -1) {
         return ftp_cleanup_and_return(r, ctrl, data, sock, dsock,
                                 ap_proxyerror(r, HTTP_INTERNAL_SERVER_ERROR,
diff -Nur apache_1.3.26/src/modules/proxy/proxy_util.c apache_1.3.26-ipv6/src/modules/proxy/proxy_util.c
--- apache_1.3.26/src/modules/proxy/proxy_util.c	Tue Jun 18 09:59:59 2002
+++ apache_1.3.26-ipv6/src/modules/proxy/proxy_util.c	Wed Jun 19 08:05:34 2002
@@ -219,6 +219,7 @@
     int i;
     char *strp, *host, *url = *urlp;
     char *user = NULL, *password = NULL;
+    char *t = NULL, *u = NULL, *v = NULL;
 
     if (url[0] != '/' || url[1] != '/')
         return "Malformed URL";
diff -Nur apache_1.3.26/src/modules/standard/mod_access.c apache_1.3.26-ipv6/src/modules/standard/mod_access.c
--- apache_1.3.26/src/modules/standard/mod_access.c	Thu Mar 14 06:05:33 2002
+++ apache_1.3.26-ipv6/src/modules/standard/mod_access.c	Wed Jun 19 08:05:34 2002
@@ -74,7 +74,10 @@
     T_ALL,
     T_IP,
     T_HOST,
-    T_FAIL
+    T_FAIL,
+#ifdef INET6
+    T_IP6,
+#endif
 };
 
 typedef struct {
@@ -82,9 +85,15 @@
     union {
 	char *from;
 	struct {
-	    unsigned long net;
-	    unsigned long mask;
+	    struct in_addr net;
+	    struct in_addr mask;
 	} ip;
+#ifdef INET6
+	struct {
+	    struct in6_addr net6;
+	    struct in6_addr mask6;
+	} ip6;
+#endif
     } x;
     enum allowdeny_type type;
 } allowdeny;
@@ -167,90 +176,230 @@
 
     }
     else if ((s = strchr(where, '/'))) {
-	unsigned long mask;
+	struct addrinfo hints, *resnet, *resmask;
+	struct sockaddr_storage net, mask;
+	int error;
+	char *p;
+	int justdigits;
 
-	a->type = T_IP;
+	a->type = T_FAIL;	/*just in case*/
 	/* trample on where, we won't be using it any more */
 	*s++ = '\0';
 
-	if (!is_ip(where)
-	    || (a->x.ip.net = ap_inet_addr(where)) == INADDR_NONE) {
+	justdigits = 0;
+	for (p = s; *p; p++) {
+	    if (!isdigit(*p))
+		break;
+	}
+	if (!*p)
+	    justdigits++;
+
+	memset(&hints, 0, sizeof(hints));
+	hints.ai_family = PF_UNSPEC;
+	hints.ai_socktype = SOCK_STREAM;	/*dummy*/
+#ifdef AI_NUMERICHOST
+	hints.ai_flags = AI_NUMERICHOST;	/*don't resolve*/
+#endif
+	resnet = NULL;
+	error = getaddrinfo(where, NULL, &hints, &resnet);
+	if (error || !resnet) {
+	    if (resnet)
+		freeaddrinfo(resnet);
 	    a->type = T_FAIL;
 	    return "syntax error in network portion of network/netmask";
 	}
+	if (resnet->ai_next) {
+	    freeaddrinfo(resnet);
+	    a->type = T_FAIL;
+	    return "network/netmask resolved to multiple addresses";
+	}
+	memcpy(&net, resnet->ai_addr, resnet->ai_addrlen);
+	freeaddrinfo(resnet);
 
-	/* is_ip just tests if it matches [\d.]+ */
-	if (!is_ip(s)) {
+	switch (net.ss_family) {
+	case AF_INET:
+	    a->type = T_IP;
+	    a->x.ip.net.s_addr = ((struct sockaddr_in *)&net)->sin_addr.s_addr;
+	    break;
+#ifdef INET6
+	case AF_INET6:
+	    a->type = T_IP6;
+	    memcpy(&a->x.ip6.net6, &((struct sockaddr_in6 *)&net)->sin6_addr,
+		sizeof(a->x.ip6.net6));
+	    break;
+#endif
+	default:
 	    a->type = T_FAIL;
-	    return "syntax error in mask portion of network/netmask";
+	    return "unknown address family for network";
 	}
-	/* is it in /a.b.c.d form? */
-	if (strchr(s, '.')) {
-	    mask = ap_inet_addr(s);
-	    if (mask == INADDR_NONE) {
+
+	if (!justdigits) {
+	    memset(&hints, 0, sizeof(hints));
+	    hints.ai_family = PF_UNSPEC;
+	    hints.ai_socktype = SOCK_STREAM;	/*dummy*/ 
+#ifdef AI_NUMERICHOST
+	    hints.ai_flags = AI_NUMERICHOST;	/*don't resolve*/
+#endif
+	    resmask = NULL;
+	    error = getaddrinfo(s, NULL, &hints, &resmask);
+	    if (error || !resmask) {
+		if (resmask)
+		    freeaddrinfo(resmask);
 		a->type = T_FAIL;
 		return "syntax error in mask portion of network/netmask";
 	    }
-	}
-	else {
-	    /* assume it's in /nnn form */
-	    mask = atoi(s);
-	    if (mask > 32 || mask <= 0) {
-		a->type = T_FAIL;
-		return "invalid mask in network/netmask";
-	    }
-	    mask = 0xFFFFFFFFUL << (32 - mask);
-	    mask = htonl(mask);
-	}
-	a->x.ip.mask = mask;
-        a->x.ip.net  = (a->x.ip.net & mask);   /* pjr - This fixes PR 4770 */
-    }
-    else if (ap_isdigit(*where) && is_ip(where)) {
-	/* legacy syntax for ip addrs: a.b.c. ==> a.b.c.0/24 for example */
-	int shift;
-	char *t;
-	int octet;
-
-	a->type = T_IP;
-	/* parse components */
-	s = where;
-	a->x.ip.net = 0;
-	a->x.ip.mask = 0;
-	shift = 24;
-	while (*s) {
-	    t = s;
-	    if (!ap_isdigit(*t)) {
+	    if (resmask->ai_next) {
+		freeaddrinfo(resmask);
 		a->type = T_FAIL;
-		return "invalid ip address";
+		return "network/netmask resolved to multiple addresses";
 	    }
-	    while (ap_isdigit(*t)) {
-		++t;
-	    }
-	    if (*t == '.') {
-		*t++ = 0;
-	    }
-	    else if (*t) {
+	    memcpy(&mask, resmask->ai_addr, resmask->ai_addrlen);
+	    freeaddrinfo(resmask);
+
+	    if (net.ss_family != mask.ss_family) {
 		a->type = T_FAIL;
-		return "invalid ip address";
+		return "network/netmask resolved to different address family";
 	    }
-	    if (shift < 0) {
-		return "invalid ip address, only 4 octets allowed";
+
+	    switch (a->type) {
+	    case T_IP:
+		a->x.ip.mask.s_addr =
+		    ((struct sockaddr_in *)&mask)->sin_addr.s_addr;
+		break;
+#ifdef INET6
+	    case T_IP6:
+		memcpy(&a->x.ip6.mask6,
+		    &((struct sockaddr_in6 *)&mask)->sin6_addr,
+		    sizeof(a->x.ip6.mask6));
+		break;
+#endif
 	    }
-	    octet = atoi(s);
-	    if (octet < 0 || octet > 255) {
-		a->type = T_FAIL;
-		return "each octet must be between 0 and 255 inclusive";
+	} else {
+	    int mask;
+	    mask = atoi(s);
+	    switch (a->type) {
+	    case T_IP:
+		if (mask < 0 || 32 < mask) {
+		    a->type = T_FAIL;
+		    return "netmask out of range";
+		}
+		a->x.ip.mask.s_addr = htonl(0xFFFFFFFFUL << (32 - mask));
+		break;
+#ifdef INET6
+	    case T_IP6:
+	      {
+		int i;
+		if (mask < 0 || 128 < mask) {
+		    a->type = T_FAIL;
+		    return "netmask out of range";
+		}
+		for (i = 0; i < mask / 8; i++) {
+		    a->x.ip6.mask6.s6_addr[i] = 0xff;
+		}
+		if (mask % 8)
+		    a->x.ip6.mask6.s6_addr[i] = 0xff << (8 - (mask % 8));
+		break;
+	      }
+#endif
 	    }
-	    a->x.ip.net |= octet << shift;
-	    a->x.ip.mask |= 0xFFUL << shift;
-	    s = t;
-	    shift -= 8;
 	}
-	a->x.ip.net = ntohl(a->x.ip.net);
-	a->x.ip.mask = ntohl(a->x.ip.mask);
     }
     else {
-	a->type = T_HOST;
+	struct addrinfo hints, *res;
+	struct sockaddr_storage ss;
+	int error;
+
+	a->type = T_FAIL;	/*just in case*/
+
+	/* First, try using the old apache code to match */
+	/* legacy syntax for ip addrs: a.b.c. ==> a.b.c.0/24 for example */
+	if (ap_isdigit(*where) && is_ip(where)) {
+	    int shift;
+	    char *t;
+	    int octet;
+
+	    a->type = T_IP;
+	    /* parse components */
+	    s = where;
+	    a->x.ip.net.s_addr = 0;
+	    a->x.ip.mask.s_addr = 0;
+	    shift = 24;
+	    while (*s) {
+		t = s;
+		if (!ap_isdigit(*t)) {
+		    a->type = T_FAIL;
+		    return "invalid ip address";
+		}
+		while (ap_isdigit(*t)) {
+		    ++t;
+		}
+		if (*t == '.') {
+		    *t++ = 0;
+		}
+		else if (*t) {
+		    a->type = T_FAIL;
+		    return "invalid ip address";
+		}
+		if (shift < 0) {
+		    return "invalid ip address, only 4 octets allowed";
+		}
+		octet = atoi(s);
+		if (octet < 0 || octet > 255) {
+		    a->type = T_FAIL;
+		    return "each octet must be between 0 and 255 inclusive";
+		}
+		a->x.ip.net.s_addr |= octet << shift;
+		a->x.ip.mask.s_addr |= 0xFFUL << shift;
+		s = t;
+		shift -= 8;
+	    }
+	    a->x.ip.net.s_addr = ntohl(a->x.ip.net.s_addr);
+	    a->x.ip.mask.s_addr = ntohl(a->x.ip.mask.s_addr);
+
+	    return NULL;
+	}
+
+	/* IPv4/v6 numeric address */
+	memset(&hints, 0, sizeof(hints));
+	hints.ai_family = PF_UNSPEC;
+	hints.ai_socktype = SOCK_STREAM;	/*dummy*/
+#ifdef AI_NUMERICHOST
+	hints.ai_flags = AI_NUMERICHOST;	/*don't resolve*/
+#endif
+	res = NULL;
+	error = getaddrinfo(where, NULL, &hints, &res);
+	if (error || !res) {
+	    if (res)
+		freeaddrinfo(res);
+	    a->type = T_HOST;
+	    return NULL;
+	}
+	if (res->ai_next) {
+	    freeaddrinfo(res);
+	    a->type = T_FAIL;
+	    return "network/netmask resolved to multiple addresses";
+	}
+	memcpy(&ss, res->ai_addr, res->ai_addrlen);
+	freeaddrinfo(res);
+
+	switch (ss.ss_family) {
+	case AF_INET:
+	    a->type = T_IP;
+	    a->x.ip.net.s_addr = ((struct sockaddr_in *)&ss)->sin_addr.s_addr;
+	    memset(&a->x.ip.mask, 0xff, sizeof(a->x.ip.mask));
+	    break;
+#ifdef INET6
+	case AF_INET6:
+	    a->type = T_IP6;
+	    memcpy(&a->x.ip6.net6, &((struct sockaddr_in6 *)&ss)->sin6_addr,
+		sizeof(a->x.ip6.net6));
+	    memset(&a->x.ip6.mask6, 0xff, sizeof(a->x.ip6.mask6));
+	    break;
+#endif
+	default:
+	    a->type = T_FAIL;
+	    return "unknown address family for network";
+	}
     }
 
     return NULL;
@@ -315,12 +464,63 @@
 	    return 1;
 
 	case T_IP:
-	    if (ap[i].x.ip.net != INADDR_NONE
-		&& (r->connection->remote_addr.sin_addr.s_addr
-		    & ap[i].x.ip.mask) == ap[i].x.ip.net) {
-		return 1;
+	    if (ap[i].x.ip.net.s_addr == INADDR_NONE)
+		break;
+	    switch (r->connection->remote_addr.ss_family) {
+	    case AF_INET:
+		if ((((struct sockaddr_in *)&r->connection->remote_addr)->sin_addr.s_addr
+			& ap[i].x.ip.mask.s_addr) == ap[i].x.ip.net.s_addr) {
+		    return 1;
+		}
+		break;
+#ifdef INET6
+	    case AF_INET6:
+		if (!IN6_IS_ADDR_V4MAPPED(&((struct sockaddr_in6 *)&r->connection->remote_addr)->sin6_addr))	/*XXX*/
+		    break;
+		if ((*(ap_uint32_t *)&((struct sockaddr_in6 *)&r->connection->remote_addr)->sin6_addr.s6_addr[12]
+			& ap[i].x.ip.mask.s_addr) == ap[i].x.ip.net.s_addr) {
+		    return 1;
+		}
+		break;
+#endif
+	    }
+	    break;
+
+#ifdef INET6
+	case T_IP6:
+	  {
+	    struct in6_addr masked;
+	    int j;
+	    if (IN6_IS_ADDR_UNSPECIFIED(&ap[i].x.ip6.net6))
+		break;
+	    switch (r->connection->remote_addr.ss_family) {
+	    case AF_INET:
+		if (!IN6_IS_ADDR_V4MAPPED(&ap[i].x.ip6.net6))	/*XXX*/
+		    break;
+		memset(&masked, 0, sizeof(masked));
+		masked.s6_addr[10] = masked.s6_addr[11] = 0xff;
+		memcpy(&masked.s6_addr[12],
+		    &((struct sockaddr_in *)&r->connection->remote_addr)->sin_addr.s_addr,
+		    sizeof(struct sockaddr_in));
+		for (j = 0; j < sizeof(struct in6_addr); j++)
+			masked.s6_addr[j] &= ap[i].x.ip6.mask6.s6_addr[j];
+		if (memcmp(&masked, &ap[i].x.ip6.net6, sizeof(masked)) == 0)
+		    return 1;
+		break;
+	    case AF_INET6:
+		memset(&masked, 0, sizeof(masked));
+		memcpy(&masked,
+		    &((struct sockaddr_in6 *)&r->connection->remote_addr)->sin6_addr,
+		    sizeof(masked));
+		for (j = 0; j < sizeof(struct in6_addr); j++)
+		    masked.s6_addr[j] &= ap[i].x.ip6.mask6.s6_addr[j];
+		if (memcmp(&masked, &ap[i].x.ip6.net6, sizeof(masked)) == 0)
+		    return 1;
+		break;
 	    }
 	    break;
+	  }
+#endif
 
 	case T_HOST:
 	    if (!gothost) {
diff -Nur apache_1.3.26/src/modules/standard/mod_unique_id.c apache_1.3.26-ipv6/src/modules/standard/mod_unique_id.c
--- apache_1.3.26/src/modules/standard/mod_unique_id.c	Thu Mar 14 06:05:34 2002
+++ apache_1.3.26-ipv6/src/modules/standard/mod_unique_id.c	Wed Jun 19 08:05:34 2002
@@ -67,10 +67,20 @@
 #include "http_config.h"
 #include "http_log.h"
 #include "multithread.h"
+#include "sa_len.h"
 
 typedef struct {
     unsigned int stamp;
-    unsigned int in_addr;
+    union {
+      ap_uint32_t     in;
+#ifdef INET6
+# ifdef SHORT_UNIQUE_ID
+      ap_uint32_t     in6;
+# else
+      struct in6_addr in6;
+# endif
+#endif
+    } addr;
     unsigned int pid;
 #ifdef MULTITHREAD
     unsigned int tid;
@@ -142,7 +152,7 @@
  * this shouldn't be a problem till year 2106.
  */
 
-static unsigned global_in_addr;
+static struct sockaddr_storage global_addr;
 
 #ifdef WIN32
 
@@ -221,7 +231,8 @@
 #define MAXHOSTNAMELEN 256
 #endif
     char str[MAXHOSTNAMELEN + 1];
-    struct hostent *hent;
+    struct addrinfo hints, *res, *res0;
+    int error;
 #ifndef NO_GETTIMEOFDAY
     struct timeval tv;
 #endif
@@ -232,8 +243,8 @@
      */
     unique_id_rec_offset[0] = XtOffsetOf(unique_id_rec, stamp);
     unique_id_rec_size[0] = sizeof(cur_unique_id->stamp);
-    unique_id_rec_offset[1] = XtOffsetOf(unique_id_rec, in_addr);
-    unique_id_rec_size[1] = sizeof(cur_unique_id->in_addr);
+    unique_id_rec_offset[1] = XtOffsetOf(unique_id_rec, addr);
+    unique_id_rec_size[1] = sizeof(cur_unique_id->addr);
     unique_id_rec_offset[2] = XtOffsetOf(unique_id_rec, pid);
     unique_id_rec_size[2] = sizeof(cur_unique_id->pid);
 #ifdef MULTITHREAD
@@ -269,17 +280,44 @@
     }
     str[sizeof(str) - 1] = '\0';
 
-    if ((hent = gethostbyname(str)) == NULL) {
+    memset(&hints, 0, sizeof(hints));
+    hints.ai_family = PF_UNSPEC;
+    error = getaddrinfo(str, NULL, &hints, &res0);
+    if (error) {
         ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ALERT, s,
-		     "mod_unique_id: unable to gethostbyname(\"%s\")", str);
+                     "mod_unique_id: getaddrinfo failed for \"%s\" (%s)", str,
+		     gai_strerror(error));
         exit(1);
     }
 
-    global_in_addr = ((struct in_addr *) hent->h_addr_list[0])->s_addr;
+    error = 1;
+    for (res = res0; res; res = res->ai_next) {
+	switch (res->ai_family) {
+	case AF_INET:
+#ifdef INET6
+	case AF_INET6:
+#endif
+	    memcpy(&global_addr, res->ai_addr, res->ai_addrlen);
+	    error = 0;
+	    break;
+	}
+    }
+    freeaddrinfo(res0);
+    if (error) {
+        ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ALERT, s,
+                    "mod_unique_id: no known AF found for \"%s\"", str);
+        exit(1);
+    }
 
+    getnameinfo((struct sockaddr *)&global_addr,
+#ifndef SIN6_LEN
+	SA_LEN((struct sockaddr *)&global_addr),
+#else
+	global_addr.ss_len,
+#endif
+	str, sizeof(str), NULL, 0, NI_NUMERICHOST);
     ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_INFO, s,
-		 "mod_unique_id: using ip addr %s",
-		 inet_ntoa(*(struct in_addr *) hent->h_addr_list[0]));
+                 "mod_unique_id: using ip addr %s", str);
 
     /*
      * If the server is pummelled with restart requests we could possibly end
@@ -336,7 +374,24 @@
 		     "oh no! pids are greater than 32-bits!  I'm broken!");
     }
 
-    cur_unique_id->in_addr = global_in_addr;
+    memset(&cur_unique_id->addr, 0, sizeof(cur_unique_id->addr));
+    switch (global_addr.ss_family) {
+    case AF_INET:
+      cur_unique_id->addr.in =
+          ((struct sockaddr_in *)&global_addr)->sin_addr.s_addr;
+      break;
+#ifdef INET6
+    case AF_INET6:
+#ifdef SHORT_UNIQUE_ID
+      cur_unique_id->addr.in6 =
+          ((struct sockaddr_in6 *)&global_addr)->sin6_addr.s6_addr32[3];
+#else
+      cur_unique_id->addr.in6 =
+          ((struct sockaddr_in6 *)&global_addr)->sin6_addr;
+#endif
+      break;
+#endif
+    }
 
     /*
      * If we use 0 as the initial counter we have a little less protection
diff -Nur apache_1.3.26/src/os/win32/MakeModuleMak.mak apache_1.3.26-ipv6/src/os/win32/MakeModuleMak.mak
--- apache_1.3.26/src/os/win32/MakeModuleMak.mak	Thu Jan  1 09:00:00 1970
+++ apache_1.3.26-ipv6/src/os/win32/MakeModuleMak.mak	Wed Jun 19 08:05:35 2002
@@ -0,0 +1,195 @@
+# Microsoft Developer Studio Generated NMAKE File, Format Version 4.20
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+!IF "$(CFG)" == ""
+CFG=MakeModuleMak - Win32 Debug
+!MESSAGE No configuration specified.  Defaulting to MakeModuleMak - Win32\
+ Debug.
+!ENDIF 
+
+!IF "$(CFG)" != "MakeModuleMak - Win32 Release" && "$(CFG)" !=\
+ "MakeModuleMak - Win32 Debug"
+!MESSAGE Invalid configuration "$(CFG)" specified.
+!MESSAGE You can specify a configuration when running NMAKE on this makefile
+!MESSAGE by defining the macro CFG on the command line.  For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "MakeModuleMak.mak" CFG="MakeModuleMak - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "MakeModuleMak - Win32 Release" (based on\
+ "Win32 (x86) Console Application")
+!MESSAGE "MakeModuleMak - Win32 Debug" (based on\
+ "Win32 (x86) Console Application")
+!MESSAGE 
+!ERROR An invalid configuration is specified.
+!ENDIF 
+
+!IF "$(OS)" == "Windows_NT"
+NULL=
+!ELSE 
+NULL=nul
+!ENDIF 
+################################################################################
+# Begin Project
+RSC=rc.exe
+CPP=bcc32.exe
+
+!IF  "$(CFG)" == "MakeModuleMak - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+OUTDIR=.\Release
+INTDIR=.\Release
+
+ALL : "$(OUTDIR)\MakeModuleMak.exe"
+
+CLEAN : 
+	-@erase "$(INTDIR)\MakeModuleMak.obj"
+	-@erase "$(OUTDIR)\MakeModuleMak.exe"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c
+# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c
+CPP_PROJ=-s /ML -w-8057 -w-8008 -w-8066 /O2 -D"WIN32" -D"NDEBUG" -D"_CONSOLE"\
+ /Fp"$(INTDIR)/MakeModuleMak.pch" /YX -o"$(INTDIR)/$&.obj" /c 
+CPP_OBJS=.\Release/
+CPP_SBRS=.\.
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/MakeModuleMak.bsc" 
+BSC32_SBRS= \
+	
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\
+ odbccp32.lib /nologo /subsystem:console /incremental:no\
+ /pdb:"$(OUTDIR)/MakeModuleMak.pdb" /machine:I386\
+ /out:"$(OUTDIR)/MakeModuleMak.exe" 
+LINK32_OBJS= \
+	"$(INTDIR)\MakeModuleMak.obj"
+
+"$(OUTDIR)\MakeModuleMak.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF  "$(CFG)" == "MakeModuleMak - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Target_Dir ""
+OUTDIR=.\Debug
+INTDIR=.\Debug
+
+ALL : "$(OUTDIR)\MakeModuleMak.exe"
+
+CLEAN : 
+	-@erase "$(INTDIR)\MakeModuleMak.obj"
+	-@erase "$(INTDIR)\vc40.idb"
+	-@erase "$(INTDIR)\vc40.pdb"
+	-@erase "$(OUTDIR)\MakeModuleMak.exe"
+	-@erase "$(OUTDIR)\MakeModuleMak.ilk"
+	-@erase "$(OUTDIR)\MakeModuleMak.pdb"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /c
+# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /c
+CPP_PROJ=-s /MLd -w-8057 -w-8008 -w-8066 /Gm -v /Od -D"WIN32" -D"_DEBUG" -D"_CONSOLE"\
+ /Fp"$(INTDIR)/MakeModuleMak.pch" /YX -o"$(INTDIR)/$&.obj" /c 
+CPP_OBJS=.\Debug/
+CPP_SBRS=.\.
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/MakeModuleMak.bsc" 
+BSC32_SBRS= \
+	
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\
+ odbccp32.lib /nologo /subsystem:console /incremental:yes\
+ /pdb:"$(OUTDIR)/MakeModuleMak.pdb" /debug /machine:I386\
+ /out:"$(OUTDIR)/MakeModuleMak.exe" 
+LINK32_OBJS= \
+	"$(INTDIR)\MakeModuleMak.obj"
+
+"$(OUTDIR)\MakeModuleMak.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ENDIF 
+
+.c.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx.obj:
+   $(CPP) $(CPP_PROJ) $<  
+
+.c{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cpp{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+.cxx{$(CPP_SBRS)}.sbr:
+   $(CPP) $(CPP_PROJ) $<  
+
+################################################################################
+# Begin Target
+
+# Name "MakeModuleMak - Win32 Release"
+# Name "MakeModuleMak - Win32 Debug"
+
+!IF  "$(CFG)" == "MakeModuleMak - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "MakeModuleMak - Win32 Debug"
+
+!ENDIF 
+
+################################################################################
+# Begin Source File
+
+SOURCE_1=.\MakeModuleMak.cpp
+
+"$(INTDIR)\MakeModuleMak.obj" : $(SOURCE_0) "$(INTDIR)"
+
+
+# End Source File
+# End Target
+# End Project
+################################################################################
diff -Nur apache_1.3.26/src/os/win32/installer/README.TXT apache_1.3.26-ipv6/src/os/win32/installer/README.TXT
--- apache_1.3.26/src/os/win32/installer/README.TXT	Thu Jan  1 09:00:00 1970
+++ apache_1.3.26-ipv6/src/os/win32/installer/README.TXT	Wed Jun 19 08:05:35 2002
@@ -0,0 +1,6 @@
+Read the Apache for Windows how to release document at
+
+  http://dev.apache.org/how-to-release-win32.html
+
+for details of how to use this IS2 configuration file and
+the installer DLL to build an Apache release.
diff -Nur apache_1.3.26/src/os/win32/installer/apache.iwz apache_1.3.26-ipv6/src/os/win32/installer/apache.iwz
--- apache_1.3.26/src/os/win32/installer/apache.iwz	Thu Jan  1 09:00:00 1970
+++ apache_1.3.26-ipv6/src/os/win32/installer/apache.iwz	Wed Jun 19 08:05:35 2002
@@ -0,0 +1,995 @@
+
+[InstallShield Wizard]
+iDate=1
+iTime=1
+Flag=fe000000
+ISX.EXE Size=630784
+ISX.EXE Date=10:43:52  24/2/1998
+ISX.EXE Ver=2.0.0.143
+SETUP.EXE Size=45312
+SETUP.EXE Date=9:53:32  18/1/1997
+SETUP.EXE Ver=3.0.111.0
+SETUP.INS Size=70160
+SETUP.INS Date=13:16:56  11/2/1998
+SETUP.INS Ver=Not available
+_INST16.EX_ Size=282766
+_INST16.EX_ Date=9:56:04  18/1/1997
+_INST16.EX_ Ver=Not available
+_INST32I.EX_ Size=320411
+_INST32I.EX_ Date=10:04:08  18/1/1997
+_INST32I.EX_ Ver=Not available
+ISDEPEND.INI Size=320411
+ISDEPEND.INI Date=10:04:08  18/1/1997
+ISDEPEND.INI Ver=Not available
+SWDEPEND.INI Size=320411
+SWDEPEND.INI Date=10:04:08  18/1/1997
+SWDEPEND.INI Ver=Not available
+ICOMP.EXE Size=119808
+ICOMP.EXE Date=14:05:10  15/1/1996
+ICOMP.EXE Ver=3.00.062
+SPLIT.EXE Size=90624
+SPLIT.EXE Date=14:09:36  15/1/1996
+SPLIT.EXE Ver=3.00.060
+PACKLIST.EXE Size=87552
+PACKLIST.EXE Date=14:10:30  15/1/1996
+PACKLIST.EXE Ver=3.00.060
+Version=2.02
+DevTool=Generic Windows
+Platform=Win32
+DisksDir=apache\650MB\
+TabsVisit=1111001110000111100011
+LangNum=451
+LangDir=LANG\ENG\
+
+[VisualDesign]
+AppName=Apache
+AppExe=
+AppExeFile=
+Version=1.3.7 dev
+Company=Apache Group
+Title=Apache Web Server 1.3.7 dev
+TitleType=1
+BackgrndBmp=
+BackgrndAlign=4
+Backgrnd=1
+BackgrndColor=10
+Uninstall=1
+Silent=1
+SmsMode=0
+
+[Types]
+Types=3
+Type1Components=6
+Type1Name=Custom
+Type1ComponentList=1 3 4 6 5 2 
+Type2Components=5
+Type2Name=Typical
+Type2ComponentList=1 3 4 6 5 
+Type3Components=2
+Type3Name=Compact
+Type3ComponentList=1 6 
+
+[Components]
+Components=6
+Component1Groups=6
+Component1Name=Application Files
+Component1Description=Application files needed to run the application
+Component1GroupList=1 3 24 25 4 35 
+Component2Groups=17
+Component2Name=Source Code
+Component2Description=Source code for Apache and support tools
+Component2GroupList=10 11 12 13 14 15 16 17 18 19 20 21 22 23 31 32 34 
+Component3Groups=6
+Component3Name=Apache Manual
+Component3Description=Apache documentation
+Component3GroupList=5 6 7 8 9 36 
+Component4Groups=1
+Component4Name=Additional Modules
+Component4Description=Apache modules to extend the server
+Component4GroupList=2 
+Component5Groups=2
+Component5Name=Icons
+Component5Description=Icons for directory indexes
+Component5GroupList=27 33 
+Component6Groups=4
+Component6Name=Required Directories
+Component6Description=
+Component6GroupList=26 28 29 30 
+
+[Groups]
+Groups=36
+Group1Size=346325
+Group1Files=9
+Group1Name=Program Executables
+Group1Dir=<INSTALLDIR>
+Group1Update=0
+Group1TargetOS=-1
+Group1File1=C:\Apache\Apache.exe
+Group1File2=C:\Apache\ApacheCore.dll
+Group1File3=C:\Apache\Announcement
+Group1File4=C:\Apache\ABOUT_APACHE
+Group1File5=C:\Apache\KEYS
+Group1File6=C:\Apache\LICENSE
+Group1File7=C:\Apache\README
+Group1File8=C:\apache\Makefile.tmpl
+Group1File9=C:\apache\README-NT.TXT
+Group2Size=133120
+Group2Files=10
+Group2Name=Additional Modules
+Group2Dir=<INSTALLDIR>\modules
+Group2Update=0
+Group2TargetOS=-1
+Group2File1=C:\Apache\modules\ApacheModuleDigest.dll
+Group2File2=C:\Apache\modules\ApacheModuleCERNMeta.dll
+Group2File3=C:\Apache\modules\ApacheModuleAuthAnon.dll
+Group2File4=C:\Apache\modules\ApacheModuleExpires.dll
+Group2File5=C:\Apache\modules\ApacheModuleHeaders.dll
+Group2File6=C:\Apache\modules\ApacheModuleProxy.dll
+Group2File7=C:\Apache\modules\ApacheModuleSpeling.dll
+Group2File8=C:\Apache\modules\ApacheModuleStatus.dll
+Group2File9=C:\Apache\modules\ApacheModuleUserTrack.dll
+Group2File10=C:\apache\modules\ApacheModuleRewrite.dll
+Group3Size=49860
+Group3Files=6
+Group3Name=Configuration Files
+Group3Dir=<INSTALLDIR>\.tmp
+Group3Update=0
+Group3TargetOS=-1
+Group3File1=C:\Apache\conf\httpd.conf-dist-win
+Group3File2=C:\Apache\conf\access.conf-dist-win
+Group3File3=C:\Apache\conf\magic
+Group3File4=C:\Apache\conf\mime.types
+Group3File5=C:\Apache\conf\srm.conf-dist-win
+Group3File6=C:\apache\conf\highperformance.conf-dist
+Group4Size=3999
+Group4Files=2
+Group4Name=Initial Document Root Files
+Group4Dir=<INSTALLDIR>\.tmp
+Group4Update=1
+Group4TargetOS=-1
+Group4File1=C:\Apache\htdocs\index.html
+Group4File2=C:\apache\htdocs\apache_pb.gif
+Group5Size=295033
+Group5Files=34
+Group5Name=Manual
+Group5Dir=<INSTALLDIR>\htdocs\manual
+Group5Update=0
+Group5TargetOS=-1
+Group5File1=C:\apache\htdocs\manual\custom-error.html
+Group5File2=C:\apache\htdocs\manual\content-negotiation.html
+Group5File3=C:\apache\htdocs\manual\cgi_path.html
+Group5File4=C:\apache\htdocs\manual\dns-caveats.html
+Group5File5=C:\apache\htdocs\manual\dso.html
+Group5File6=C:\apache\htdocs\manual\ebcdic.html
+Group5File7=C:\apache\htdocs\manual\env.html
+Group5File8=C:\apache\htdocs\manual\footer.html
+Group5File9=C:\apache\htdocs\manual\handler.html
+Group5File10=C:\apache\htdocs\manual\header.html
+Group5File11=C:\apache\htdocs\manual\index.html
+Group5File12=C:\apache\htdocs\manual\install.html
+Group5File13=C:\apache\htdocs\manual\invoking.html
+Group5File14=C:\apache\htdocs\manual\keepalive.html
+Group5File15=C:\apache\htdocs\manual\LICENSE
+Group5File16=C:\apache\htdocs\manual\location.html
+Group5File17=C:\apache\htdocs\manual\man-template.html
+Group5File18=C:\apache\htdocs\manual\multilogs.html
+Group5File19=C:\apache\htdocs\manual\new_features_1_0.html
+Group5File20=C:\apache\htdocs\manual\new_features_1_1.html
+Group5File21=C:\apache\htdocs\manual\new_features_1_2.html
+Group5File22=C:\apache\htdocs\manual\new_features_1_3.html
+Group5File23=C:\apache\htdocs\manual\process-model.html
+Group5File24=C:\apache\htdocs\manual\sections.html
+Group5File25=C:\apache\htdocs\manual\sourcereorg.html
+Group5File26=C:\apache\htdocs\manual\stopping.html
+Group5File27=C:\apache\htdocs\manual\suexec.html
+Group5File28=C:\apache\htdocs\manual\unixware.html
+Group5File29=C:\apache\htdocs\manual\upgrading_to_1_3.html
+Group5File30=C:\apache\htdocs\manual\windows.html
+Group5File31=C:\apache\htdocs\manual\bind.html
+Group5File32=C:\apache\htdocs\manual\suexec_1_2.html
+Group5File33=C:\apache\htdocs\manual\install-tpf.html
+Group5File34=C:\apache\htdocs\manual\readme-tpf.html
+Group6Size=42478
+Group6Files=8
+Group6Name=images
+Group6Dir=[Manual]\images
+Group6Update=0
+Group6TargetOS=-1
+Group6File1=C:\Apache\htdocs\manual\images\custom_errordocs.gif
+Group6File2=C:\Apache\htdocs\manual\images\home.gif
+Group6File3=C:\Apache\htdocs\manual\images\index.gif
+Group6File4=C:\Apache\htdocs\manual\images\sub.gif
+Group6File5=C:\apache\htdocs\manual\images\mod_rewrite_fig1.fig
+Group6File6=C:\apache\htdocs\manual\images\mod_rewrite_fig1.gif
+Group6File7=C:\apache\htdocs\manual\images\mod_rewrite_fig2.fig
+Group6File8=C:\apache\htdocs\manual\images\mod_rewrite_fig2.gif
+Group7Size=329371
+Group7Files=22
+Group7Name=misc
+Group7Dir=[Manual]\misc
+Group7Update=0
+Group7TargetOS=-1
+Group7File1=C:\Apache\htdocs\manual\misc\API.html
+Group7File2=C:\Apache\htdocs\manual\misc\client_block_api.html
+Group7File3=C:\Apache\htdocs\manual\misc\compat_notes.html
+Group7File4=C:\Apache\htdocs\manual\misc\custom_errordocs.html
+Group7File5=C:\Apache\htdocs\manual\misc\descriptors.html
+Group7File6=C:\Apache\htdocs\manual\misc\FAQ.html
+Group7File7=C:\Apache\htdocs\manual\misc\fin_wait_2.html
+Group7File8=C:\Apache\htdocs\manual\misc\footer.html
+Group7File9=C:\Apache\htdocs\manual\misc\header.html
+Group7File10=C:\Apache\htdocs\manual\misc\howto.html
+Group7File11=C:\Apache\htdocs\manual\misc\index.html
+Group7File12=C:\Apache\htdocs\manual\misc\known_client_problems.html
+Group7File13=C:\Apache\htdocs\manual\misc\nopgp.html
+Group7File14=C:\Apache\htdocs\manual\misc\perf-bsd44.html
+Group7File15=C:\Apache\htdocs\manual\misc\perf-dec.html
+Group7File16=C:\Apache\htdocs\manual\misc\perf-hp.html
+Group7File17=C:\Apache\htdocs\manual\misc\perf-tuning.html
+Group7File18=C:\Apache\htdocs\manual\misc\perf.html
+Group7File19=C:\Apache\htdocs\manual\misc\security_tips.html
+Group7File20=C:\Apache\htdocs\manual\misc\vif-info.html
+Group7File21=C:\Apache\htdocs\manual\misc\windoz_keepalive.html
+Group7File22=C:\apache\htdocs\manual\misc\HTTP_Features.tsv
+Group8Size=558131
+Group8Files=48
+Group8Name=mod
+Group8Dir=[Manual]\mod
+Group8Update=0
+Group8TargetOS=-1
+Group8File1=C:\Apache\htdocs\manual\mod\core.html
+Group8File2=C:\Apache\htdocs\manual\mod\directive-dict.html
+Group8File3=C:\Apache\htdocs\manual\mod\directives.html
+Group8File4=C:\Apache\htdocs\manual\mod\footer.html
+Group8File5=C:\Apache\htdocs\manual\mod\header.html
+Group8File6=C:\Apache\htdocs\manual\mod\index.html
+Group8File7=C:\Apache\htdocs\manual\mod\mod_access.html
+Group8File8=C:\Apache\htdocs\manual\mod\mod_actions.html
+Group8File9=C:\Apache\htdocs\manual\mod\mod_alias.html
+Group8File10=C:\Apache\htdocs\manual\mod\mod_asis.html
+Group8File11=C:\Apache\htdocs\manual\mod\mod_auth.html
+Group8File12=C:\Apache\htdocs\manual\mod\mod_auth_anon.html
+Group8File13=C:\Apache\htdocs\manual\mod\mod_auth_db.html
+Group8File14=C:\Apache\htdocs\manual\mod\mod_auth_dbm.html
+Group8File15=C:\Apache\htdocs\manual\mod\mod_autoindex.html
+Group8File16=C:\Apache\htdocs\manual\mod\mod_browser.html
+Group8File17=C:\Apache\htdocs\manual\mod\mod_cern_meta.html
+Group8File18=C:\Apache\htdocs\manual\mod\mod_cgi.html
+Group8File19=C:\Apache\htdocs\manual\mod\mod_cookies.html
+Group8File20=C:\Apache\htdocs\manual\mod\mod_digest.html
+Group8File21=C:\Apache\htdocs\manual\mod\mod_dir.html
+Group8File22=C:\Apache\htdocs\manual\mod\mod_dld.html
+Group8File23=C:\Apache\htdocs\manual\mod\mod_dll.html
+Group8File24=C:\Apache\htdocs\manual\mod\mod_env.html
+Group8File25=C:\Apache\htdocs\manual\mod\mod_example.html
+Group8File26=C:\Apache\htdocs\manual\mod\mod_expires.html
+Group8File27=C:\Apache\htdocs\manual\mod\mod_headers.html
+Group8File28=C:\Apache\htdocs\manual\mod\mod_imap.html
+Group8File29=C:\Apache\htdocs\manual\mod\mod_include.html
+Group8File30=C:\Apache\htdocs\manual\mod\mod_info.html
+Group8File31=C:\Apache\htdocs\manual\mod\mod_isapi.html
+Group8File32=C:\Apache\htdocs\manual\mod\mod_log_agent.html
+Group8File33=C:\Apache\htdocs\manual\mod\mod_log_common.html
+Group8File34=C:\Apache\htdocs\manual\mod\mod_log_config.html
+Group8File35=C:\Apache\htdocs\manual\mod\mod_log_referer.html
+Group8File36=C:\Apache\htdocs\manual\mod\mod_mime.html
+Group8File37=C:\Apache\htdocs\manual\mod\mod_mime_magic.html
+Group8File38=C:\Apache\htdocs\manual\mod\mod_negotiation.html
+Group8File39=C:\Apache\htdocs\manual\mod\mod_proxy.html
+Group8File40=C:\Apache\htdocs\manual\mod\mod_rewrite.html
+Group8File41=C:\Apache\htdocs\manual\mod\mod_setenvif.html
+Group8File42=C:\Apache\htdocs\manual\mod\mod_so.html
+Group8File43=C:\Apache\htdocs\manual\mod\mod_speling.html
+Group8File44=C:\Apache\htdocs\manual\mod\mod_status.html
+Group8File45=C:\Apache\htdocs\manual\mod\mod_unique_id.html
+Group8File46=C:\Apache\htdocs\manual\mod\mod_userdir.html
+Group8File47=C:\Apache\htdocs\manual\mod\mod_usertrack.html
+Group8File48=C:\apache\htdocs\manual\mod\mod_mmap_static.html
+Group9Size=112629
+Group9Files=13
+Group9Name=vhosts
+Group9Dir=[Manual]\vhosts
+Group9Update=0
+Group9TargetOS=-1
+Group9File1=C:\Apache\htdocs\manual\vhosts\details.html
+Group9File2=C:\Apache\htdocs\manual\vhosts\details_1_2.html
+Group9File3=C:\Apache\htdocs\manual\vhosts\examples.html
+Group9File4=C:\Apache\htdocs\manual\vhosts\fd-limits.html
+Group9File5=C:\Apache\htdocs\manual\vhosts\footer.html
+Group9File6=C:\Apache\htdocs\manual\vhosts\header.html
+Group9File7=C:\Apache\htdocs\manual\vhosts\host.html
+Group9File8=C:\Apache\htdocs\manual\vhosts\index.html
+Group9File9=C:\Apache\htdocs\manual\vhosts\ip-based.html
+Group9File10=C:\Apache\htdocs\manual\vhosts\name-based.html
+Group9File11=C:\Apache\htdocs\manual\vhosts\vhosts-in-depth.html
+Group9File12=C:\Apache\htdocs\manual\vhosts\virtual-host.html
+Group9File13=C:\apache\htdocs\manual\vhosts\mass.html
+Group10Size=523748
+Group10Files=19
+Group10Name=src
+Group10Dir=<INSTALLDIR>\src
+Group10Update=0
+Group10TargetOS=-1
+Group10File1=C:\Apache\src\.gdbinit
+Group10File2=C:\Apache\src\Apache.dsp
+Group10File3=C:\Apache\src\Apache.mak
+Group10File4=C:\Apache\src\ApacheCore.def
+Group10File5=C:\Apache\src\ApacheCore.dsp
+Group10File6=C:\Apache\src\ApacheCore.mak
+Group10File7=C:\Apache\src\buildmark.c
+Group10File8=C:\Apache\src\CHANGES
+Group10File9=C:\Apache\src\Configuration.tmpl
+Group10File10=C:\Apache\src\Configure
+Group10File11=C:\Apache\src\INSTALL
+Group10File12=C:\Apache\src\Makefile.nt
+Group10File13=C:\Apache\src\Makefile.tmpl
+Group10File14=C:\Apache\src\PORTING
+Group10File15=C:\Apache\src\README
+Group10File16=C:\Apache\src\README.EBCDIC
+Group10File17=C:\apache\src\BUILD.NOTES
+Group10File18=C:\apache\src\Makefile_win32.txt
+Group10File19=C:\apache\src\Makefile_win32_debug.txt
+Group11Size=92924
+Group11Files=10
+Group11Name=ap
+Group11Dir=[src]\ap
+Group11Update=0
+Group11TargetOS=-1
+Group11File1=C:\Apache\src\ap\ap.dsp
+Group11File2=C:\Apache\src\ap\ap.mak
+Group11File3=C:\Apache\src\ap\ap_cpystrn.c
+Group11File4=C:\Apache\src\ap\ap_execve.c
+Group11File5=C:\Apache\src\ap\ap_signal.c
+Group11File6=C:\Apache\src\ap\ap_slack.c
+Group11File7=C:\Apache\src\ap\ap_snprintf.c
+Group11File8=C:\Apache\src\ap\Makefile.tmpl
+Group11File9=C:\apache\src\ap\ap_fnmatch.c
+Group11File10=C:\apache\src\ap\ap_md5c.c
+Group12Size=255397
+Group12Files=29
+Group12Name=include
+Group12Dir=[src]\include
+Group12Update=0
+Group12TargetOS=-1
+Group12File1=C:\Apache\src\include\alloc.h
+Group12File2=C:\Apache\src\include\ap.h
+Group12File3=C:\Apache\src\include\buff.h
+Group12File4=C:\Apache\src\include\conf.h
+Group12File5=C:\Apache\src\include\explain.h
+Group12File6=C:\Apache\src\include\fnmatch.h
+Group12File7=C:\Apache\src\include\hsregex.h
+Group12File8=C:\Apache\src\include\httpd.h
+Group12File9=C:\Apache\src\include\http_config.h
+Group12File10=C:\Apache\src\include\http_conf_globals.h
+Group12File11=C:\Apache\src\include\http_core.h
+Group12File12=C:\Apache\src\include\http_log.h
+Group12File13=C:\Apache\src\include\http_main.h
+Group12File14=C:\Apache\src\include\http_protocol.h
+Group12File15=C:\Apache\src\include\http_request.h
+Group12File16=C:\Apache\src\include\http_vhost.h
+Group12File17=C:\Apache\src\include\ap_md5.h
+Group12File18=C:\Apache\src\include\multithread.h
+Group12File19=C:\Apache\src\include\rfc1413.h
+Group12File20=C:\Apache\src\include\scoreboard.h
+Group12File21=C:\Apache\src\include\util_date.h
+Group12File22=C:\Apache\src\include\util_md5.h
+Group12File23=C:\Apache\src\include\util_script.h
+Group12File24=C:\apache\src\include\compat.h
+Group12File25=C:\apache\src\include\util_uri.h
+Group12File26=C:\apache\src\include\ap_compat.h
+Group12File27=C:\apache\src\include\ap_config.h
+Group12File28=C:\apache\src\include\ap_ctype.h
+Group12File29=C:\apache\src\include\ap_mmn.h
+Group13Size=789788
+Group13Files=22
+Group13Name=main
+Group13Dir=[src]\main
+Group13Update=0
+Group13TargetOS=-1
+Group13File1=C:\apache\src\main\alloc.c
+Group13File2=C:\apache\src\main\buff.c
+Group13File3=C:\apache\src\main\gen_test_char.c
+Group13File4=C:\apache\src\main\gen_test_char.dsp
+Group13File5=C:\apache\src\main\gen_test_char.mak
+Group13File6=C:\apache\src\main\gen_uri_delims.c
+Group13File7=C:\apache\src\main\gen_uri_delims.dsp
+Group13File8=C:\apache\src\main\gen_uri_delims.mak
+Group13File9=C:\apache\src\main\http_config.c
+Group13File10=C:\apache\src\main\http_core.c
+Group13File11=C:\apache\src\main\http_log.c
+Group13File12=C:\apache\src\main\http_main.c
+Group13File13=C:\apache\src\main\http_protocol.c
+Group13File14=C:\apache\src\main\http_request.c
+Group13File15=C:\apache\src\main\http_vhost.c
+Group13File16=C:\apache\src\main\Makefile.tmpl
+Group13File17=C:\apache\src\main\rfc1413.c
+Group13File18=C:\apache\src\main\util.c
+Group13File19=C:\apache\src\main\util_date.c
+Group13File20=C:\apache\src\main\util_md5.c
+Group13File21=C:\apache\src\main\util_script.c
+Group13File22=C:\apache\src\main\util_uri.c
+Group14Size=895
+Group14Files=1
+Group14Name=modules
+Group14Dir=[src]\modules
+Group14Update=0
+Group14TargetOS=-1
+Group14File1=C:\Apache\src\modules\README
+Group15Size=48416
+Group15Files=3
+Group15Name=example
+Group15Dir=[modules]\example
+Group15Update=0
+Group15TargetOS=-1
+Group15File1=C:\Apache\src\modules\example\Makefile.tmpl
+Group15File2=C:\Apache\src\modules\example\mod_example.c
+Group15File3=C:\Apache\src\modules\example\README
+Group16Size=13194
+Group16Files=2
+Group16Name=experimental
+Group16Dir=[modules]\experimental
+Group16Update=0
+Group16TargetOS=-1
+Group16File1=C:\Apache\src\modules\experimental\Makefile.tmpl
+Group16File2=C:\Apache\src\modules\experimental\mod_mmap_static.c
+Group17Size=69
+Group17Files=1
+Group17Name=extra
+Group17Dir=[modules]\extra
+Group17Update=0
+Group17TargetOS=-1
+Group17File1=C:\Apache\src\modules\extra\Makefile.tmpl
+Group18Size=205708
+Group18Files=11
+Group18Name=proxy
+Group18Dir=[modules]\proxy
+Group18Update=0
+Group18TargetOS=-1
+Group18File1=C:\apache\src\modules\proxy\ApacheModuleProxy.dsp
+Group18File2=C:\apache\src\modules\proxy\ApacheModuleProxy.mak
+Group18File3=C:\apache\src\modules\proxy\Makefile.libdir
+Group18File4=C:\apache\src\modules\proxy\Makefile.tmpl
+Group18File5=C:\apache\src\modules\proxy\mod_proxy.c
+Group18File6=C:\apache\src\modules\proxy\mod_proxy.h
+Group18File7=C:\apache\src\modules\proxy\proxy_cache.c
+Group18File8=C:\apache\src\modules\proxy\proxy_connect.c
+Group18File9=C:\apache\src\modules\proxy\proxy_ftp.c
+Group18File10=C:\apache\src\modules\proxy\proxy_http.c
+Group18File11=C:\apache\src\modules\proxy\proxy_util.c
+Group19Size=863524
+Group19Files=36
+Group19Name=standard
+Group19Dir=[modules]\standard
+Group19Update=0
+Group19TargetOS=-1
+Group19File1=C:\apache\src\modules\standard\Makefile.tmpl
+Group19File2=C:\apache\src\modules\standard\mod_access.c
+Group19File3=C:\apache\src\modules\standard\mod_actions.c
+Group19File4=C:\apache\src\modules\standard\mod_alias.c
+Group19File5=C:\apache\src\modules\standard\mod_asis.c
+Group19File6=C:\apache\src\modules\standard\mod_auth.c
+Group19File7=C:\apache\src\modules\standard\mod_auth_anon.c
+Group19File8=C:\apache\src\modules\standard\mod_auth_db.c
+Group19File9=C:\apache\src\modules\standard\mod_auth_db.module
+Group19File10=C:\apache\src\modules\standard\mod_auth_dbm.c
+Group19File11=C:\apache\src\modules\standard\mod_autoindex.c
+Group19File12=C:\apache\src\modules\standard\mod_cern_meta.c
+Group19File13=C:\apache\src\modules\standard\mod_cgi.c
+Group19File14=C:\apache\src\modules\standard\mod_digest.c
+Group19File15=C:\apache\src\modules\standard\mod_dir.c
+Group19File16=C:\apache\src\modules\standard\mod_env.c
+Group19File17=C:\apache\src\modules\standard\mod_expires.c
+Group19File18=C:\apache\src\modules\standard\mod_headers.c
+Group19File19=C:\apache\src\modules\standard\mod_imap.c
+Group19File20=C:\apache\src\modules\standard\mod_include.c
+Group19File21=C:\apache\src\modules\standard\mod_info.c
+Group19File22=C:\apache\src\modules\standard\mod_log_agent.c
+Group19File23=C:\apache\src\modules\standard\mod_log_config.c
+Group19File24=C:\apache\src\modules\standard\mod_log_referer.c
+Group19File25=C:\apache\src\modules\standard\mod_mime.c
+Group19File26=C:\apache\src\modules\standard\mod_mime_magic.c
+Group19File27=C:\apache\src\modules\standard\mod_negotiation.c
+Group19File28=C:\apache\src\modules\standard\mod_rewrite.c
+Group19File29=C:\apache\src\modules\standard\mod_rewrite.h
+Group19File30=C:\apache\src\modules\standard\mod_setenvif.c
+Group19File31=C:\apache\src\modules\standard\mod_so.c
+Group19File32=C:\apache\src\modules\standard\mod_speling.c
+Group19File33=C:\apache\src\modules\standard\mod_status.c
+Group19File34=C:\apache\src\modules\standard\mod_unique_id.c
+Group19File35=C:\apache\src\modules\standard\mod_userdir.c
+Group19File36=C:\apache\src\modules\standard\mod_usertrack.c
+Group20Size=170796
+Group20Files=25
+Group20Name=regex
+Group20Dir=[src]\regex
+Group20Update=0
+Group20TargetOS=-1
+Group20File1=C:\Apache\src\regex\cclass.h
+Group20File2=C:\Apache\src\regex\cname.h
+Group20File3=C:\Apache\src\regex\COPYRIGHT
+Group20File4=C:\Apache\src\regex\debug.c
+Group20File5=C:\Apache\src\regex\engine.c
+Group20File6=C:\Apache\src\regex\engine.ih
+Group20File7=C:\Apache\src\regex\main.c
+Group20File8=C:\Apache\src\regex\Makefile.tmpl
+Group20File9=C:\Apache\src\regex\mkh
+Group20File10=C:\Apache\src\regex\README
+Group20File11=C:\Apache\src\regex\regcomp.c
+Group20File12=C:\Apache\src\regex\regcomp.ih
+Group20File13=C:\Apache\src\regex\regerror.c
+Group20File14=C:\Apache\src\regex\regerror.ih
+Group20File15=C:\Apache\src\regex\regex.3
+Group20File16=C:\Apache\src\regex\regex.7
+Group20File17=C:\Apache\src\regex\regex.dsp
+Group20File18=C:\Apache\src\regex\regex.mak
+Group20File19=C:\Apache\src\regex\regex2.h
+Group20File20=C:\Apache\src\regex\regexec.c
+Group20File21=C:\Apache\src\regex\regfree.c
+Group20File22=C:\Apache\src\regex\split.c
+Group20File23=C:\Apache\src\regex\tests
+Group20File24=C:\Apache\src\regex\utils.h
+Group20File25=C:\Apache\src\regex\WHATSNEW
+Group21Size=210232
+Group21Files=28
+Group21Name=support
+Group21Dir=[src]\support
+Group21Update=0
+Group21TargetOS=-1
+Group21File1=C:\apache\src\support\ab.c
+Group21File2=C:\apache\src\support\apachectl
+Group21File3=C:\apache\src\support\apxs.8
+Group21File4=C:\apache\src\support\apxs.pl
+Group21File5=C:\apache\src\support\dbmmanage
+Group21File6=C:\apache\src\support\dbmmanage.1
+Group21File7=C:\apache\src\support\htdigest.1
+Group21File8=C:\apache\src\support\htdigest.c
+Group21File9=C:\apache\src\support\htpasswd.1
+Group21File10=C:\apache\src\support\htpasswd.c
+Group21File11=C:\apache\src\support\httpd.8
+Group21File12=C:\apache\src\support\log_server_status
+Group21File13=C:\apache\src\support\logresolve.8
+Group21File14=C:\apache\src\support\logresolve.c
+Group21File15=C:\apache\src\support\logresolve.pl
+Group21File16=C:\apache\src\support\Makefile.tmpl
+Group21File17=C:\apache\src\support\phf_abuse_log.cgi
+Group21File18=C:\apache\src\support\rotatelogs.8
+Group21File19=C:\apache\src\support\rotatelogs.c
+Group21File20=C:\apache\src\support\split-logfile
+Group21File21=C:\apache\src\support\suexec.8
+Group21File22=C:\apache\src\support\suexec.c
+Group21File23=C:\apache\src\support\suexec.h
+Group21File24=C:\apache\src\support\httpd.exp
+Group21File25=C:\apache\src\support\htpasswd.dsp
+Group21File26=C:\apache\src\support\htpasswd.mak
+Group21File27=C:\apache\src\support\ab.8
+Group21File28=C:\apache\src\support\apachectl.8
+Group22Size=0
+Group22Files=0
+Group22Name=os
+Group22Dir=[src]\os
+Group22Update=0
+Group22TargetOS=-1
+Group23Size=210812
+Group23Files=46
+Group23Name=win32
+Group23Dir=[os]\win32
+Group23Update=0
+Group23TargetOS=-1
+Group23File1=C:\apache\src\os\win32\ApacheModuleAuthAnon.dsp
+Group23File2=C:\apache\src\os\win32\ApacheModuleAuthAnon.mak
+Group23File3=C:\apache\src\os\win32\ApacheModuleCERNMeta.dsp
+Group23File4=C:\apache\src\os\win32\ApacheModuleCERNMeta.mak
+Group23File5=C:\apache\src\os\win32\ApacheModuleDigest.dsp
+Group23File6=C:\apache\src\os\win32\ApacheModuleDigest.mak
+Group23File7=C:\apache\src\os\win32\ApacheModuleExpires.dsp
+Group23File8=C:\apache\src\os\win32\ApacheModuleExpires.mak
+Group23File9=C:\apache\src\os\win32\ApacheModuleHeaders.dsp
+Group23File10=C:\apache\src\os\win32\ApacheModuleHeaders.mak
+Group23File11=C:\apache\src\os\win32\ApacheModuleInfo.dsp
+Group23File12=C:\apache\src\os\win32\ApacheModuleInfo.mak
+Group23File13=C:\apache\src\os\win32\ApacheModuleRewrite.dsp
+Group23File14=C:\apache\src\os\win32\ApacheModuleRewrite.mak
+Group23File15=C:\apache\src\os\win32\ApacheModuleSpeling.dsp
+Group23File16=C:\apache\src\os\win32\ApacheModuleSpeling.mak
+Group23File17=C:\apache\src\os\win32\ApacheModuleStatus.dsp
+Group23File18=C:\apache\src\os\win32\ApacheModuleStatus.mak
+Group23File19=C:\apache\src\os\win32\ApacheModuleUserTrack.dsp
+Group23File20=C:\apache\src\os\win32\ApacheModuleUserTrack.mak
+Group23File21=C:\apache\src\os\win32\ApacheOS.dsp
+Group23File22=C:\apache\src\os\win32\ApacheOS.mak
+Group23File23=C:\apache\src\os\win32\getopt.c
+Group23File24=C:\apache\src\os\win32\getopt.h
+Group23File25=C:\apache\src\os\win32\main_win32.c
+Group23File26=C:\apache\src\os\win32\MakeModuleMak.cpp
+Group23File27=C:\apache\src\os\win32\MakeModuleMak.mak
+Group23File28=C:\apache\src\os\win32\mod_dll.c
+Group23File29=C:\apache\src\os\win32\mod_isapi.c
+Group23File30=C:\apache\src\os\win32\Module.mak.tmpl
+Group23File31=C:\apache\src\os\win32\modules.c
+Group23File32=C:\apache\src\os\win32\multithread.c
+Group23File33=C:\apache\src\os\win32\os.c
+Group23File34=C:\apache\src\os\win32\os.h
+Group23File35=C:\apache\src\os\win32\passwd.c
+Group23File36=C:\apache\src\os\win32\passwd.h
+Group23File37=C:\apache\src\os\win32\readdir.c
+Group23File38=C:\apache\src\os\win32\readdir.h
+Group23File39=C:\apache\src\os\win32\registry.c
+Group23File40=C:\apache\src\os\win32\registry.h
+Group23File41=C:\apache\src\os\win32\service.c
+Group23File42=C:\apache\src\os\win32\service.h
+Group23File43=C:\apache\src\os\win32\util_win32.c
+Group23File44=C:\apache\src\os\win32\apache.ico
+Group23File45=C:\apache\src\os\win32\apache.rc
+Group23File46=C:\apache\src\os\win32\resource.h
+Group24Size=84480
+Group24Files=1
+Group24Name=Installer DLL
+Group24Dir=<INSTALLDIR>
+Group24Update=0
+Group24TargetOS=-1
+Group24File1=C:\Apache\install.dll
+Group25Size=254005
+Group25Files=1
+Group25Name=Shared DLLs
+Group25Dir=<WINSYSDIR>
+Group25Update=0
+Group25TargetOS=-1
+Group25File1=C:\Apache\MSVCRT.DLL
+Group26Size=0
+Group26Files=0
+Group26Name=logs
+Group26Dir=<INSTALLDIR>\logs
+Group26Update=0
+Group26TargetOS=-1
+Group27Size=37127
+Group27Files=76
+Group27Name=icons
+Group27Dir=<INSTALLDIR>\icons
+Group27Update=1
+Group27TargetOS=-1
+Group27File1=C:\apache\icons\a.gif
+Group27File2=C:\apache\icons\alert.black.gif
+Group27File3=C:\apache\icons\alert.red.gif
+Group27File4=C:\apache\icons\apache_pb.gif
+Group27File5=C:\apache\icons\back.gif
+Group27File6=C:\apache\icons\ball.gray.gif
+Group27File7=C:\apache\icons\ball.red.gif
+Group27File8=C:\apache\icons\binary.gif
+Group27File9=C:\apache\icons\binhex.gif
+Group27File10=C:\apache\icons\blank.gif
+Group27File11=C:\apache\icons\bomb.gif
+Group27File12=C:\apache\icons\box1.gif
+Group27File13=C:\apache\icons\box2.gif
+Group27File14=C:\apache\icons\broken.gif
+Group27File15=C:\apache\icons\burst.gif
+Group27File16=C:\apache\icons\c.gif
+Group27File17=C:\apache\icons\comp.blue.gif
+Group27File18=C:\apache\icons\comp.gray.gif
+Group27File19=C:\apache\icons\compressed.gif
+Group27File20=C:\apache\icons\continued.gif
+Group27File21=C:\apache\icons\dir.gif
+Group27File22=C:\apache\icons\down.gif
+Group27File23=C:\apache\icons\dvi.gif
+Group27File24=C:\apache\icons\f.gif
+Group27File25=C:\apache\icons\folder.gif
+Group27File26=C:\apache\icons\folder.open.gif
+Group27File27=C:\apache\icons\folder.sec.gif
+Group27File28=C:\apache\icons\forward.gif
+Group27File29=C:\apache\icons\generic.gif
+Group27File30=C:\apache\icons\generic.red.gif
+Group27File31=C:\apache\icons\generic.sec.gif
+Group27File32=C:\apache\icons\hand.right.gif
+Group27File33=C:\apache\icons\hand.up.gif
+Group27File34=C:\apache\icons\icon.sheet.gif
+Group27File35=C:\apache\icons\image1.gif
+Group27File36=C:\apache\icons\image2.gif
+Group27File37=C:\apache\icons\image3.gif
+Group27File38=C:\apache\icons\index.gif
+Group27File39=C:\apache\icons\layout.gif
+Group27File40=C:\apache\icons\left.gif
+Group27File41=C:\apache\icons\link.gif
+Group27File42=C:\apache\icons\movie.gif
+Group27File43=C:\apache\icons\p.gif
+Group27File44=C:\apache\icons\patch.gif
+Group27File45=C:\apache\icons\pdf.gif
+Group27File46=C:\apache\icons\pie0.gif
+Group27File47=C:\apache\icons\pie1.gif
+Group27File48=C:\apache\icons\pie2.gif
+Group27File49=C:\apache\icons\pie3.gif
+Group27File50=C:\apache\icons\pie4.gif
+Group27File51=C:\apache\icons\pie5.gif
+Group27File52=C:\apache\icons\pie6.gif
+Group27File53=C:\apache\icons\pie7.gif
+Group27File54=C:\apache\icons\pie8.gif
+Group27File55=C:\apache\icons\portal.gif
+Group27File56=C:\apache\icons\ps.gif
+Group27File57=C:\apache\icons\quill.gif
+Group27File58=C:\apache\icons\README
+Group27File59=C:\apache\icons\right.gif
+Group27File60=C:\apache\icons\screw1.gif
+Group27File61=C:\apache\icons\screw2.gif
+Group27File62=C:\apache\icons\script.gif
+Group27File63=C:\apache\icons\sound1.gif
+Group27File64=C:\apache\icons\sound2.gif
+Group27File65=C:\apache\icons\sphere1.gif
+Group27File66=C:\apache\icons\sphere2.gif
+Group27File67=C:\apache\icons\tar.gif
+Group27File68=C:\apache\icons\tex.gif
+Group27File69=C:\apache\icons\text.gif
+Group27File70=C:\apache\icons\transfer.gif
+Group27File71=C:\apache\icons\unknown.gif
+Group27File72=C:\apache\icons\up.gif
+Group27File73=C:\apache\icons\uu.gif
+Group27File74=C:\apache\icons\uuencoded.gif
+Group27File75=C:\apache\icons\world1.gif
+Group27File76=C:\apache\icons\world2.gif
+Group28Size=0
+Group28Files=0
+Group28Name=conf
+Group28Dir=<INSTALLDIR>\conf
+Group28Update=0
+Group28TargetOS=-1
+Group29Size=2326
+Group29Files=1
+Group29Name=htdocs
+Group29Dir=<INSTALLDIR>\htdocs
+Group29Update=0
+Group29TargetOS=-1
+Group29File1=C:\apache\htdocs\apache_pb.gif
+Group30Size=0
+Group30Files=0
+Group30Name=cgi-bin
+Group30Dir=<INSTALLDIR>\cgi-bin
+Group30Update=0
+Group30TargetOS=-1
+Group31Size=37002
+Group31Files=2
+Group31Name=installer
+Group31Dir=[win32]\installer
+Group31Update=0
+Group31TargetOS=-1
+Group31File1=C:\apache\src\os\win32\installer\apache.iwz
+Group31File2=C:\apache\src\os\win32\installer\README.TXT
+Group32Size=30356
+Group32Files=4
+Group32Name=installdll
+Group32Dir=[installer]\installdll
+Group32Update=0
+Group32TargetOS=-1
+Group32File1=C:\apache\src\os\win32\installer\installdll\install.c
+Group32File2=C:\apache\src\os\win32\installer\installdll\install.def
+Group32File3=C:\apache\src\os\win32\installer\installdll\install.dsp
+Group32File4=C:\apache\src\os\win32\installer\installdll\install.mak
+Group33Size=8247
+Group33Files=33
+Group33Name=small
+Group33Dir=[icons]\small
+Group33Update=0
+Group33TargetOS=-1
+Group33File1=C:\apache\icons\small\back.gif
+Group33File2=C:\apache\icons\small\binary.gif
+Group33File3=C:\apache\icons\small\binhex.gif
+Group33File4=C:\apache\icons\small\blank.gif
+Group33File5=C:\apache\icons\small\broken.gif
+Group33File6=C:\apache\icons\small\burst.gif
+Group33File7=C:\apache\icons\small\comp1.gif
+Group33File8=C:\apache\icons\small\comp2.gif
+Group33File9=C:\apache\icons\small\compressed.gif
+Group33File10=C:\apache\icons\small\continued.gif
+Group33File11=C:\apache\icons\small\dir.gif
+Group33File12=C:\apache\icons\small\dir2.gif
+Group33File13=C:\apache\icons\small\forward.gif
+Group33File14=C:\apache\icons\small\generic.gif
+Group33File15=C:\apache\icons\small\generic2.gif
+Group33File16=C:\apache\icons\small\generic3.gif
+Group33File17=C:\apache\icons\small\image.gif
+Group33File18=C:\apache\icons\small\image2.gif
+Group33File19=C:\apache\icons\small\index.gif
+Group33File20=C:\apache\icons\small\movie.gif
+Group33File21=C:\apache\icons\small\rainbow.gif
+Group33File22=C:\apache\icons\small\README.txt
+Group33File23=C:\apache\icons\small\sound.gif
+Group33File24=C:\apache\icons\small\sound2.gif
+Group33File25=C:\apache\icons\small\tar.gif
+Group33File26=C:\apache\icons\small\text.gif
+Group33File27=C:\apache\icons\small\transfer.gif
+Group33File28=C:\apache\icons\small\unknown.gif
+Group33File29=C:\apache\icons\small\uu.gif
+Group33File30=C:\apache\icons\small\key.gif
+Group33File31=C:\apache\icons\small\patch.gif
+Group33File32=C:\apache\icons\small\ps.gif
+Group33File33=C:\apache\icons\small\doc.gif
+Group34Size=21478
+Group34Files=8
+Group34Name=test
+Group34Dir=[installdll]\test
+Group34Update=0
+Group34TargetOS=-1
+Group34File1=C:\apache\src\os\win32\installer\installdll\test\resource.h
+Group34File2=C:\apache\src\os\win32\installer\installdll\test\test.c
+Group34File3=C:\apache\src\os\win32\installer\installdll\test\test.def
+Group34File4=C:\apache\src\os\win32\installer\installdll\test\test.dsp
+Group34File5=C:\apache\src\os\win32\installer\installdll\test\test.h
+Group34File6=C:\apache\src\os\win32\installer\installdll\test\test.ico
+Group34File7=C:\apache\src\os\win32\installer\installdll\test\test.mak
+Group34File8=C:\apache\src\os\win32\installer\installdll\test\test.rc
+Group35Size=58368
+Group35Files=1
+Group35Name=bin
+Group35Dir=<INSTALLDIR>\bin
+Group35Update=0
+Group35TargetOS=-1
+Group35File1=C:\apache\bin\htpasswd.exe
+Group36Size=7223
+Group36Files=1
+Group36Name=search
+Group36Dir=[manual]\search
+Group36Update=0
+Group36TargetOS=-1
+Group36File1=C:\apache\htdocs\manual\search\manual-index.cgi
+
+[Sequence]
+DestinationLocationDir=<ProgramFilesDir>\Apache Group\Apache
+SelectProgramFolderName=Apache Web Server
+LicenseAgreement=1
+LicenseAgreementFile=C:\Apache\LICENSE
+ReadMeFileBrowser=1
+ReadMeFileBrowserFile=C:\apache\WARNING-NT.TXT
+DestinationLocation=1
+SetupType=1
+CustomSetup=1
+SelectProgramFolder=1
+ProgressBar=1
+SetupComplete=1
+SetupCompleteExec=
+SetupCompleteExecParam=
+SetupCompleteExecReadme=[Program Executables]\README-NT.TXT
+
+[RegEntries]
+Reg1Path=HKEY_CLASSES_ROOT
+Reg1Val1Type=0
+Reg1Val1Name=(Default)
+Reg1Val1Data=(value not set)
+Reg1Vals=1
+Reg2Path=HKEY_CURRENT_USER
+Reg2Val1Type=0
+Reg2Val1Name=(Default)
+Reg2Val1Data=(value not set)
+Reg2Vals=1
+Reg3Path=HKEY_LOCAL_MACHINE
+Reg3Val1Type=0
+Reg3Val1Name=(Default)
+Reg3Val1Data=(value not set)
+Reg3Vals=1
+Reg4Path=HKEY_USERS
+Reg4Val1Type=0
+Reg4Val1Name=(Default)
+Reg4Val1Data=(value not set)
+Reg4Vals=1
+Reg5Path=HKEY_CURRENT_CONFIG
+Reg5Val1Type=0
+Reg5Val1Name=(Default)
+Reg5Val1Data=(value not set)
+Reg5Vals=1
+Reg6Path=HKEY_DYN_DATA
+Reg6Val1Type=0
+Reg6Val1Name=(Default)
+Reg6Val1Data=(value not set)
+Reg6Vals=1
+Reg7Path=HKEY_LOCAL_MACHINE\SOFTWARE
+Reg7Val1Type=0
+Reg7Val1Name=(Default)
+Reg7Val1Data=(value not set)
+Reg7Vals=1
+Reg8Path=HKEY_LOCAL_MACHINE\SOFTWARE\Apache Group
+Reg8Val1Type=0
+Reg8Val1Name=(Default)
+Reg8Val1Data=(value not set)
+Reg8Vals=1
+Reg9Path=HKEY_LOCAL_MACHINE\SOFTWARE\Apache Group\Apache
+Reg9Val1Type=0
+Reg9Val1Name=(Default)
+Reg9Val1Data=(value not set)
+Reg9Vals=1
+Reg10Path=HKEY_LOCAL_MACHINE\SOFTWARE\Apache Group\Apache\1.3.7 dev
+Reg10Val1Type=0
+Reg10Val1Name=(Default)
+Reg10Val1Data=(value not set)
+Reg10Val2Type=0
+Reg10Val2Name=ServerRoot
+Reg10Val2Data=<INSTALLDIR>
+Reg10Vals=2
+Regs=10
+
+[Registry]
+Reg1Path=HKEY_LOCAL_MACHINE\SOFTWARE
+Reg2Path=HKEY_LOCAL_MACHINE\SOFTWARE\Apache Group
+Reg3Path=HKEY_LOCAL_MACHINE\SOFTWARE\Apache Group\Apache
+Reg4Path=HKEY_LOCAL_MACHINE\SOFTWARE\Apache Group\Apache\1.3.7 dev
+Reg5Path=HKEY_LOCAL_MACHINE\SOFTWARE\Apache Group\Apache\1.3.7 dev
+Reg5ValName=ServerRoot
+Reg5ValType=0
+Reg5ValData=<INSTALLDIR>
+Regs=5
+
+[Icons]
+Icons=5
+Icon1Param=-d "<INSTALLDIR>" -s
+Icon1Cmd=[Program Executables]\Apache.exe
+Icon1Description=Start Apache as console app
+Icon1WorkingDir=[Program Executables]
+Icon1IconFile=[Program Executables]\Apache.exe
+Icon1RealFile=C:\Apache\Apache.exe
+Icon1WhichIcon=0
+Icon1KeyVirtual=0
+Icon1KeyFlags=0
+Icon1StartMenu=0
+Icon1Window=0
+Icon2Param=
+Icon2Cmd=[Manual]\index.html
+Icon2Description=Apache Documentation
+Icon2WorkingDir=[Manual]
+Icon2IconFile=
+Icon2RealFile=C:\Apache\htdocs\manual\index.html
+Icon2WhichIcon=0
+Icon2KeyVirtual=0
+Icon2KeyFlags=0
+Icon2StartMenu=0
+Icon2Window=0
+Icon3Param=-d "<INSTALLDIR>" -i
+Icon3Cmd=[Program Executables]\Apache.exe
+Icon3Description=Install Apache as Service (NT only)
+Icon3WorkingDir=[Program Executables]
+Icon3IconFile=
+Icon3RealFile=C:\Apache\Apache.exe
+Icon3WhichIcon=0
+Icon3KeyVirtual=0
+Icon3KeyFlags=0
+Icon3StartMenu=0
+Icon3Window=0
+Icon4Param=-d "<INSTALLDIR>" -u
+Icon4Cmd=[Program Executables]\Apache.exe
+Icon4Description=Uninstall Apache Service (NT only)
+Icon4WorkingDir=[Program Executables]
+Icon4IconFile=
+Icon4RealFile=C:\Apache\Apache.exe
+Icon4WhichIcon=0
+Icon4KeyVirtual=0
+Icon4KeyFlags=0
+Icon4StartMenu=0
+Icon4Window=0
+Icon5Param=-d "<INSTALLDIR>" -k shutdown
+Icon5Cmd=[Program Executables]\Apache.exe
+Icon5Description=Shutdown Apache console app
+Icon5WorkingDir=[Program Executables]
+Icon5IconFile=
+Icon5RealFile=C:\Apache\Apache.exe
+Icon5WhichIcon=0
+Icon5KeyVirtual=0
+Icon5KeyFlags=0
+Icon5StartMenu=0
+Icon5Window=0
+
+[VisualBasic]
+PRJFile=
+
+[Ext]
+Ext1Dlg=Setup Complete
+Ext1Param1=[Installer DLL]\install.dll
+Ext1Param2=BeforeExit
+Ext1Op=DLL
+
+[Temp Files]
+File1=C:\Apache\install.dll
+
+[Autoexec]
+PathDir=
+ShareLocks=
+ShareFiles=
+Command=
+
+[CopyToFloppy]
+DriveOption=Path for a 1 File Installation.
+DestinationPath=
+DestinationPathOneFile=C:\
+Password=
diff -Nur apache_1.3.26/src/os/win32/installer/installdll/install.c apache_1.3.26-ipv6/src/os/win32/installer/installdll/install.c
--- apache_1.3.26/src/os/win32/installer/installdll/install.c	Thu Jan  1 09:00:00 1970
+++ apache_1.3.26-ipv6/src/os/win32/installer/installdll/install.c	Wed Jun 19 08:05:35 2002
@@ -0,0 +1,666 @@
+/* Apache Installer */
+
+/*
+ * 26/06/97 PCS 1.000 Initial version
+ * 22/02/98 PCS 1.001 Used the excellent NTemacs to apply proper formating
+ * 04/05/98 PCS 1.002 Copy conf files to *.conf.default, then to *.conf
+ * 16/02/99 PCS 1.003 Add logging to "install.log" in the installed directory
+ */
+
+#define VERSION ( "1.003 " __DATE__ " " __TIME__ )
+
+#include <winsock2.h>
+#include <string.h>
+#include <stdio.h>
+#include <direct.h>
+#include <time.h>
+
+#include "conf.h"
+#include "ap.h"
+
+#ifdef strftime
+#undef strftime
+#endif
+
+#define AP_WIN32ERROR 1
+
+/* Global to store the instance handle */
+HINSTANCE hInstance = NULL;
+
+static char *szLogFilename = NULL;
+static FILE *fpLog = NULL;
+
+void LogMessage(char *fmt, ...)
+{
+    char buf[4000];
+    va_list ap;
+    struct tm *tms;
+    time_t nowtime;
+    char *bp = buf;
+    int rv;
+    int free = sizeof(buf);
+
+    if (!fpLog) {
+	return;
+    }
+
+    nowtime = time(NULL);
+    tms = localtime(&nowtime);
+    rv = strftime(bp, free, "%c", tms);
+    bp += rv;
+    free -= rv;
+    if (free) {
+        *bp++ = ' ';
+	free--;
+    }
+
+    va_start(ap, fmt);
+    rv = ap_vsnprintf(bp, free, fmt, ap);
+    va_end(ap);
+
+    free -= rv;
+
+    fprintf(fpLog, "%s\n", buf);
+}
+
+/*
+ * MessageBox_error() is a helper function to display an error in a 
+ * message box, optionally including a Win32 error message. If
+ * the "opt" argument is value AP_WIN32ERROR then get the last Win32
+ * error (with GetLastError()) and add it on to the end of
+ * the output string. The output string is given as a printf-format
+ * and replacement arguments. The hWnd, title and mb_opt fields are 
+ * passed on to the Win32 MessageBox() call.
+ */
+
+int MessageBox_error(HWND hWnd, int opt, char *title, 
+		     int mb_opt, char *fmt, ...)
+{
+    char buf[1000];
+    va_list ap;
+    int free = sizeof(buf);       /* Number of bytes free in the buffer */
+    int rv;
+    char *p;
+
+    va_start(ap, fmt);
+    rv = ap_vsnprintf(buf, sizeof(buf), fmt, ap);
+    va_end(ap);
+
+    free -= rv;
+
+    if (opt & AP_WIN32ERROR && free > 3) {
+      /* We checked in the "if" that we have enough space in buf for
+       * at least three extra characters.
+       */
+      p = buf + strlen(buf);
+      *p++ = '\r';
+      *p++ = '\r';
+      *p++ = '(';
+      free -= 3;
+      /* NB: buf is now not null terminated */
+
+      /* Now put the error message straight into buf. This function
+       * takes the free buffer size as the 6th argument.
+       */
+      rv = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
+                         NULL,
+                         GetLastError(),
+                         0,
+                         p,
+                         free,
+                         NULL);
+
+      if (rv == 0) {
+          /* FormatMessage failed, so get rid of the "\r\r(" we just placed
+           * in the buffer, since there is no system error message.
+           */
+          p -= 3;
+          *p = '\0';
+          free += 3;
+      } else {
+          free -= rv;
+          p += rv;
+
+          /* Strip any trailing \r or \n characters to make it look nice on
+           * the screen.
+           */
+          while (*(p-1) == '\r' || *(p-1) == '\n')
+              p--, free++;
+          *p = '\0';
+
+          /* Append a trailing ) */
+          if (free >= 1) {
+              *p++ = ')';
+              *p++ = '\0';
+          }
+      }
+    }
+
+    for (p = buf; *p; p++) {
+	if (*p == '\n' || *p == '\r') {
+	    *p = ' ';
+	}
+    }
+    LogMessage("MSG %s", buf);
+
+    return MessageBox(hWnd, buf, title, mb_opt);
+}
+
+int OpenLog(HWND hwnd, char *dir, char *fn)
+{
+    szLogFilename = malloc(strlen(dir) + 1 + strlen(fn) + 1);
+    sprintf(szLogFilename, "%s\\%s", dir, fn);
+
+    if ((fpLog = fopen(szLogFilename, "a+")) == NULL) {
+	MessageBox_error(hwnd, 
+			 AP_WIN32ERROR,
+			 "Installation Problem",
+			 MB_OK | MB_ICONSTOP,
+			 "Cannot open log file %s", szLogFilename);
+	return -1;
+    }
+    return 0;
+}
+
+void CloseLog(void)
+{
+    if (fpLog) {
+	fclose(fpLog);
+    }
+}
+
+/*
+ * The next few functions handle expanding the @@ServerRoot@@ type
+ * sequences found in the distribution files. The main entry point
+ * is expandFile(), which is given a file to expand and the filename
+ * to write the expanded file it. It reads a line at a time, and
+ * if the line includes an "@@" sequence, calls expandLine() to
+ * expand the sequences.
+ *
+ * expandLine() looks for @@ sequences in the line, and when it finds
+ * one, looks for a corresponding entry in the replaceTable[]. If it
+ * finds one it writes the replacement value from the table into
+ * an output string.
+ *
+ * The helper function appendText() is used when expanding strings. It
+ * is called to copy text into an output buffer. If the output buffer
+ * is not big enough, it is expanded. This function also ensures that
+ * the output buffer is null terminated after each append operation.
+ *
+ * A table is used of values to replace, rather than just hardcoding
+ * the functionality, so we could replace additional values in the
+ * future.  We also take care to ensure that the expanded line can be
+ * arbitrary length (though at the moment the lines read from the
+ * configuration files can only be up to 2000 characters).
+ */
+
+/*
+ * Table of items to replace. The "value" elements are filled in at runtime
+ * by FillInReplaceTable(). Note that the "tmpl" element is case
+ * sensitive.
+ */
+
+typedef struct {
+    char *tmpl;
+    char *value;
+} REPLACEITEM;
+typedef REPLACEITEM *REPLACETABLE;
+
+REPLACEITEM replaceHttpd[] = {
+    { "@@ServerRoot@@", NULL },	/* ServerRoot directory (i.e. install dir) */
+    { NULL, NULL }
+};
+
+/*
+ * A relatively intelligent version of strcat, that expands the destination
+ * buffer if needed.
+ *
+ * On entry, ppBuf points to the output buffer, pnPos points to the offset
+ * of the current position within that buffer, and pnSize points to the
+ * current size of *ppBuf. pSrc points to the string to copy into the buffer,
+ * and nToCopy gives the number of characters to copy from pSrc.
+ *
+ * On exit, *ppBuf, *pnPos and *pnSize may have been updated if the output
+ * buffer needed to be expanded. The output buffer will be null terminated.
+ * Returns 0 on success, -1 on error. Does not report errors to the user.
+ */
+
+int appendText(char **ppBuf, int *pnPos, int *pnSize, char *pSrc, int nToCopy)
+{
+    char *pBuf = *ppBuf;	/* output buffer */
+    int nPos = *pnPos;		/* current offset into pBuf */
+    int nSize = *pnSize;	/* current size of pBuf */
+
+    while (nPos + nToCopy >= nSize) {
+	/* Not enough space, double size of output buffer. Note we use
+	 * >= not > so that we have enough space for the NULL character
+	 * in the output buffer */
+	char *pBufNew;
+
+	pBufNew = realloc(pBuf, nSize * 2);
+	if (!pBufNew)
+	    return -1;
+	nSize *= 2;
+
+	/* Update the max size and buffer pointer */
+	*pnSize = nSize;
+	*ppBuf = pBuf = pBufNew;
+    }
+
+    /* Ok, now we have enough space, copy the stuff */
+
+    strncpy(pBuf+nPos, pSrc, nToCopy);
+    nPos += nToCopy;
+    *pnPos = nPos;		/* update current position */
+    pBuf[nPos] = '\0';		/* append trailing NULL */
+
+    return 0;
+}
+
+/*
+ * Expand all the sequences in an input line. Returns a pointer to the
+ * expanded line. The caller should free the returned data.
+ * The replaceTable argument is a table of sequences to expand.
+ *
+ * Returns NULL on error. Does not report errors to the user.
+ */
+
+char *expandLine(char *in, REPLACETABLE replaceTable)
+{
+    REPLACEITEM *item;
+    char *pos;			/* current position in input buffer */
+    char *outbuf;		/* output buffer */
+    int outbuf_size;		/* current size of output buffer */
+    int outbuf_position;	/* current position in output buffer */
+    char *start;		/* position to copy from in input buffer */
+
+    /* Create an initial output buffer. Guess that twice the input size
+     * is a good length, after expansion. Don't worry if we need more
+     * though, appendText() will expand as needed.
+     */
+    outbuf_size = strlen(in) * 2;
+    outbuf_position = 0;
+    outbuf = malloc(outbuf_size);
+    if (!outbuf)
+      return NULL;
+
+    start = in;			/* mark the start of uncopied data */
+    pos = in;			/* current position in input buffer */
+
+    while (1) {
+
+	/* Look for '@@' sequence, or end of input */
+	if (*pos && !(*pos == '@' && *(pos+1) == '@')) {
+	    pos++;
+	    continue;
+	}
+
+	if (!*pos) {
+	    /* End of input string, copy the uncopied data */
+	    if (appendText(&outbuf, &outbuf_position, &outbuf_size, 
+			   start, pos-start) < 0) {
+		return NULL;
+	    }
+	    break;
+	}
+
+	/* Found first @ of a possible token to replace. Look for end
+	 * of the token
+	 */
+	for (item = replaceTable; item->tmpl; ++item) {
+	    if (!strncmp(pos, item->tmpl, strlen(item->tmpl)))
+		break;
+	}
+
+	if (item->tmpl) {
+	    /* Found match. First copy the uncopied data from the input
+	     * buffer (start through to pos-1), then copy the expanded
+	     * value. */
+	    if (appendText(&outbuf, &outbuf_position, &outbuf_size,
+			   start, pos-start) < 0) {
+		return NULL;
+	    }
+	    if (appendText(&outbuf, &outbuf_position, &outbuf_size,
+			   item->value, strlen(item->value)) < 0) {
+		return NULL;
+	    }
+
+	    /* Update current position to skip over the input buffer
+	     * @@...@@ sequence, and update the "start" pointer to uncopied
+	     * data
+	     */
+	    pos += strlen(item->tmpl);
+	    start = pos;
+	} 
+	else {
+	    /* The sequence did not exist in the replace table, so copy
+	     * it as-is to the output.
+	     */
+	    pos++; 
+	}
+    }
+
+    return outbuf;
+}
+
+/*
+ * Some options to determine how we copy a file. Apart from OPT_NONE, these should
+ * be OR'able
+ */
+
+typedef enum { 
+    OPT_NONE = 0, 
+    OPT_OVERWRITE = 1,	    /* Always overwrite destination file */
+    OPT_EXPAND = 2,	    /* Expand any @@...@@ tokens in replaceHttpd */
+    OPT_DELETESOURCE = 4,   /* Delete the source file after the copy */
+    OPT_SILENT = 8,	    /* Don't tell use about failures */
+} options_t;
+
+/* 
+ * Copy a file, expanding sequences from the replaceTable argument.
+ * Returns 0 on success, -1 on error. Reports errors to user.
+ */
+#define MAX_INPUT_LINE 2000
+int WINAPI ExpandConfFile(HWND hwnd, LPSTR szInst, LPSTR szinFile, LPSTR szoutFile, REPLACETABLE replaceTable, options_t options)
+{
+    char inFile[_MAX_PATH];
+    char outFile[_MAX_PATH];
+    char inbuf[MAX_INPUT_LINE];
+    FILE *infp;
+    FILE *outfp;
+
+    ap_snprintf(inFile, sizeof(inFile), "%s\\%s", szInst, szinFile);
+    ap_snprintf(outFile, sizeof(outFile), "%s\\%s", szInst, szoutFile);
+
+    if (!(infp = fopen(inFile, "r"))) {
+	MessageBox_error(hwnd, 
+			 AP_WIN32ERROR,
+			 "Installation Problem",
+			 MB_OK | MB_ICONSTOP,
+			 "Cannot read file %s", inFile);
+	return -1;
+    }
+    if (! (options & OPT_OVERWRITE)) {
+	/* Overwrite not allowed if file does not exist */
+	if ((outfp = fopen(outFile, "r"))) {
+	    if (! (options & OPT_SILENT)) {
+		MessageBox_error(hwnd,
+				 0,
+				 "File not overwritten",
+				 MB_OK | MB_ICONWARNING,
+				 "Preserving existing file %s.\r\r"
+				 "The new version of this file has been left in %s", 
+				 outFile, inFile);
+	    }
+	    fclose(outfp);
+	    fclose(infp);
+	    return 0;
+	}
+	/* To get here, output file does not exist */
+    }
+    if (!(outfp = fopen(outFile, "w"))) {
+	MessageBox_error(hwnd, 
+			 AP_WIN32ERROR,
+			 "Installation Problem",
+			 MB_OK | MB_ICONSTOP,
+			 "Cannot write to file %s", outFile);
+	fclose(infp);
+	return -1;
+    }
+
+    while (fgets(inbuf, MAX_INPUT_LINE, infp)) {
+	char *pos;
+	char *outbuf;
+
+	/* Quickly look to see if this line contains any
+	 * @@ tokens. If it doesn't, we don't need to bother
+	 * called expandLine() or taking a copy of the input
+	 * buffer.
+	 */
+	if (options & OPT_EXPAND) {
+    	    for (pos = inbuf; *pos; ++pos)
+		if (*pos == '@' && *(pos+1) == '@')
+		    break;
+	}
+
+	if (options & OPT_EXPAND && *pos) {
+	    /* The input line contains at least one '@@' sequence, so
+	     * call expandLine() to expand any sequences we know about.
+	     */
+	    outbuf = expandLine(inbuf, replaceTable);
+	    if (outbuf == NULL) {
+		fclose(infp);
+		fclose(outfp);
+		MessageBox_error(hwnd,
+				 0,
+				 "Installation Problem",
+				 MB_OK|MB_ICONSTOP,
+				 "An error occurred during installation");
+		return -1;
+	    }
+	}
+	else {
+	    outbuf = NULL;
+	}
+
+	/* If outbuf is NULL, we did not need to expand sequences, so
+	 * just output the contents of the input buffer.
+	 */
+	fwrite(outbuf ? outbuf : inbuf, 1, 
+	       strlen(outbuf ? outbuf : inbuf), outfp);
+
+	if (outbuf)
+	    free(outbuf);
+    }
+    fclose(infp);
+    fclose(outfp);
+
+    LogMessage("COPY: expanded %s to %s", inFile, outFile);
+
+    if (options & OPT_DELETESOURCE) {
+	unlink(inFile);
+        LogMessage("COPY: deleted file %s", inFile);
+    }
+
+    return 0;
+}
+
+int FillInReplaceTable(HWND hwnd, REPLACETABLE table, char *szInst)
+{
+    REPLACEITEM *item;
+    for (item = table; item->tmpl; ++item) {
+	if (!strcmp(item->tmpl, "@@ServerRoot@@")) {
+	    char *p;
+
+#if NEED_SHORT_PATHS
+	    int len;
+	    len = GetShortPathName(szInst, NULL, 0);
+	    if (len > 0) {
+		item->value = (char*)malloc(len+1);
+		GetShortPathName(szInst, item->value, len);
+	    }
+#else
+	    if ((item->value = strdup(szInst)) == NULL)
+	        return -1;
+#endif
+	    for (p = item->value; *p; p++)
+	        if (*p == '\\') *p = '/';
+
+	    LogMessage("FillInReplaceTable tmpl=%s value=%s", item->tmpl, item->value);
+
+	    continue;
+	}
+#if NEED_FQDN
+	if (!strcmp(item->tmpl, "FQDN")) {
+	    item->value = GetHostName(hwnd);
+	    continue;
+	}
+#endif
+    }
+    return 0;
+}
+
+/*
+ * actionTable[] contains things we do when this DLL is called by InstallShield
+ * during the install. It is like a simple script, without us having to
+ * worry about parsing, error checking, etc.
+ *
+ * Each item in the table is of type ACTIONITEM. The first element is the action 
+ * to perform (e.g. CMD_COPY). The second and third elements are filenames
+ * (e.g. for CMD_COPY, the first filename is the source and the second filename
+ * is the destination). The final element of ACTIONITEM is a set of options
+ * which apply to the current "command". For example, OPT_EXPAND on a CMD_COPY
+ * line, tells the copy function to expand @@ServerRoot@@ tokens found in the
+ * source file.
+ *
+ * The contents of this table are performed in order, top to bottom. This lets
+ * us expand the files to the *.conf.default names, then copy to *.conf only
+ * if the corresponding *.conf file does not already exist. If it does exist,
+ * it is not overwritten.
+ *
+ * Return 1 on success, 0 on error.
+ */
+
+typedef enum {
+    CMD_COPY = 0,
+    CMD_RMDIR,
+    CMD_RM,
+    CMD_END
+} cmd_t;
+
+typedef struct {
+    cmd_t command;
+    char *in;
+    char *out;
+    options_t options;
+} ACTIONITEM;
+typedef ACTIONITEM *ACTIONTABLE;
+
+ACTIONITEM actionTable[] = {
+    /*
+     * Installation of the configuraton files. These are installed into the ".tmp"
+     * directory by the installer. We first move them to conf\*.default (overwriting
+     * any *.default file from a previous install). The *.conf-dist-win files
+     * are also expanded for any @@...@@ tokens. Then we copy the conf\*.default
+     * file to corresponding conf\* file, unless that would overwrite an existing file.
+     */
+    { CMD_COPY, ".tmp\\mime.types", "conf\\mime.types.default",
+	OPT_OVERWRITE|OPT_DELETESOURCE },
+    { CMD_COPY, ".tmp\\magic", "conf\\magic.default",
+	OPT_OVERWRITE|OPT_DELETESOURCE },
+    { CMD_COPY, ".tmp\\httpd.conf-dist-win", "conf\\httpd.conf.default", 
+	OPT_OVERWRITE|OPT_EXPAND|OPT_DELETESOURCE },
+    { CMD_COPY, ".tmp\\srm.conf-dist-win", "conf\\srm.conf.default", 
+	OPT_OVERWRITE|OPT_EXPAND|OPT_DELETESOURCE },
+    { CMD_COPY, ".tmp\\access.conf-dist-win", "conf\\access.conf.default", 
+	OPT_OVERWRITE|OPT_EXPAND|OPT_DELETESOURCE },
+
+    /* Now copy to the 'live' files, unless they already exist */
+    { CMD_COPY, "conf\\httpd.conf.default", "conf\\httpd.conf", OPT_NONE },
+    { CMD_COPY, "conf\\srm.conf.default", "conf\\srm.conf", OPT_NONE },
+    { CMD_COPY, "conf\\access.conf.default", "conf\\access.conf", OPT_NONE },
+    { CMD_COPY, "conf\\magic.default", "conf\\magic", OPT_NONE },
+    { CMD_COPY, "conf\\mime.types.default", "conf\\mime.types", OPT_NONE },
+
+    { CMD_COPY, ".tmp\\highperformance.conf-dist", "conf\\highperformance.conf-dist", 
+	OPT_EXPAND|OPT_OVERWRITE|OPT_DELETESOURCE },
+
+    { CMD_RMDIR, ".tmp", NULL },
+
+    { CMD_END, NULL, NULL, OPT_NONE }
+};
+
+/*
+ * BeforeExit() is the DLL call from InstallShield. The arguments and
+ * return value as defined by the installer. We are only interested
+ * in the install directory, szInst. Return 0 on error and 1 on
+ * success (!?).
+ */
+
+CHAR WINAPI BeforeExit(HWND hwnd, LPSTR szSrcDir, LPSTR szSupport, LPSTR szInst, LPSTR szRes)
+{
+    ACTIONITEM *pactionItem;
+    int end = 0;
+
+    OpenLog(hwnd, szInst, "install.log");
+    LogMessage("STARTED %s", VERSION);
+    LogMessage("src=%s support=%s inst=%s",
+		szSrcDir, szSupport, szInst);
+
+    FillInReplaceTable(hwnd, replaceHttpd, szInst);
+
+    pactionItem = actionTable;
+    while (!end) {
+
+	LogMessage("command=%d 1in=%s out=%s options=%d",
+		   pactionItem->command,
+		   pactionItem->in ? pactionItem->in : "NULL",
+		   pactionItem->out ? pactionItem->out : "NULL",
+		   pactionItem->options);
+
+	switch(pactionItem->command) {
+	case CMD_END:
+	    end = 1;
+	    break;
+	case CMD_COPY:
+	    if (ExpandConfFile(hwnd, szInst, 
+			       pactionItem->in, 
+			       pactionItem->out,
+			       replaceHttpd,
+			       pactionItem->options) < 0) {
+		/* Error has already been reported to the user */
+		return 0;
+	    }
+	    break;
+	case CMD_RM: {
+	    char inFile[MAX_INPUT_LINE];
+
+	    ap_snprintf(inFile, sizeof(inFile), "%s\\%s", szInst, pactionItem->in);
+	    if (unlink(inFile) < 0 && !(pactionItem->options & OPT_SILENT)) {
+		MessageBox_error(hwnd, AP_WIN32ERROR, "Error during configuration",
+		    MB_ICONHAND,
+		    "Could not remove file %s", 
+		    inFile);
+		return 0;
+	    }
+	    LogMessage("RM: deleted file %s", inFile);
+	    break;
+	}
+	case CMD_RMDIR: {
+	    char inFile[MAX_INPUT_LINE];
+
+	    ap_snprintf(inFile, sizeof(inFile), "%s\\%s", szInst, pactionItem->in);
+	    if (rmdir(inFile) < 0) {
+		MessageBox_error(hwnd, AP_WIN32ERROR, "Error during configuration",
+		    MB_ICONHAND,
+		    "Could not delete temporary directory %s", 
+		    inFile);
+		return 0;
+	    }
+	    LogMessage("RMDIR: deleted directory %s", inFile);
+	    break;
+	}
+	default:
+	    MessageBox_error(hwnd, 0, "Error during configuration",
+		    MB_ICONHAND,
+		    "An error has occurred during configuration\r"
+		    "(Error: unknown command %d)", (int)pactionItem->command);
+	    end = 1;
+	    break;
+	}
+	pactionItem++;
+    }
+
+    LogMessage("FINISHED OK");
+    CloseLog();
+
+    return 1;
+}
+
+
+BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved)
+{
+    if (fdwReason == DLL_PROCESS_ATTACH)
+	hInstance = hInstDLL;
+    return TRUE;
+}
diff -Nur apache_1.3.26/src/os/win32/installer/installdll/install.def apache_1.3.26-ipv6/src/os/win32/installer/installdll/install.def
--- apache_1.3.26/src/os/win32/installer/installdll/install.def	Thu Jan  1 09:00:00 1970
+++ apache_1.3.26-ipv6/src/os/win32/installer/installdll/install.def	Wed Jun 19 08:05:35 2002
@@ -0,0 +1,6 @@
+LIBRARY      INSTALL
+DESCRIPTION  'Installer DLL For Apache'
+
+EXPORTS
+		BeforeExit @1
+		DllMain @2
diff -Nur apache_1.3.26/src/os/win32/installer/installdll/install.dsp apache_1.3.26-ipv6/src/os/win32/installer/installdll/install.dsp
--- apache_1.3.26/src/os/win32/installer/installdll/install.dsp	Thu Jan  1 09:00:00 1970
+++ apache_1.3.26-ipv6/src/os/win32/installer/installdll/install.dsp	Wed Jun 19 08:05:35 2002
@@ -0,0 +1,103 @@
+# Microsoft Developer Studio Project File - Name="install" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=install - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "install.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "install.mak" CFG="install - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "install - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "install - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "install - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\..\..\include" /I "..\..\..\..\os\win32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib wsock32.lib /nologo /subsystem:windows /dll /map /machine:I386
+
+!ELSEIF  "$(CFG)" == "install - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../../../include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib wsock32.lib /nologo /subsystem:windows /dll /map /debug /machine:I386 /pdbtype:sept
+
+!ENDIF 
+
+# Begin Target
+
+# Name "install - Win32 Release"
+# Name "install - Win32 Debug"
+# Begin Source File
+
+SOURCE=..\..\..\..\ap\ap_snprintf.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\install.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\install.def
+# End Source File
+# End Target
+# End Project
diff -Nur apache_1.3.26/src/os/win32/installer/installdll/install.mak apache_1.3.26-ipv6/src/os/win32/installer/installdll/install.mak
--- apache_1.3.26/src/os/win32/installer/installdll/install.mak	Thu Jan  1 09:00:00 1970
+++ apache_1.3.26-ipv6/src/os/win32/installer/installdll/install.mak	Wed Jun 19 08:05:35 2002
@@ -0,0 +1,283 @@
+# Microsoft Developer Studio Generated NMAKE File, Based on install.dsp
+!IF "$(CFG)" == ""
+CFG=install - Win32 Debug
+!MESSAGE No configuration specified. Defaulting to install - Win32 Debug.
+!ENDIF 
+
+!IF "$(CFG)" != "install - Win32 Release" && "$(CFG)" !=\
+ "install - Win32 Debug"
+!MESSAGE Invalid configuration "$(CFG)" specified.
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "install.mak" CFG="install - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "install - Win32 Release" (based on\
+ "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "install - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE 
+!ERROR An invalid configuration is specified.
+!ENDIF 
+
+!IF "$(OS)" == "Windows_NT"
+NULL=
+!ELSE 
+NULL=nul
+!ENDIF 
+
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "install - Win32 Release"
+
+OUTDIR=.\Release
+INTDIR=.\Release
+# Begin Custom Macros
+OutDir=.\Release
+# End Custom Macros
+
+!IF "$(RECURSE)" == "0" 
+
+ALL : "$(OUTDIR)\install.dll"
+
+!ELSE 
+
+ALL : "$(OUTDIR)\install.dll"
+
+!ENDIF 
+
+CLEAN :
+	-@erase "$(INTDIR)\ap_snprintf.obj"
+	-@erase "$(INTDIR)\install.obj"
+	-@erase "$(INTDIR)\vc50.idb"
+	-@erase "$(OUTDIR)\install.dll"
+	-@erase "$(OUTDIR)\install.exp"
+	-@erase "$(OUTDIR)\install.lib"
+	-@erase "$(OUTDIR)\install.map"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP_PROJ=/nologo /MT /W3 /GX /O2 /I "..\..\..\..\include" /I\
+ "..\..\..\..\os\win32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /Fo"$(INTDIR)\\"\
+ /Fd"$(INTDIR)\\" /FD /c 
+CPP_OBJS=.\Release/
+CPP_SBRS=.
+MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /o NUL /win32 
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\install.bsc" 
+BSC32_SBRS= \
+	
+LINK32=link.exe
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib wsock32.lib /nologo /subsystem:windows /dll\
+ /incremental:no /pdb:"$(OUTDIR)\install.pdb" /map:"$(INTDIR)\install.map"\
+ /machine:I386 /def:".\install.def" /out:"$(OUTDIR)\install.dll"\
+ /implib:"$(OUTDIR)\install.lib" 
+DEF_FILE= \
+	".\install.def"
+LINK32_OBJS= \
+	"$(INTDIR)\ap_snprintf.obj" \
+	"$(INTDIR)\install.obj"
+
+"$(OUTDIR)\install.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF  "$(CFG)" == "install - Win32 Debug"
+
+OUTDIR=.\Debug
+INTDIR=.\Debug
+# Begin Custom Macros
+OutDir=.\Debug
+# End Custom Macros
+
+!IF "$(RECURSE)" == "0" 
+
+ALL : "$(OUTDIR)\install.dll"
+
+!ELSE 
+
+ALL : "$(OUTDIR)\install.dll"
+
+!ENDIF 
+
+CLEAN :
+	-@erase "$(INTDIR)\ap_snprintf.obj"
+	-@erase "$(INTDIR)\install.obj"
+	-@erase "$(INTDIR)\vc50.idb"
+	-@erase "$(INTDIR)\vc50.pdb"
+	-@erase "$(OUTDIR)\install.dll"
+	-@erase "$(OUTDIR)\install.exp"
+	-@erase "$(OUTDIR)\install.ilk"
+	-@erase "$(OUTDIR)\install.lib"
+	-@erase "$(OUTDIR)\install.map"
+	-@erase "$(OUTDIR)\install.pdb"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP_PROJ=/nologo /MTd /W3 /Gm /GX /Zi /Od /I "../../../../include" /D "WIN32"\
+ /D "_DEBUG" /D "_WINDOWS" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c 
+CPP_OBJS=.\Debug/
+CPP_SBRS=.
+MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /o NUL /win32 
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\install.bsc" 
+BSC32_SBRS= \
+	
+LINK32=link.exe
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib wsock32.lib /nologo /subsystem:windows /dll\
+ /incremental:yes /pdb:"$(OUTDIR)\install.pdb" /map:"$(INTDIR)\install.map"\
+ /debug /machine:I386 /def:".\install.def" /out:"$(OUTDIR)\install.dll"\
+ /implib:"$(OUTDIR)\install.lib" /pdbtype:sept 
+DEF_FILE= \
+	".\install.def"
+LINK32_OBJS= \
+	"$(INTDIR)\ap_snprintf.obj" \
+	"$(INTDIR)\install.obj"
+
+"$(OUTDIR)\install.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ENDIF 
+
+.c{$(CPP_OBJS)}.obj::
+   $(CPP) @<<
+   $(CPP_PROJ) $< 
+<<
+
+.cpp{$(CPP_OBJS)}.obj::
+   $(CPP) @<<
+   $(CPP_PROJ) $< 
+<<
+
+.cxx{$(CPP_OBJS)}.obj::
+   $(CPP) @<<
+   $(CPP_PROJ) $< 
+<<
+
+.c{$(CPP_SBRS)}.sbr::
+   $(CPP) @<<
+   $(CPP_PROJ) $< 
+<<
+
+.cpp{$(CPP_SBRS)}.sbr::
+   $(CPP) @<<
+   $(CPP_PROJ) $< 
+<<
+
+.cxx{$(CPP_SBRS)}.sbr::
+   $(CPP) @<<
+   $(CPP_PROJ) $< 
+<<
+
+
+!IF "$(CFG)" == "install - Win32 Release" || "$(CFG)" ==\
+ "install - Win32 Debug"
+SOURCE=..\..\..\..\ap\ap_snprintf.c
+
+!IF  "$(CFG)" == "install - Win32 Release"
+
+DEP_CPP_AP_SN=\
+	"..\..\..\..\include\ap.h"\
+	"..\..\..\..\include\ap_alloc.h"\
+	"..\..\..\..\include\ap_config.h"\
+	"..\..\..\..\include\ap_ctype.h"\
+	"..\..\..\..\include\ap_mmn.h"\
+	"..\..\..\..\include\buff.h"\
+	"..\..\..\..\include\hsregex.h"\
+	"..\..\..\..\include\httpd.h"\
+	"..\..\..\..\include\util_uri.h"\
+	"..\..\os.h"\
+	"..\..\readdir.h"\
+	
+NODEP_CPP_AP_SN=\
+	"..\..\..\..\include\ap_config_auto.h"\
+	"..\..\..\..\include\ebcdic.h"\
+	"..\..\..\..\include\sfio.h"\
+	
+
+"$(INTDIR)\ap_snprintf.obj" : $(SOURCE) $(DEP_CPP_AP_SN) "$(INTDIR)"
+	$(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+!ELSEIF  "$(CFG)" == "install - Win32 Debug"
+
+DEP_CPP_AP_SN=\
+	"..\..\..\..\include\ap.h"\
+	"..\..\..\..\include\ap_alloc.h"\
+	"..\..\..\..\include\ap_config.h"\
+	"..\..\..\..\include\ap_ctype.h"\
+	"..\..\..\..\include\ap_mmn.h"\
+	"..\..\..\..\include\buff.h"\
+	"..\..\..\..\include\hsregex.h"\
+	"..\..\..\..\include\httpd.h"\
+	"..\..\..\..\include\util_uri.h"\
+	"..\..\os.h"\
+	"..\..\readdir.h"\
+	
+NODEP_CPP_AP_SN=\
+	"..\..\..\..\include\ap_config_auto.h"\
+	"..\..\..\..\include\ebcdic.h"\
+	"..\..\..\..\include\os.h"\
+	"..\..\..\..\include\sfio.h"\
+	
+
+"$(INTDIR)\ap_snprintf.obj" : $(SOURCE) $(DEP_CPP_AP_SN) "$(INTDIR)"
+	$(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+!ENDIF 
+
+SOURCE=.\install.c
+
+!IF  "$(CFG)" == "install - Win32 Release"
+
+DEP_CPP_INSTA=\
+	"..\..\..\..\include\ap.h"\
+	"..\..\..\..\include\ap_config.h"\
+	"..\..\..\..\include\ap_ctype.h"\
+	"..\..\..\..\include\ap_mmn.h"\
+	"..\..\..\..\include\conf.h"\
+	"..\..\..\..\include\hsregex.h"\
+	"..\..\os.h"\
+	
+NODEP_CPP_INSTA=\
+	"..\..\..\..\include\ap_config_auto.h"\
+	
+
+"$(INTDIR)\install.obj" : $(SOURCE) $(DEP_CPP_INSTA) "$(INTDIR)"
+
+
+!ELSEIF  "$(CFG)" == "install - Win32 Debug"
+
+DEP_CPP_INSTA=\
+	"..\..\..\..\include\ap.h"\
+	"..\..\..\..\include\ap_config.h"\
+	"..\..\..\..\include\ap_ctype.h"\
+	"..\..\..\..\include\ap_mmn.h"\
+	"..\..\..\..\include\conf.h"\
+	"..\..\..\..\include\hsregex.h"\
+	"..\..\os.h"\
+	
+NODEP_CPP_INSTA=\
+	"..\..\..\..\include\ap_config_auto.h"\
+	"..\..\..\..\include\os.h"\
+	
+
+"$(INTDIR)\install.obj" : $(SOURCE) $(DEP_CPP_INSTA) "$(INTDIR)"
+
+
+!ENDIF 
+
+
+!ENDIF 
+
diff -Nur apache_1.3.26/src/support/ab.c apache_1.3.26-ipv6/src/support/ab.c
--- apache_1.3.26/src/support/ab.c	Sun May 12 05:47:57 2002
+++ apache_1.3.26-ipv6/src/support/ab.c	Wed Jun 19 08:08:23 2002
@@ -158,6 +158,8 @@
 #include <sys/uio.h>
 #endif
 
+#include "sa_len.h"
+
 #endif				/* NO_APACHE_INCLUDES */
 
 #ifdef	USE_SSL
@@ -262,7 +264,7 @@
      auth[1024],		/* optional (basic/uuencoded)
 				 * authentification */
      hdrs[4096];		/* optional arbitrary headers */
-int port = 80;			/* port number */
+char *port = "80";		/* port number */
 
 int use_html = 0;		/* use html in the report */
 char *tablestring;
@@ -299,7 +301,7 @@
 struct data *stats;		/* date for each request */
 
 fd_set readbits, writebits;	/* bits for select */
-struct sockaddr_in server;	/* server addr structure */
+struct sockaddr_storage server;      /* server addr structure */
 
 #ifndef BEOS
 #define ab_close(s) close(s)
@@ -525,7 +527,7 @@
     printf("\r                                                                           \r");
     printf("Server Software:        %s\n", servername);
     printf("Server Hostname:        %s\n", hostname);
-    printf("Server Port:            %d\n", port);
+    printf("Server Port:            %s\n", port);
     printf("\n");
     printf("Document Path:          %s\n", path);
     printf("Document Length:        %d bytes\n", doclen);
@@ -878,7 +880,7 @@
     c->cbx = 0;
     c->gotheader = 0;
 
-    c->fd = socket(AF_INET, SOCK_STREAM, 0);
+    c->fd = socket(server.ss_family, SOCK_STREAM, 0);
     if (c->fd < 0) {
 	what = "SOCKET";
 	goto _bad;
@@ -895,7 +897,7 @@
 
 again:
     gettimeofday(&c->start, 0);
-    if (connect(c->fd, (struct sockaddr *) & server, sizeof(server)) < 0) {
+    if (connect(c->fd, (struct sockaddr *) &server, server.ss_len) < 0) {
 	if (errno != EINPROGRESS) {
 	    what = "CONNECT";
 	    goto _bad;
@@ -1225,17 +1227,16 @@
     }
     {
 	/* get server information */
-	struct hostent *he;
-	he = gethostbyname(connecthost);
-	if (!he) {
-	    char theerror[1024];
-	    ap_snprintf(theerror, sizeof(theerror),
-                        "Bad hostname: %s\n", connecthost);
-	    err(theerror);
-	}
-	server.sin_family = he->h_addrtype;
-	server.sin_port = htons(connectport);
-	server.sin_addr.s_addr = ((unsigned long *) (he->h_addr_list[0]))[0];
+      struct addrinfo hints, *res;
+      int error;
+
+      memset(&hints, 0, sizeof(hints));
+      hints.ai_family = PF_UNSPEC;
+      error = getaddrinfo(hostname, port, &hints, &res);
+      if (error)
+              err("bad hostname");
+      memcpy(&server, res->ai_addr, res->ai_addrlen);
+      freeaddrinfo(res);
     }
 
     con = malloc(concurrency * sizeof(struct connection));
@@ -1444,8 +1445,7 @@
     *cp = '\0';
     strcpy(hostname, h);
     if (p != NULL)
-	port = atoi(p);
-
+        port = strdup(p);
     if ((
 #ifdef USE_SSL
 	(ssl != 0) && (port != 443)) || ((ssl == 0) && 
@@ -1698,3 +1698,7 @@
 
     exit(0);
 }
+
+#ifdef NEED_GETADDRINFO
+#include "../main/getaddrinfo.c"
+#endif
diff -Nur apache_1.3.26/src/support/logresolve.c apache_1.3.26-ipv6/src/support/logresolve.c
--- apache_1.3.26/src/support/logresolve.c	Wed May 23 07:52:21 2001
+++ apache_1.3.26-ipv6/src/support/logresolve.c	Wed Jun 19 08:05:35 2002
@@ -54,7 +54,9 @@
 #endif /* BEOS */
 #endif /* !MPE && !WIN32*/
 
-static void cgethost(struct in_addr ipnum, char *string, int check);
+#include "sa_len.h"
+
+static void cgethost(struct sockaddr *sa, char *string, int check);
 static int getline(char *s, int n);
 static void stats(FILE *output);
 
@@ -91,7 +93,7 @@
  */
 
 struct nsrec {
-    struct in_addr ipnum;
+    struct sockaddr_storage addr;
     char *hostname;
     int noname;
     struct nsrec *next;
@@ -122,17 +124,48 @@
  * IP numbers with their IP number as hostname, setting noname flag
  */
 
-static void cgethost (struct in_addr ipnum, char *string, int check)
+static void cgethost (struct sockaddr *sa, char *string, int check)
 {
+    ap_uint32_t hashval;
+    struct sockaddr_in *sin;
+#ifdef INET6
+    struct sockaddr_in6 *sin6;
+#endif
     struct nsrec **current, *new;
-    struct hostent *hostdata;
     char *name;
+    char hostnamebuf[MAXHOSTNAMELEN];
+
+    switch (sa->sa_family) {
+    case AF_INET:
+	hashval = ((struct sockaddr_in *)sa)->sin_addr.s_addr;
+	break;
+#ifdef INET6
+    case AF_INET6:
+	hashval = *(ap_uint32_t *)&((struct sockaddr_in6 *)sa)->sin6_addr.s6_addr[12];
+	break;
+#endif
+    default:
+	hashval = 0;
+	break;
+    }
+
+    current = &nscache[((hashval + (hashval >> 8) +
+			 (hashval >> 16) + (hashval >> 24)) % BUCKETS)];
 
-    current = &nscache[((ipnum.s_addr + (ipnum.s_addr >> 8) +
-			 (ipnum.s_addr >> 16) + (ipnum.s_addr >> 24)) % BUCKETS)];
+    while (*current) {
+#ifndef SIN6_LEN
+	if (SA_LEN(sa) == SA_LEN((struct sockaddr *)&(*current)->addr)
+	 && memcmp(sa, &(*current)->addr, SA_LEN(sa)) == 0)
+#else
+	if (sa->sa_len == (*current)->addr.ss_len
+	 && memcmp(sa, &(*current)->addr, sa->sa_len) == 0)
+#endif
+	{
+	    break;
+	}
 
-    while (*current != NULL && ipnum.s_addr != (*current)->ipnum.s_addr)
 	current = &(*current)->next;
+    }
 
     if (*current == NULL) {
 	cachesize++;
@@ -145,45 +178,55 @@
 	*current = new;
 	new->next = NULL;
 
-	new->ipnum = ipnum;
+#ifndef SIN6_LEN
+	memcpy(&new->addr, sa, SA_LEN(sa));
+#else
+	memcpy(&new->addr, sa, sa->sa_len);
+#endif
 
-	hostdata = gethostbyaddr((const char *) &ipnum, sizeof(struct in_addr),
-				 AF_INET);
-	if (hostdata == NULL) {
-	    if (h_errno > MAX_ERR)
-		errors[UNKNOWN_ERR]++;
-	    else
-		errors[h_errno]++;
-	    new->noname = h_errno;
-	    name = strdup(inet_ntoa(ipnum));
-	}
-	else {
-	    new->noname = 0;
-	    name = strdup(hostdata->h_name);
-	    if (check) {
-		if (name == NULL) {
-		    perror("strdup");
-		    fprintf(stderr, "Insufficient memory\n");
-		    exit(1);
-		}
-		hostdata = gethostbyname(name);
-		if (hostdata != NULL) {
-		    char **hptr;
-
-		    for (hptr = hostdata->h_addr_list; *hptr != NULL; hptr++)
-			if (((struct in_addr *) (*hptr))->s_addr == ipnum.s_addr)
-			    break;
-		    if (*hptr == NULL)
-			hostdata = NULL;
-		}
-		if (hostdata == NULL) {
-		    fprintf(stderr, "Bad host: %s != %s\n", name,
-			    inet_ntoa(ipnum));
-		    new->noname = NO_REVERSE;
-		    free(name);
-		    name = strdup(inet_ntoa(ipnum));
-		    errors[NO_REVERSE]++;
+	new->noname = getnameinfo(sa,
+#ifndef SIN6_LEN
+		SA_LEN(sa),
+#else
+		sa->sa_len,
+#endif
+		    hostnamebuf, sizeof(hostnamebuf), NULL, 0, 0);
+	name = strdup(hostnamebuf);
+	if (check) {
+	    struct addrinfo hints, *res;
+	    int error;
+	    memset(&hints, 0, sizeof(hints));
+	    hints.ai_family = PF_UNSPEC;
+	    error = getaddrinfo(hostnamebuf, NULL, &hints, &res);
+	    if (!error) {
+		while (res) {
+#ifndef SIN6_LEN
+		    if (SA_LEN(sa) == res->ai_addrlen
+		     && memcmp(sa, res->ai_addr, SA_LEN(sa)) == 0)
+#else
+		    if (sa->sa_len == res->ai_addrlen
+		     && memcmp(sa, res->ai_addr, sa->sa_len) == 0)
+#endif
+		    {
+			break;
+		    }
+		    res = res->ai_next;
 		}
+		if (!res)
+		    error++;
+	    }
+	    if (error) {
+		getnameinfo(sa,
+#ifndef SIN6_LEN
+		    SA_LEN(sa),
+#else
+		    sa->sa_len,
+#endif
+		    hostnamebuf, sizeof(hostnamebuf), NULL, 0, NI_NUMERICHOST);
+		fprintf(stderr, "Bad host: %s != %s\n", name, hostnamebuf);
+		new->noname = NO_REVERSE;
+		free(name);
+		name = strdup(hostnamebuf);
 	    }
 	}
 	new->hostname = name;
@@ -211,6 +254,7 @@
     char *ipstring;
     struct nsrec *current;
     char *errstring[MAX_ERR + 3];
+    char hostnamebuf[MAXHOSTNAMELEN];
 
     for (i = 0; i < MAX_ERR + 3; i++)
 	errstring[i] = "Unknown error";
@@ -242,7 +286,14 @@
 
     for (i = 0; i < BUCKETS; i++)
 	for (current = nscache[i]; current != NULL; current = current->next) {
-	    ipstring = inet_ntoa(current->ipnum);
+	    getnameinfo((struct sockaddr *)&current->addr,
+#ifndef SIN6_LEN
+		    SA_LEN((struct sockaddr *)&current->addr),
+#else
+		    current->addr.ss_len,
+#endif
+		    hostnamebuf, sizeof(hostnamebuf), NULL, 0, NI_NUMERICHOST);
+	    ipstring = hostnamebuf;
 	    if (current->noname == 0)
 		fprintf(output, "  %3d  %15s - %s\n", i, ipstring,
 			current->hostname);
@@ -276,9 +327,10 @@
 
 int main (int argc, char *argv[])
 {
-    struct in_addr ipnum;
     char *bar, hoststring[MAXDNAME + 1], line[MAXLINE], *statfile;
     int i, check;
+    struct addrinfo hints, *res;
+    int error;
 
 #ifdef WIN32
     WSADATA wsaData;
@@ -322,8 +374,10 @@
 	bar = strchr(line, ' ');
 	if (bar != NULL)
 	    *bar = '\0';
-	ipnum.s_addr = inet_addr(line);
-	if (ipnum.s_addr == 0xffffffffu) {
+	memset(&hints, 0, sizeof(hints));
+	hints.ai_family = PF_UNSPEC;
+	error = getaddrinfo(line, NULL, &hints, &res);
+	if (error) {
 	    if (bar != NULL)
 		*bar = ' ';
 	    puts(line);
@@ -333,11 +387,12 @@
 
 	resolves++;
 
-	cgethost(ipnum, hoststring, check);
+	cgethost(res->ai_addr, hoststring, check);
 	if (bar != NULL)
 	    printf("%s %s\n", hoststring, bar + 1);
 	else
 	    puts(hoststring);
+	freeaddrinfo(res);
     }
 
 #ifdef WIN32
@@ -358,3 +413,11 @@
 
     return (0);
 }
+
+#ifdef NEED_GETADDRINFO
+#include "../main/getaddrinfo.c"
+#endif
+
+#ifdef NEED_GETNAMEINFO
+#include "../main/getnameinfo.c"
+#endif
--- apache_1.3.26/src/support/Makefile.tmpl	Sun Mar  3 02:46:23 2002
+++ apache_1.3.26-ipv6/src/support/Makefile.tmpl	Thu Jun 20 08:05:31 2002
@@ -12,9 +12,9 @@
 INCLUDES=$(INCLUDES1) $(INCLUDES0) $(EXTRA_INCLUDES)
 LDFLAGS=$(LDFLAGS1) $(EXTRA_LDFLAGS) -L$(OSDIR) -L$(SRCDIR)/ap
 
-TARGETS=htpasswd htdigest rotatelogs logresolve ab apxs checkgid
+TARGETS=htpasswd htdigest rotatelogs logresolve apxs checkgid
 
-OBJS=htpasswd.o htdigest.o rotatelogs.o logresolve.o ab.o checkgid.o
+OBJS=htpasswd.o htdigest.o rotatelogs.o logresolve.o checkgid.o
 
 .c.o: 
 	$(CC) -c $(INCLUDES) $(CFLAGS) $<
