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;
#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);
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;
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);
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;
}
/* 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) {
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;
}