]> granicus.if.org Git - python/commitdiff
Patch 731209: Restore socketmodule's behaviour with dotted quad addresses
authorAnthony Baxter <anthonybaxter@gmail.com>
Fri, 2 May 2003 15:40:46 +0000 (15:40 +0000)
committerAnthony Baxter <anthonybaxter@gmail.com>
Fri, 2 May 2003 15:40:46 +0000 (15:40 +0000)
to that of Python2.1. Such nnn.nnn.nnn.nnn addresses are just used directly,
not passed to the resolver for a pointless lookup.

Modules/socketmodule.c

index b9e9bd4bd78a657583b9844dd8c27352c88d549f..843c5a968763112aaf31f64e2731bc6a836c9806 100644 (file)
@@ -626,6 +626,8 @@ setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
 {
        struct addrinfo hints, *res;
        int error;
+       int d1, d2, d3, d4;
+       char ch;
 
        memset((void *) addr_ret, '\0', sizeof(*addr_ret));
        if (name[0] == '\0') {
@@ -682,6 +684,20 @@ setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
                sin->sin_addr.s_addr = INADDR_BROADCAST;
                return sizeof(sin->sin_addr);
        }
+       if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
+           0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
+           0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
+               struct sockaddr_in *sin;
+               sin = (struct sockaddr_in *)addr_ret;
+               sin->sin_addr.s_addr = htonl(
+                       ((long) d1 << 24) | ((long) d2 << 16) |
+                       ((long) d3 << 8) | ((long) d4 << 0));
+               sin->sin_family = AF_INET;
+#ifdef HAVE_SOCKADDR_SA_LEN
+               sin->sin_len = sizeof(*sin);
+#endif
+               return 4;
+       }
        memset(&hints, 0, sizeof(hints));
        hints.ai_family = af;
        error = getaddrinfo(name, NULL, &hints, &res);