Avoid directory permission issues with --fake-super.
[rsync/rsync.git] / lib / getaddrinfo.c
index 3e81557..96d7a2b 100644 (file)
@@ -53,8 +53,15 @@ TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 #define SMB_STRDUP(s) strdup(s)
 #endif
 
+#ifndef HOST_NAME_MAX
+#define HOST_NAME_MAX 255
+#endif
+
 static int check_hostent_err(struct hostent *hp)
 {
+#ifndef INET6
+       extern int h_errno;
+#endif
        if (!hp) {
                switch (h_errno) {
                        case HOST_NOT_FOUND:
@@ -106,7 +113,7 @@ static char *get_canon_name_from_addr(struct in_addr ip,
                                int *perr)
 {
        return canon_name_from_hostent(
-                       gethostbyaddr(&ip, sizeof(ip), AF_INET),
+                       gethostbyaddr((void *)&ip, sizeof ip, AF_INET),
                        perr);
 }
 
@@ -153,7 +160,7 @@ static struct addrinfo *alloc_entry(const struct addrinfo *hints,
  */
 
 static int getaddr_info_single_addr(const char *service,
-                               uint32_t addr,
+                               uint32 addr,
                                const struct addrinfo *hints,
                                struct addrinfo **res)
 {
@@ -288,9 +295,8 @@ int getaddrinfo(const char *node,
                                        res);
                } else if (hints.ai_flags & AI_NUMERICHOST) {
                        struct in_addr ip;
-                       if (!inet_aton(node, &ip)) {
+                       if (inet_pton(AF_INET, node, &ip) <= 0)
                                return EAI_FAIL;
-                       }
                        return getaddr_info_single_addr(service,
                                        ntohl(ip.s_addr),
                                        &hints,
@@ -399,8 +405,8 @@ static int gethostnameinfo(const struct sockaddr *sa,
 
        if (!(flags & NI_NUMERICHOST)) {
                struct hostent *hp = gethostbyaddr(
-                               &((struct sockaddr_in *)sa)->sin_addr,
-                               sizeof(struct in_addr),
+                               (void *)&((struct sockaddr_in *)sa)->sin_addr,
+                               sizeof (struct in_addr),
                                sa->sa_family);
                ret = check_hostent_err(hp);
                if (ret == 0) {
@@ -481,17 +487,14 @@ int getnameinfo(const struct sockaddr *sa, socklen_t salen,
                return EAI_FAIL;
        }
 
-       if (salen < sizeof(struct sockaddr_in)) {
+       if (salen < (socklen_t)sizeof (struct sockaddr_in)) {
                return EAI_FAIL;
        }
 
-       /* We don't support those. */
-       if ((node && !(flags & NI_NUMERICHOST))
-               || (service && !(flags & NI_NUMERICSERV)))
-               return EAI_FAIL;
-
        if (node) {
-               return gethostnameinfo(sa, node, nodelen, flags);
+               int ret = gethostnameinfo(sa, node, nodelen, flags);
+               if (ret)
+                       return ret;
        }
 
        if (service) {