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);