summaryrefslogtreecommitdiff
path: root/ext/standard/dns_win32.c
diff options
context:
space:
mode:
authorPierre Joye <pajoye@php.net>2009-08-10 08:05:11 +0000
committerPierre Joye <pajoye@php.net>2009-08-10 08:05:11 +0000
commit80696a6f77137093d7e73061a64c2e5e01ce9f8b (patch)
tree18f1fac8bb5b5f09bb52f452b02b19ada8d70394 /ext/standard/dns_win32.c
parent4a607c147d87c454339cc42f60ef2b055499adc5 (diff)
downloadphp-git-80696a6f77137093d7e73061a64c2e5e01ce9f8b.tar.gz
- fix and improve dns' AAAA support on windows
Diffstat (limited to 'ext/standard/dns_win32.c')
-rw-r--r--ext/standard/dns_win32.c45
1 files changed, 37 insertions, 8 deletions
diff --git a/ext/standard/dns_win32.c b/ext/standard/dns_win32.c
index 05c7292997..8c94f27f4b 100644
--- a/ext/standard/dns_win32.c
+++ b/ext/standard/dns_win32.c
@@ -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 */