--- netlib.c.orig	2008-01-07 23:35:56.000000000 +0100
+++ netlib.c	2010-09-02 11:43:45.000000000 +0200
@@ -241,21 +241,23 @@
 
 int server_addr(struct sockaddr_in *addr, struct vtun_host *host)
 {
-     struct hostent * hent;
+     struct addrinfo hints, *aiptr;
 
      memset(addr,0,sizeof(struct sockaddr_in));
-     addr->sin_family = AF_INET;
-     addr->sin_port = htons(vtun.bind_addr.port);
+     memset(&hints, '\0', sizeof(hints));
+     hints.ai_family = AF_INET;
 
      /* Lookup server's IP address.
       * We do it on every reconnect because server's IP 
       * address can be dynamic.
       */
-     if( !(hent = gethostbyname(vtun.svr_name)) ){
+     if( getaddrinfo(vtun.svr_name, NULL, &hints, &aiptr) ){
         vtun_syslog(LOG_ERR, "Can't resolv server address: %s", vtun.svr_name);
         return -1;
      }
-     addr->sin_addr.s_addr = *(unsigned long *)hent->h_addr; 
+     memcpy(addr, aiptr->ai_addr, aiptr->ai_addrlen);
+     addr->sin_port = htons(vtun.bind_addr.port);
+     freeaddrinfo(aiptr);
 
      host->sopt.raddr = strdup(inet_ntoa(addr->sin_addr));
      host->sopt.rport = vtun.bind_addr.port;
@@ -266,8 +268,11 @@
 /* Set address by interface name, ip address or hostname */
 int generic_addr(struct sockaddr_in *addr, struct vtun_addr *vaddr)
 {
-     struct hostent *hent;
+     struct addrinfo hints, *aiptr;
+
      memset(addr, 0, sizeof(struct sockaddr_in));
+     memset(&hints, '\0', sizeof(hints));
+     hints.ai_family = AF_INET;
   
      addr->sin_family = AF_INET;
   
@@ -282,13 +287,14 @@
 	 }
            break;
         case VTUN_ADDR_NAME:
-	 if (!(hent = gethostbyname(vaddr->name))) {
+	 if( getaddrinfo(vaddr->name, NULL, &hints, &aiptr) ){
 	    vtun_syslog(LOG_ERR,
 	                "Can't resolv local address %s",
 	                vaddr->name);
 	    return -1;
            }
-	 addr->sin_addr.s_addr = *(unsigned long *) hent->h_addr;
+	 memcpy(addr, aiptr->ai_addr, aiptr->ai_addrlen);
+	 freeaddrinfo(aiptr);
            break;
         default:
            addr->sin_addr.s_addr = INADDR_ANY;
