]> granicus.if.org Git - php/commitdiff
- fix and improve dns' AAAA support on windows
authorPierre Joye <pajoye@php.net>
Mon, 10 Aug 2009 08:05:11 +0000 (08:05 +0000)
committerPierre Joye <pajoye@php.net>
Mon, 10 Aug 2009 08:05:11 +0000 (08:05 +0000)
NEWS
ext/standard/dns_win32.c

diff --git a/NEWS b/NEWS
index 99b77864b41b35af109b07f76ae12f2aff7ff38a..26c60ced838bf153188b3556f35da34cbd2f15a2 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,9 @@
 PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? ??? 2009, PHP 5.3.1
+- Improve dns_get_record AAAA support on windows. Always available when IPv6 is
+  support is installed, format is now the same than on unix. (Pierre)
+
 - Fixed spl_autoload_unregister/spl_autoload_functions wrt. Closures and
   Functors. (Christian Seiler)
 - Fixed open_basedir circumvention for mail.log. (Maksymilian Arciemowicz,
index 05c7292997d049cfe539963817234fafff634b03..8c94f27f4b0b29a8cf3b625fa53b92718e610e08 100644 (file)
@@ -132,7 +132,6 @@ PHP_FUNCTION(dns_check_record)
 }
 /* }}} */
 
-#if 1
 /* {{{ php_parserr */
 static void php_parserr(PDNS_RECORD pRec, int type_to_fetch, int store, zval **subarray)
 {
@@ -237,20 +236,51 @@ static void php_parserr(PDNS_RECORD pRec, int type_to_fetch, int store, zval **s
                        }
                        break;
 
-
                case DNS_TYPE_AAAA:
-#if _WIN32_WINNT >= 0x0600
                        {
-                               LPSTR str[MAXHOSTNAMELEN];
                                DNS_AAAA_DATA *data_aaaa = &pRec->Data.AAAA;
+                               char buf[sizeof("AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA")];
+                               char *tp = buf;
+                               int i;
+                               unsigned short out[8];
+                               int have_v6_break = 0, in_v6_break = 0;
+
+                               for (i = 0; i < 4; ++i) {
+                                       DWORD chunk = data_aaaa->Ip6Address.IP6Dword[i];
+                                       out[i * 2]     = htons(LOWORD(chunk));
+                                       out[i * 2 + 1] = htons(HIWORD(chunk));
+                               }
+
+                               for(i=0; i < 8; i++) {
+                                       if (out[i] != 0) {
+                                               if (tp > (u_char *)buf) {
+                                                       in_v6_break = 0;
+                                                       tp[0] = ':';
+                                                       tp++;
+                                               }
+                                               tp += sprintf((char*)tp,"%x", out[i]);
+                                       } else {
+                                               if (!have_v6_break) {
+                                                       have_v6_break = 1;
+                                                       in_v6_break = 1;
+                                                       tp[0] = ':';
+                                                       tp++;
+                                               } else if (!in_v6_break) {
+                                                       tp[0] = ':';
+                                                       tp++;
+                                                       tp[0] = '0';
+                                                       tp++;
+                                               }
+                                       }
+                               }
+
                                add_assoc_string(*subarray, "type", "AAAA", 1);
-                               add_assoc_string(*subarray, "ipv6", RtlIpv6AddressToString(data_aaaa->Ip6Address, str), 1);
+                               add_assoc_string(*subarray, "ipv6", buf, 1);
                        }
-#endif
                        break;
 
 #if 0
-               /* Not supported yet */
+               /* Won't be implemented. A6 is deprecated. (Pierre) */
                case DNS_TYPE_A6:
                        break;
 #endif
@@ -291,7 +321,6 @@ static void php_parserr(PDNS_RECORD pRec, int type_to_fetch, int store, zval **s
        add_assoc_long(*subarray, "ttl", ttl);
 }
 /* }}} */
-#endif
 
 /* {{{ proto array|false dns_get_record(string hostname [, int type[, array authns, array addtl]])
    Get any Resource Record corresponding to a given Internet host name */