struct timeval tv, *tvp;
        struct timeval start_time,check_time;
        int     err = NETDB_INTERNAL;
+       char    *name2;
+       size_t  namelen;
+
+       name2 = name;
+       namelen = strlen(name);
+       if (name[0]=='[' && name[namelen-1]==']') {
+               /* IPv6 literal, strip brackets */
+               name2 = strdup(name);
+               if (!name2) return NETDB_INTERNAL;
+               name2[namelen-1] = '\0';
+               name2++;
+       }       
 
 /* start timer */
        gettimeofday(&start_time,0);
        ar.ent = (struct hostent *) calloc (sizeof(*ar.ent),1);
 
 /* query DNS server asynchronously */
-       ares_gethostbyname(channel, name, QUERY_AF_ALL, callback_ares_gethostbyname,
+       ares_gethostbyname(channel, name2, QUERY_AF_ALL, callback_ares_gethostbyname,
                           (void *) &ar);
 
 /* wait for result */
        free_hostent(ar.ent); ar.ent = NULL;
        err = ar.err;
 
+       /* literal conversion should always succeed */
+       if (name2 != name) free(name2-1); 
+
        ares_destroy(channel);
 
        return err;