- if (hp->h_addr == NULL) {
- rprintf(FERROR, "gethostbyname: host address is invalid for host \"%s\"\n",str);
- return NULL;
+ /* reverse lookup */
+ if (getnameinfo((struct sockaddr *)&ss, length,
+ name_buf, sizeof(name_buf), port_buf, sizeof(port_buf),
+ NI_NAMEREQD | NI_NUMERICSERV) != 0) {
+ strcpy(name_buf, def);
+ rprintf(FERROR, "reverse name lookup failed\n");
+ }
+
+ /* forward lookup */
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = PF_UNSPEC;
+ hints.ai_flags = AI_CANONNAME;
+ hints.ai_socktype = SOCK_STREAM;
+ error = getaddrinfo(name_buf, port_buf, &hints, &res0);
+ if (error) {
+ strcpy(name_buf, def);
+ rprintf(FERROR,
+ RSYNC_NAME ": forward name lookup for %s failed: %s\n",
+ port_buf,
+ gai_strerror(error));
+ return name_buf;
+ }
+
+ /* XXX sin6_flowinfo and other fields */
+ for (res = res0; res; res = res->ai_next) {
+ if (res->ai_family != get_sockaddr_family(&ss))
+ continue;
+ if (res->ai_addrlen != length)
+ continue;
+ if (memcmp(res->ai_addr, &ss, res->ai_addrlen) == 0)
+ break;