diff -purN Unreal3.2.7.orig/src/s_conf.c Unreal3.2.7/src/s_conf.c
--- Unreal3.2.7.orig/src/s_conf.c	2007-07-22 10:58:22.539110247 -0700
+++ Unreal3.2.7/src/s_conf.c	2007-07-22 13:10:05.155025667 -0700
@@ -4196,12 +4196,29 @@ int	_test_listen(ConfigFile *conf, Confi
 		return 1;
 	}
 #ifdef INET6
+	int reentrant = 0;
+	IPv6_listen:
 	if ((strlen(ip) > 6) && !strchr(ip, ':') && isdigit(ip[strlen(ip)-1]))
 	{
-		config_error("%s:%i: listen: ip set to '%s' (ipv4) on an IPv6 compile, "
+		if(reentrant) {
+			config_error("%s:%i: listen: ip set to '%s' (ipv4) on an IPv6 compile, "
 		              "use the ::ffff:1.2.3.4 form instead",
 					ce->ce_fileptr->cf_filename, ce->ce_varlinenum, ip);
-		return 1;
+			return 1;
+		}
+		char *ipv6 = calloc(1, 48);
+		snprintf(ipv6, 47, "::ffff:%s", ip);
+		char *ipv6Port = calloc(1, 64);
+		snprintf(ipv6Port, 63, "[%s]:%s", ipv6, port);
+		ip = strdup(ipv6);
+		free(ipv6);
+
+		free(ce->ce_vardata);
+		ce->ce_vardata = strdup(ipv6Port);
+
+		free(ipv6Port);
+		reentrant++;
+		goto IPv6_listen;
 	}
 #endif
 	port_range(port, &start, &end);
@@ -6078,14 +6095,27 @@ int	_test_link(ConfigFile *conf, ConfigE
 #ifdef INET6
 			/* I'm nice... I'll help those poor ipv6 users. -- Syzop */
 			/* [ not null && len>6 && has not a : in it && last character is a digit ] */
+			int reentrant = 0;
+			IPv6_link:
 			if (cep->ce_vardata && (strlen(cep->ce_vardata) > 6) && !strchr(cep->ce_vardata, ':') &&
 			    isdigit(cep->ce_vardata[strlen(cep->ce_vardata)-1]))
 			{
-				config_error("%s:%i: link %s has link::hostname set to '%s' (IPv4) on a IPv6 compile, "
+				if(reentrant) {
+					config_error("%s:%i: link %s has link::hostname set to '%s' (IPv4) on a IPv6 compile, "
 				              "use the ::ffff:1.2.3.4 form instead",
 							cep->ce_fileptr->cf_filename, cep->ce_varlinenum, ce->ce_vardata,
 							cep->ce_vardata);
-				errors++;
+					errors++;
+				} else {
+					char *ipv6 = calloc(1, 48);
+					snprintf(ipv6, 48, "::ffff:%s", cep->ce_vardata);
+					free(ce->ce_vardata);
+					//ce->ce_vardata = strndup(ipv6, 48);
+					ce->ce_vardata = ipv6; // shallow copy
+					//free(ipv6);
+					reentrant++;
+					goto IPv6_link;
+				}
 			}
 #endif
 			if (strchr(cep->ce_vardata, '*') != NULL || strchr(cep->ce_vardata, '?'))
