- struct hostent *hp;
-
- saddr->sin_family = AF_INET;
- if (!inet_aton(hostname, &saddr->sin_addr)) {
- if ((hp = gethostbyname(hostname)) == NULL) {
- nfs_error(_("%s: can't get address for %s\n"),
- progname, hostname);
- return 0;
- } else {
- if (hp->h_length > sizeof(*saddr)) {
- nfs_error(_("%s: got bad hp->h_length\n"),
- progname);
- hp->h_length = sizeof(*saddr);
- }
- memcpy(&saddr->sin_addr, hp->h_addr, hp->h_length);
+ struct addrinfo *gai_results;
+ struct addrinfo gai_hint = {
+ .ai_family = af_hint,
+ .ai_flags = AI_ADDRCONFIG,
+ };
+ socklen_t len = *salen;
+ int error, ret = 0;
+
+ if (af_hint == AF_INET6)
+ gai_hint.ai_flags |= AI_V4MAPPED|AI_ALL;
+
+ *salen = 0;
+
+ error = getaddrinfo(hostname, NULL, &gai_hint, &gai_results);
+ if (error) {
+ nfs_error(_("%s: DNS resolution failed for %s: %s"),
+ progname, hostname, (error == EAI_SYSTEM ?
+ strerror(errno) : gai_strerror(error)));
+ return ret;
+ }
+
+ switch (gai_results->ai_addr->sa_family) {
+ case AF_INET:
+ case AF_INET6:
+ if (len >= gai_results->ai_addrlen) {
+ *salen = gai_results->ai_addrlen;
+ memcpy(sap, gai_results->ai_addr, *salen);
+ ret = 1;