Index: src/sbin/isakmpd/util.c
===================================================================
RCS file: /cvs/src/sbin/isakmpd/util.c,v
retrieving revision 1.46
diff -u -r1.46 util.c
--- src/sbin/isakmpd/util.c	2004/06/25 19:42:38	1.46
+++ src/sbin/isakmpd/util.c	2004/06/26 18:58:48
@@ -41,6 +41,7 @@
 #include <string.h>
 #include <unistd.h>
 #include <errno.h>
+#include <ifaddrs.h>
 
 #include "sysdep.h"
 
@@ -243,6 +244,7 @@
 text2sockaddr(char *address, char *port, struct sockaddr **sa)
 {
 	struct addrinfo *ai, hints;
+	struct ifaddrs *ifap;
 
 	memset(&hints, 0, sizeof hints);
 	if (!allow_name_lookups)
@@ -250,6 +252,31 @@
 	hints.ai_family = PF_UNSPEC;
 	hints.ai_socktype = SOCK_DGRAM;
 	hints.ai_protocol = IPPROTO_UDP;
+
+	if (allow_name_lookups && (getifaddrs (&ifap) == 0)) {
+		struct ifaddrs *p;
+		for (p = ifap;
+		     p && (strcmp (p->ifa_name, address)
+			   || !p->ifa_addr
+			   || (p->ifa_addr->sa_family != AF_INET
+			    && p->ifa_addr->sa_family != AF_INET6));
+		     p = p->ifa_next);
+		if (p && (*sa = malloc(sysdep_sa_len(p->ifa_addr)))) {
+			memcpy (*sa, p->ifa_addr, sysdep_sa_len(p->ifa_addr));
+			freeifaddrs (ifap);
+			hints.ai_family = p->ifa_addr->sa_family;
+			if (getaddrinfo(NULL, port, &hints, &ai))
+				return -1;
+			if (p->ifa_addr->sa_family == AF_INET)
+			    ((struct sockaddr_in *) sa)->sin_port =
+				((struct sockaddr_in *) p->ifa_addr)->sin_port;
+			else
+			    ((struct sockaddr_in6 *)*sa)->sin6_port =
+				((struct sockaddr_in6 *)p->ifa_addr)->sin6_port;
+			return 0;
+		}
+		freeifaddrs (ifap);
+	}
 
 	if (getaddrinfo(address, port, &hints, &ai))
 		return -1;
