Roll over version and news.
[rsync/rsync.git] / clientname.c
index f83eb8d..6602052 100644 (file)
@@ -91,7 +91,7 @@ char *client_name(int fd)
        client_sockaddr(fd, &ss, &ss_len);
 
        if (!lookup_name(fd, &ss, ss_len, name_buf, sizeof name_buf, port_buf, sizeof port_buf))
-               check_name(fd, &ss, ss_len, name_buf, port_buf);
+               check_name(fd, &ss, name_buf, port_buf);
 
        return name_buf;
 }
@@ -185,7 +185,6 @@ int compare_addrinfo_sockaddr(const struct addrinfo *ai,
 {
        int ss_family = get_sockaddr_family(ss);
        const char fn[] = "compare_addrinfo_sockaddr";
-       size_t valid_len;
                      
        if (ai->ai_family != ss_family) {
                rprintf(FERROR,
@@ -194,21 +193,31 @@ int compare_addrinfo_sockaddr(const struct addrinfo *ai,
                return 1;
        }
 
-       switch (ss_family) {
-       case AF_INET:
-               valid_len = sizeof (struct sockaddr_in);
-               break;
+       /* The comparison method depends on the particular AF. */
+       if (ss_family == AF_INET) {
+               const struct sockaddr_in *sin1, *sin2;
+
+               sin1 = (const struct sockaddr_in *) ss;
+               sin2 = (const struct sockaddr_in *) ai->ai_addr;
+               
+               return memcmp(&sin1->sin_addr, &sin2->sin_addr,
+                             sizeof sin1->sin_addr);
+       }
 #ifdef INET6
-       case AF_INET6:
-               valid_len = sizeof (struct sockaddr_in6);
-               break;
-#endif
-       default:
-               /* Don't know what to do! */
+       else if (ss_family == AF_INET6) {
+               const struct sockaddr_in6 *sin1, *sin2;
+
+               sin1 = (const struct sockaddr_in6 *) ss;
+               sin2 = (const struct sockaddr_in6 *) ai->ai_addr;
+               
+               return memcmp(&sin1->sin6_addr, &sin2->sin6_addr,
+                             sizeof sin1->sin6_addr);
+       }
+#endif /* INET6 */
+       else {
+               /* don't know */
                return 1;
        }
-
-       return memcmp(ss, ai->ai_addr, valid_len);
 }
 
 
@@ -220,7 +229,6 @@ int compare_addrinfo_sockaddr(const struct addrinfo *ai,
  **/
 int check_name(int fd,
               const struct sockaddr_storage *ss,
-              socklen_t ss_len,
               char *name_buf,
               const char *port_buf)
 {
@@ -229,8 +237,8 @@ int check_name(int fd,
        int ss_family = get_sockaddr_family(ss);
 
        memset(&hints, 0, sizeof(hints));
-       hints.ai_family = PF_UNSPEC;
-       hints.ai_flags = ss_family;
+       hints.ai_family = ss_family;
+       hints.ai_flags = AI_CANONNAME;
        hints.ai_socktype = SOCK_STREAM;
        error = getaddrinfo(name_buf, port_buf, &hints, &res0);
        if (error) {