*** isakmpd/util.c.original	Wed Sep  4 22:11:28 2002
--- isakmpd/util.c	Sun Sep 15 20:24:12 2002
***************
*** 46,51 ****
--- 46,52 ----
  #include <string.h>
  #include <unistd.h>
  #include <errno.h>
+ #include <ifaddrs.h>
  
  #include "sysdep.h"
  
***************
*** 247,255 ****
--- 248,324 ----
    return 0;
  }
  
+ static int
+ interface2sockaddr (char *, char *, struct sockaddr **);
+ 
+ static int
+ interface2sockaddr (char *interface, char *port, struct sockaddr **sa)
+ {
+   struct ifaddrs *ifap, *p;
+   size_t sz;
+ 
+   if (getifaddrs (&ifap))
+     return -1;
+ 
+   p = ifap;
+   while (p && (strcmp (p->ifa_name, interface) || !p->ifa_addr ||
+     (p->ifa_addr->sa_family != AF_INET &&
+      p->ifa_addr->sa_family != AF_INET6)))
+     p = p->ifa_next;
+ 
+   if (!p)
+     {
+       freeifaddrs (ifap);
+       return -1;
+     }
+ 
+   sz = p->ifa_addr->sa_family == AF_INET ? sizeof (struct sockaddr_in)
+ 					 : sizeof (struct sockaddr_in6);
+   *sa = malloc (sz);
+   if (!*sa)
+     {
+       freeifaddrs (ifap);
+       return -1;
+     }
+ 
+   memcpy (*sa, p->ifa_addr, sz);
+   freeifaddrs (ifap);
+ 
+   if (port)
+     {
+       long lport;
+       struct servent *sp;
+       char *ep;
+ 
+       sp = getservbyname (port, "udp");
+       if (!sp)
+ 	{
+ 	  lport = strtol (port, &ep, 10);
+ 	  if (ep == port || lport < 0 || lport > USHRT_MAX)
+ 	    {
+ 	      free (*sa);
+ 	      return -1;
+ 	    }
+ 	  lport = htons (lport);
+         }
+       else
+ 	lport = sp->s_port;
+ 
+       if ((*sa)->sa_family == AF_INET)
+ 	((struct sockaddr_in *)*sa)->sin_port = lport;
+       else
+ 	((struct sockaddr_in6 *)*sa)->sin6_port = lport;
+     }
+   return 0;
+ }
+ 
  int
  text2sockaddr (char *address, char *port, struct sockaddr **sa)
  {
+   if (!interface2sockaddr(address, port, sa))
+     return 0;
+   else
+ {
  #ifdef HAVE_GETNAMEINFO
    struct addrinfo *ai, hints;
  
***************
*** 310,315 ****
--- 379,385 ----
      ((struct sockaddr_in6 *)*sa)->sin6_port = lport;
    return 0;
  #endif
+ }
  }
  
  /*
