Nginx-Perl
view release on metacpan or search on metacpan
src/core/ngx_resolver.c view on Meta::CPAN
}
if (ngx_strcasecmp(&buf[i], (u_char *) "\7in-addr\4arpa") == 0) {
i += sizeof("\7in-addr\4arpa");
/* lock addr mutex */
rn = ngx_resolver_lookup_addr(r, addr);
tree = &r->addr_rbtree;
expire_queue = &r->addr_expire_queue;
addr = htonl(addr);
name.len = ngx_inet_ntop(AF_INET, &addr, text, NGX_SOCKADDR_STRLEN);
name.data = text;
goto valid;
}
invalid_in_addr_arpa:
#if (NGX_HAVE_INET6)
i = sizeof(ngx_resolver_hdr_t);
for (octet = 15; octet >= 0; octet--) {
if (buf[i++] != '\1') {
goto invalid_ip6_arpa;
}
digit = ngx_hextoi(&buf[i++], 1);
if (digit == NGX_ERROR) {
goto invalid_ip6_arpa;
}
addr6.s6_addr[octet] = (u_char) digit;
if (buf[i++] != '\1') {
goto invalid_ip6_arpa;
}
digit = ngx_hextoi(&buf[i++], 1);
if (digit == NGX_ERROR) {
goto invalid_ip6_arpa;
}
addr6.s6_addr[octet] += (u_char) (digit * 16);
}
if (ngx_strcasecmp(&buf[i], (u_char *) "\3ip6\4arpa") == 0) {
i += sizeof("\3ip6\4arpa");
/* lock addr mutex */
hash = ngx_crc32_short(addr6.s6_addr, 16);
rn = ngx_resolver_lookup_addr6(r, &addr6, hash);
tree = &r->addr6_rbtree;
expire_queue = &r->addr6_expire_queue;
name.len = ngx_inet6_ntop(addr6.s6_addr, text, NGX_SOCKADDR_STRLEN);
name.data = text;
goto valid;
}
invalid_ip6_arpa:
#endif
ngx_log_error(r->log_level, r->log, 0,
"invalid in-addr.arpa or ip6.arpa name in DNS response");
return;
valid:
if (rn == NULL || rn->query == NULL) {
ngx_log_error(r->log_level, r->log, 0,
"unexpected response for %V", &name);
goto failed;
}
qident = (rn->query[0] << 8) + rn->query[1];
if (ident != qident) {
ngx_log_error(r->log_level, r->log, 0,
"wrong ident %ui response for %V, expect %ui",
ident, &name, qident);
goto failed;
}
if (code == 0 && nan == 0) {
code = NGX_RESOLVE_NXDOMAIN;
}
if (code) {
next = rn->waiting;
rn->waiting = NULL;
ngx_queue_remove(&rn->queue);
ngx_rbtree_delete(tree, &rn->node);
/* unlock addr mutex */
while (next) {
ctx = next;
ctx->state = code;
next = ctx->next;
ctx->handler(ctx);
}
ngx_resolver_free_node(r, rn);
return;
}
i += sizeof(ngx_resolver_qs_t);
if (i + 2 + sizeof(ngx_resolver_an_t) >= n) {
goto short_response;
( run in 0.597 second using v1.01-cache-2.11-cpan-39bf76dae61 )