Mercurial > hg > nginx
comparison src/core/ngx_resolver.c @ 6350:a5767988c022
Resolver: changed the ngx_resolver_create_*_query() arguments.
No functional changes.
This is needed by the following change.
author | Roman Arutyunyan <arut@nginx.com> |
---|---|
date | Tue, 26 Jan 2016 16:46:48 +0300 |
parents | 978e79b95c9f |
children | 497d0cff8ace |
comparison
equal
deleted
inserted
replaced
6349:978e79b95c9f | 6350:a5767988c022 |
---|---|
62 ngx_resolver_ctx_t *ctx); | 62 ngx_resolver_ctx_t *ctx); |
63 static void ngx_resolver_expire(ngx_resolver_t *r, ngx_rbtree_t *tree, | 63 static void ngx_resolver_expire(ngx_resolver_t *r, ngx_rbtree_t *tree, |
64 ngx_queue_t *queue); | 64 ngx_queue_t *queue); |
65 static ngx_int_t ngx_resolver_send_query(ngx_resolver_t *r, | 65 static ngx_int_t ngx_resolver_send_query(ngx_resolver_t *r, |
66 ngx_resolver_node_t *rn); | 66 ngx_resolver_node_t *rn); |
67 static ngx_int_t ngx_resolver_create_name_query(ngx_resolver_node_t *rn, | 67 static ngx_int_t ngx_resolver_create_name_query(ngx_resolver_t *r, |
68 ngx_resolver_ctx_t *ctx); | 68 ngx_resolver_node_t *rn, ngx_str_t *name); |
69 static ngx_int_t ngx_resolver_create_addr_query(ngx_resolver_node_t *rn, | 69 static ngx_int_t ngx_resolver_create_addr_query(ngx_resolver_t *r, |
70 ngx_resolver_ctx_t *ctx); | 70 ngx_resolver_node_t *rn, ngx_addr_t *addr); |
71 static void ngx_resolver_resend_handler(ngx_event_t *ev); | 71 static void ngx_resolver_resend_handler(ngx_event_t *ev); |
72 static time_t ngx_resolver_resend(ngx_resolver_t *r, ngx_rbtree_t *tree, | 72 static time_t ngx_resolver_resend(ngx_resolver_t *r, ngx_rbtree_t *tree, |
73 ngx_queue_t *queue); | 73 ngx_queue_t *queue); |
74 static ngx_uint_t ngx_resolver_resend_empty(ngx_resolver_t *r); | 74 static ngx_uint_t ngx_resolver_resend_empty(ngx_resolver_t *r); |
75 static void ngx_resolver_read_response(ngx_event_t *rev); | 75 static void ngx_resolver_read_response(ngx_event_t *rev); |
654 #endif | 654 #endif |
655 | 655 |
656 ngx_rbtree_insert(&r->name_rbtree, &rn->node); | 656 ngx_rbtree_insert(&r->name_rbtree, &rn->node); |
657 } | 657 } |
658 | 658 |
659 rc = ngx_resolver_create_name_query(rn, ctx); | 659 rc = ngx_resolver_create_name_query(r, rn, &ctx->name); |
660 | 660 |
661 if (rc == NGX_ERROR) { | 661 if (rc == NGX_ERROR) { |
662 goto failed; | 662 goto failed; |
663 } | 663 } |
664 | 664 |
881 #endif | 881 #endif |
882 | 882 |
883 ngx_rbtree_insert(tree, &rn->node); | 883 ngx_rbtree_insert(tree, &rn->node); |
884 } | 884 } |
885 | 885 |
886 if (ngx_resolver_create_addr_query(rn, ctx) != NGX_OK) { | 886 if (ngx_resolver_create_addr_query(r, rn, &ctx->addr) != NGX_OK) { |
887 goto failed; | 887 goto failed; |
888 } | 888 } |
889 | 889 |
890 rn->naddrs = (u_short) -1; | 890 rn->naddrs = (u_short) -1; |
891 #if (NGX_HAVE_INET6) | 891 #if (NGX_HAVE_INET6) |
2529 | 2529 |
2530 #endif | 2530 #endif |
2531 | 2531 |
2532 | 2532 |
2533 static ngx_int_t | 2533 static ngx_int_t |
2534 ngx_resolver_create_name_query(ngx_resolver_node_t *rn, ngx_resolver_ctx_t *ctx) | 2534 ngx_resolver_create_name_query(ngx_resolver_t *r, ngx_resolver_node_t *rn, |
2535 ngx_str_t *name) | |
2535 { | 2536 { |
2536 u_char *p, *s; | 2537 u_char *p, *s; |
2537 size_t len, nlen; | 2538 size_t len, nlen; |
2538 ngx_uint_t ident; | 2539 ngx_uint_t ident; |
2539 #if (NGX_HAVE_INET6) | |
2540 ngx_resolver_t *r; | |
2541 #endif | |
2542 ngx_resolver_qs_t *qs; | 2540 ngx_resolver_qs_t *qs; |
2543 ngx_resolver_hdr_t *query; | 2541 ngx_resolver_hdr_t *query; |
2544 | 2542 |
2545 nlen = ctx->name.len ? (1 + ctx->name.len + 1) : 1; | 2543 nlen = name->len ? (1 + name->len + 1) : 1; |
2546 | 2544 |
2547 len = sizeof(ngx_resolver_hdr_t) + nlen + sizeof(ngx_resolver_qs_t); | 2545 len = sizeof(ngx_resolver_hdr_t) + nlen + sizeof(ngx_resolver_qs_t); |
2548 | 2546 |
2549 #if (NGX_HAVE_INET6) | 2547 #if (NGX_HAVE_INET6) |
2550 r = ctx->resolver; | 2548 p = ngx_resolver_alloc(r, r->ipv6 ? len * 2 : len); |
2551 | |
2552 p = ngx_resolver_alloc(ctx->resolver, r->ipv6 ? len * 2 : len); | |
2553 #else | 2549 #else |
2554 p = ngx_resolver_alloc(ctx->resolver, len); | 2550 p = ngx_resolver_alloc(r, len); |
2555 #endif | 2551 #endif |
2556 if (p == NULL) { | 2552 if (p == NULL) { |
2557 return NGX_ERROR; | 2553 return NGX_ERROR; |
2558 } | 2554 } |
2559 | 2555 |
2568 | 2564 |
2569 query = (ngx_resolver_hdr_t *) p; | 2565 query = (ngx_resolver_hdr_t *) p; |
2570 | 2566 |
2571 ident = ngx_random(); | 2567 ident = ngx_random(); |
2572 | 2568 |
2573 ngx_log_debug2(NGX_LOG_DEBUG_CORE, ctx->resolver->log, 0, | 2569 ngx_log_debug2(NGX_LOG_DEBUG_CORE, r->log, 0, |
2574 "resolve: \"%V\" A %i", &ctx->name, ident & 0xffff); | 2570 "resolve: \"%V\" A %i", name, ident & 0xffff); |
2575 | 2571 |
2576 query->ident_hi = (u_char) ((ident >> 8) & 0xff); | 2572 query->ident_hi = (u_char) ((ident >> 8) & 0xff); |
2577 query->ident_lo = (u_char) (ident & 0xff); | 2573 query->ident_lo = (u_char) (ident & 0xff); |
2578 | 2574 |
2579 /* recursion query */ | 2575 /* recursion query */ |
2599 | 2595 |
2600 len = 0; | 2596 len = 0; |
2601 p--; | 2597 p--; |
2602 *p-- = '\0'; | 2598 *p-- = '\0'; |
2603 | 2599 |
2604 if (ctx->name.len == 0) { | 2600 if (name->len == 0) { |
2605 return NGX_DECLINED; | 2601 return NGX_DECLINED; |
2606 } | 2602 } |
2607 | 2603 |
2608 for (s = ctx->name.data + ctx->name.len - 1; s >= ctx->name.data; s--) { | 2604 for (s = name->data + name->len - 1; s >= name->data; s--) { |
2609 if (*s != '.') { | 2605 if (*s != '.') { |
2610 *p = *s; | 2606 *p = *s; |
2611 len++; | 2607 len++; |
2612 | 2608 |
2613 } else { | 2609 } else { |
2639 | 2635 |
2640 query = (ngx_resolver_hdr_t *) p; | 2636 query = (ngx_resolver_hdr_t *) p; |
2641 | 2637 |
2642 ident = ngx_random(); | 2638 ident = ngx_random(); |
2643 | 2639 |
2644 ngx_log_debug2(NGX_LOG_DEBUG_CORE, ctx->resolver->log, 0, | 2640 ngx_log_debug2(NGX_LOG_DEBUG_CORE, r->log, 0, |
2645 "resolve: \"%V\" AAAA %i", &ctx->name, ident & 0xffff); | 2641 "resolve: \"%V\" AAAA %i", name, ident & 0xffff); |
2646 | 2642 |
2647 query->ident_hi = (u_char) ((ident >> 8) & 0xff); | 2643 query->ident_hi = (u_char) ((ident >> 8) & 0xff); |
2648 query->ident_lo = (u_char) (ident & 0xff); | 2644 query->ident_lo = (u_char) (ident & 0xff); |
2649 | 2645 |
2650 p += sizeof(ngx_resolver_hdr_t) + nlen; | 2646 p += sizeof(ngx_resolver_hdr_t) + nlen; |
2657 return NGX_OK; | 2653 return NGX_OK; |
2658 } | 2654 } |
2659 | 2655 |
2660 | 2656 |
2661 static ngx_int_t | 2657 static ngx_int_t |
2662 ngx_resolver_create_addr_query(ngx_resolver_node_t *rn, ngx_resolver_ctx_t *ctx) | 2658 ngx_resolver_create_addr_query(ngx_resolver_t *r, ngx_resolver_node_t *rn, |
2659 ngx_addr_t *addr) | |
2663 { | 2660 { |
2664 u_char *p, *d; | 2661 u_char *p, *d; |
2665 size_t len; | 2662 size_t len; |
2666 in_addr_t addr; | 2663 in_addr_t inaddr; |
2667 ngx_int_t n; | 2664 ngx_int_t n; |
2668 ngx_uint_t ident; | 2665 ngx_uint_t ident; |
2669 ngx_resolver_hdr_t *query; | 2666 ngx_resolver_hdr_t *query; |
2670 struct sockaddr_in *sin; | 2667 struct sockaddr_in *sin; |
2671 #if (NGX_HAVE_INET6) | 2668 #if (NGX_HAVE_INET6) |
2672 struct sockaddr_in6 *sin6; | 2669 struct sockaddr_in6 *sin6; |
2673 #endif | 2670 #endif |
2674 | 2671 |
2675 switch (ctx->addr.sockaddr->sa_family) { | 2672 switch (addr->sockaddr->sa_family) { |
2676 | 2673 |
2677 #if (NGX_HAVE_INET6) | 2674 #if (NGX_HAVE_INET6) |
2678 case AF_INET6: | 2675 case AF_INET6: |
2679 len = sizeof(ngx_resolver_hdr_t) | 2676 len = sizeof(ngx_resolver_hdr_t) |
2680 + 64 + sizeof(".ip6.arpa.") - 1 | 2677 + 64 + sizeof(".ip6.arpa.") - 1 |
2687 len = sizeof(ngx_resolver_hdr_t) | 2684 len = sizeof(ngx_resolver_hdr_t) |
2688 + sizeof(".255.255.255.255.in-addr.arpa.") - 1 | 2685 + sizeof(".255.255.255.255.in-addr.arpa.") - 1 |
2689 + sizeof(ngx_resolver_qs_t); | 2686 + sizeof(ngx_resolver_qs_t); |
2690 } | 2687 } |
2691 | 2688 |
2692 p = ngx_resolver_alloc(ctx->resolver, len); | 2689 p = ngx_resolver_alloc(r, len); |
2693 if (p == NULL) { | 2690 if (p == NULL) { |
2694 return NGX_ERROR; | 2691 return NGX_ERROR; |
2695 } | 2692 } |
2696 | 2693 |
2697 rn->query = p; | 2694 rn->query = p; |
2711 query->nns_hi = 0; query->nns_lo = 0; | 2708 query->nns_hi = 0; query->nns_lo = 0; |
2712 query->nar_hi = 0; query->nar_lo = 0; | 2709 query->nar_hi = 0; query->nar_lo = 0; |
2713 | 2710 |
2714 p += sizeof(ngx_resolver_hdr_t); | 2711 p += sizeof(ngx_resolver_hdr_t); |
2715 | 2712 |
2716 switch (ctx->addr.sockaddr->sa_family) { | 2713 switch (addr->sockaddr->sa_family) { |
2717 | 2714 |
2718 #if (NGX_HAVE_INET6) | 2715 #if (NGX_HAVE_INET6) |
2719 case AF_INET6: | 2716 case AF_INET6: |
2720 sin6 = (struct sockaddr_in6 *) ctx->addr.sockaddr; | 2717 sin6 = (struct sockaddr_in6 *) addr->sockaddr; |
2721 | 2718 |
2722 for (n = 15; n >= 0; n--) { | 2719 for (n = 15; n >= 0; n--) { |
2723 p = ngx_sprintf(p, "\1%xd\1%xd", | 2720 p = ngx_sprintf(p, "\1%xd\1%xd", |
2724 sin6->sin6_addr.s6_addr[n] & 0xf, | 2721 sin6->sin6_addr.s6_addr[n] & 0xf, |
2725 (sin6->sin6_addr.s6_addr[n] >> 4) & 0xf); | 2722 (sin6->sin6_addr.s6_addr[n] >> 4) & 0xf); |
2730 break; | 2727 break; |
2731 #endif | 2728 #endif |
2732 | 2729 |
2733 default: /* AF_INET */ | 2730 default: /* AF_INET */ |
2734 | 2731 |
2735 sin = (struct sockaddr_in *) ctx->addr.sockaddr; | 2732 sin = (struct sockaddr_in *) addr->sockaddr; |
2736 addr = ntohl(sin->sin_addr.s_addr); | 2733 inaddr = ntohl(sin->sin_addr.s_addr); |
2737 | 2734 |
2738 for (n = 0; n < 32; n += 8) { | 2735 for (n = 0; n < 32; n += 8) { |
2739 d = ngx_sprintf(&p[1], "%ud", (addr >> n) & 0xff); | 2736 d = ngx_sprintf(&p[1], "%ud", (inaddr >> n) & 0xff); |
2740 *p = (u_char) (d - &p[1]); | 2737 *p = (u_char) (d - &p[1]); |
2741 p = d; | 2738 p = d; |
2742 } | 2739 } |
2743 | 2740 |
2744 p = ngx_cpymem(p, "\7in-addr\4arpa\0", 14); | 2741 p = ngx_cpymem(p, "\7in-addr\4arpa\0", 14); |