From: Sara Golemon Date: Sun, 8 Dec 2002 08:14:43 +0000 (+0000) Subject: Bug #17174 Added IPv6 (AAAA record) support to dns_check_record() also added support... X-Git-Tag: RELEASE_1_0b3~117 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a4d6863ee564e405b4454bcb2776a689b2a875d6;p=php Bug #17174 Added IPv6 (AAAA record) support to dns_check_record() also added support to dns_get_record --- diff --git a/ext/standard/dns.c b/ext/standard/dns.c index 2f68defa95..db79ffab5c 100644 --- a/ext/standard/dns.c +++ b/ext/standard/dns.c @@ -241,6 +241,7 @@ PHP_FUNCTION(dns_check_record) else if (!strcasecmp("ANY", Z_STRVAL_PP(arg2))) type = T_ANY; else if (!strcasecmp("SOA", Z_STRVAL_PP(arg2))) type = T_SOA; else if (!strcasecmp("CNAME", Z_STRVAL_PP(arg2))) type = T_CNAME; + else if (!strcasecmp("AAAA", Z_STRVAL_PP(arg2))) type = T_AAAA; else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Type '%s' not supported", Z_STRVAL_PP(arg2)); RETURN_FALSE; @@ -272,9 +273,9 @@ PHP_FUNCTION(dns_check_record) #define PHP_DNS_HINFO 0x00001000 #define PHP_DNS_MX 0x00004000 #define PHP_DNS_TXT 0x00008000 - +#define PHP_DNS_AAAA 0x08000000 #define PHP_DNS_ANY 0x10000000 -#define PHP_DNS_ALL (PHP_DNS_A|PHP_DNS_NS|PHP_DNS_CNAME|PHP_DNS_SOA|PHP_DNS_PTR|PHP_DNS_HINFO|PHP_DNS_MX|PHP_DNS_TXT) +#define PHP_DNS_ALL (PHP_DNS_A|PHP_DNS_NS|PHP_DNS_CNAME|PHP_DNS_SOA|PHP_DNS_PTR|PHP_DNS_HINFO|PHP_DNS_MX|PHP_DNS_TXT|PHP_DNS_AAAA) PHP_MINIT_FUNCTION(dns) { REGISTER_LONG_CONSTANT("DNS_A", PHP_DNS_A, CONST_CS | CONST_PERSISTENT); @@ -285,6 +286,7 @@ PHP_MINIT_FUNCTION(dns) { REGISTER_LONG_CONSTANT("DNS_HINFO", PHP_DNS_HINFO, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("DNS_MX", PHP_DNS_MX, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("DNS_TXT", PHP_DNS_TXT, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("DNS_AAAA", PHP_DNS_AAAA, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("DNS_ANY", PHP_DNS_ANY, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("DNS_ALL", PHP_DNS_ALL, CONST_CS | CONST_PERSISTENT); return SUCCESS; @@ -316,6 +318,8 @@ static u_char *php_parserr(u_char *cp, querybuf *answer, int type_to_fetch, int u_short type, class, dlen; u_long ttl; long n, i; + u_short s; + u_char *tp; char name[MAXHOSTNAMELEN]; n = dn_expand(answer->qb2, answer->qb2+65536, cp, name, (sizeof(name)) - 2); @@ -416,6 +420,30 @@ static u_char *php_parserr(u_char *cp, querybuf *answer, int type_to_fetch, int GETLONG(n, cp); add_assoc_long(*subarray, "minimum-ttl", n); break; + case T_AAAA: + tp = name; + for(i=0; i < 8; i++) { + GETSHORT(s, cp); + if (s > 0) { + if (tp > (u_char *)name) { + tp[0] = ':'; + tp++; + } + sprintf(tp,"%x",s); + tp += strlen(tp); + } else if (s == 0) { + if ((tp > (u_char *)name) && (tp[-1] != ':')) { + tp[0] = ':'; + tp++; + } + } + } + if ((tp > (u_char *)name) && (tp[-1] == ':')) + tp[-1] = '\0'; + tp[0] = '\0'; + add_assoc_string(*subarray, "type", "AAAA", 1); + add_assoc_string(*subarray, "ipv6", name, 1); + break; default: cp += dlen; } @@ -480,13 +508,13 @@ PHP_FUNCTION(dns_get_record) /* Initialize the return array */ array_init(return_value); - /* - We emulate an or'ed type mask by querying type by type. (Steps 0 - 7) - * If additional info is wanted we check again with T_ANY (step 8/9) + /* - We emulate an or'ed type mask by querying type by type. (Steps 0 - 8) + * If additional info is wanted we check again with T_ANY (step 9/10) * store_results is used to skip storing the results retrieved in step - * 9 when results were already fetched. - * - In case of PHP_DNS_ANY we use the directly fetch T_ANY. (step 9) + * 10 when results were already fetched. + * - In case of PHP_DNS_ANY we use the directly fetch T_ANY. (step 10) */ - for(type = (type_param==PHP_DNS_ANY ? 9 : 0); type < (addtl_recs ? 10 : 8) || first_query; type++) + for(type = (type_param==PHP_DNS_ANY ? 10 : 0); type < (addtl_recs ? 11 : 9) || first_query; type++) { first_query = 0; switch(type) { @@ -515,10 +543,13 @@ PHP_FUNCTION(dns_get_record) type_to_fetch = type_param&PHP_DNS_TXT ? T_TXT : 0; break; case 8: + type_to_fetch = type_param&PHP_DNS_AAAA ? T_AAAA : 0; + break; + case 9: store_results = 0; continue; default: - case 9: + case 10: type_to_fetch = T_ANY; break; }