Mercurial > hg > nginx
comparison src/core/ngx_resolver.c @ 6358:5557bf31e25d stable-1.8
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 | 838946300825 |
children | dac6eda40475 |
comparison
equal
deleted
inserted
replaced
6357:838946300825 | 6358:5557bf31e25d |
---|---|
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 void ngx_resolver_read_response(ngx_event_t *rev); | 74 static void ngx_resolver_read_response(ngx_event_t *rev); |
75 static void ngx_resolver_process_response(ngx_resolver_t *r, u_char *buf, | 75 static void ngx_resolver_process_response(ngx_resolver_t *r, u_char *buf, |
649 #endif | 649 #endif |
650 | 650 |
651 ngx_rbtree_insert(&r->name_rbtree, &rn->node); | 651 ngx_rbtree_insert(&r->name_rbtree, &rn->node); |
652 } | 652 } |
653 | 653 |
654 rc = ngx_resolver_create_name_query(rn, ctx); | 654 rc = ngx_resolver_create_name_query(r, rn, &ctx->name); |
655 | 655 |
656 if (rc == NGX_ERROR) { | 656 if (rc == NGX_ERROR) { |
657 goto failed; | 657 goto failed; |
658 } | 658 } |
659 | 659 |
876 #endif | 876 #endif |
877 | 877 |
878 ngx_rbtree_insert(tree, &rn->node); | 878 ngx_rbtree_insert(tree, &rn->node); |
879 } | 879 } |
880 | 880 |
881 if (ngx_resolver_create_addr_query(rn, ctx) != NGX_OK) { | 881 if (ngx_resolver_create_addr_query(r, rn, &ctx->addr) != NGX_OK) { |
882 goto failed; | 882 goto failed; |
883 } | 883 } |
884 | 884 |
885 rn->naddrs = (u_short) -1; | 885 rn->naddrs = (u_short) -1; |
886 #if (NGX_HAVE_INET6) | 886 #if (NGX_HAVE_INET6) |
2509 | 2509 |
2510 #endif | 2510 #endif |
2511 | 2511 |
2512 | 2512 |
2513 static ngx_int_t | 2513 static ngx_int_t |
2514 ngx_resolver_create_name_query(ngx_resolver_node_t *rn, ngx_resolver_ctx_t *ctx) | 2514 ngx_resolver_create_name_query(ngx_resolver_t *r, ngx_resolver_node_t *rn, |
2515 ngx_str_t *name) | |
2515 { | 2516 { |
2516 u_char *p, *s; | 2517 u_char *p, *s; |
2517 size_t len, nlen; | 2518 size_t len, nlen; |
2518 ngx_uint_t ident; | 2519 ngx_uint_t ident; |
2519 #if (NGX_HAVE_INET6) | |
2520 ngx_resolver_t *r; | |
2521 #endif | |
2522 ngx_resolver_qs_t *qs; | 2520 ngx_resolver_qs_t *qs; |
2523 ngx_resolver_hdr_t *query; | 2521 ngx_resolver_hdr_t *query; |
2524 | 2522 |
2525 nlen = ctx->name.len ? (1 + ctx->name.len + 1) : 1; | 2523 nlen = name->len ? (1 + name->len + 1) : 1; |
2526 | 2524 |
2527 len = sizeof(ngx_resolver_hdr_t) + nlen + sizeof(ngx_resolver_qs_t); | 2525 len = sizeof(ngx_resolver_hdr_t) + nlen + sizeof(ngx_resolver_qs_t); |
2528 | 2526 |
2529 #if (NGX_HAVE_INET6) | 2527 #if (NGX_HAVE_INET6) |
2530 r = ctx->resolver; | 2528 p = ngx_resolver_alloc(r, r->ipv6 ? len * 2 : len); |
2531 | |
2532 p = ngx_resolver_alloc(ctx->resolver, r->ipv6 ? len * 2 : len); | |
2533 #else | 2529 #else |
2534 p = ngx_resolver_alloc(ctx->resolver, len); | 2530 p = ngx_resolver_alloc(r, len); |
2535 #endif | 2531 #endif |
2536 if (p == NULL) { | 2532 if (p == NULL) { |
2537 return NGX_ERROR; | 2533 return NGX_ERROR; |
2538 } | 2534 } |
2539 | 2535 |
2548 | 2544 |
2549 query = (ngx_resolver_hdr_t *) p; | 2545 query = (ngx_resolver_hdr_t *) p; |
2550 | 2546 |
2551 ident = ngx_random(); | 2547 ident = ngx_random(); |
2552 | 2548 |
2553 ngx_log_debug2(NGX_LOG_DEBUG_CORE, ctx->resolver->log, 0, | 2549 ngx_log_debug2(NGX_LOG_DEBUG_CORE, r->log, 0, |
2554 "resolve: \"%V\" A %i", &ctx->name, ident & 0xffff); | 2550 "resolve: \"%V\" A %i", name, ident & 0xffff); |
2555 | 2551 |
2556 query->ident_hi = (u_char) ((ident >> 8) & 0xff); | 2552 query->ident_hi = (u_char) ((ident >> 8) & 0xff); |
2557 query->ident_lo = (u_char) (ident & 0xff); | 2553 query->ident_lo = (u_char) (ident & 0xff); |
2558 | 2554 |
2559 /* recursion query */ | 2555 /* recursion query */ |
2579 | 2575 |
2580 len = 0; | 2576 len = 0; |
2581 p--; | 2577 p--; |
2582 *p-- = '\0'; | 2578 *p-- = '\0'; |
2583 | 2579 |
2584 if (ctx->name.len == 0) { | 2580 if (name->len == 0) { |
2585 return NGX_DECLINED; | 2581 return NGX_DECLINED; |
2586 } | 2582 } |
2587 | 2583 |
2588 for (s = ctx->name.data + ctx->name.len - 1; s >= ctx->name.data; s--) { | 2584 for (s = name->data + name->len - 1; s >= name->data; s--) { |
2589 if (*s != '.') { | 2585 if (*s != '.') { |
2590 *p = *s; | 2586 *p = *s; |
2591 len++; | 2587 len++; |
2592 | 2588 |
2593 } else { | 2589 } else { |
2619 | 2615 |
2620 query = (ngx_resolver_hdr_t *) p; | 2616 query = (ngx_resolver_hdr_t *) p; |
2621 | 2617 |
2622 ident = ngx_random(); | 2618 ident = ngx_random(); |
2623 | 2619 |
2624 ngx_log_debug2(NGX_LOG_DEBUG_CORE, ctx->resolver->log, 0, | 2620 ngx_log_debug2(NGX_LOG_DEBUG_CORE, r->log, 0, |
2625 "resolve: \"%V\" AAAA %i", &ctx->name, ident & 0xffff); | 2621 "resolve: \"%V\" AAAA %i", name, ident & 0xffff); |
2626 | 2622 |
2627 query->ident_hi = (u_char) ((ident >> 8) & 0xff); | 2623 query->ident_hi = (u_char) ((ident >> 8) & 0xff); |
2628 query->ident_lo = (u_char) (ident & 0xff); | 2624 query->ident_lo = (u_char) (ident & 0xff); |
2629 | 2625 |
2630 p += sizeof(ngx_resolver_hdr_t) + nlen; | 2626 p += sizeof(ngx_resolver_hdr_t) + nlen; |
2637 return NGX_OK; | 2633 return NGX_OK; |
2638 } | 2634 } |
2639 | 2635 |
2640 | 2636 |
2641 static ngx_int_t | 2637 static ngx_int_t |
2642 ngx_resolver_create_addr_query(ngx_resolver_node_t *rn, ngx_resolver_ctx_t *ctx) | 2638 ngx_resolver_create_addr_query(ngx_resolver_t *r, ngx_resolver_node_t *rn, |
2639 ngx_addr_t *addr) | |
2643 { | 2640 { |
2644 u_char *p, *d; | 2641 u_char *p, *d; |
2645 size_t len; | 2642 size_t len; |
2646 in_addr_t addr; | 2643 in_addr_t inaddr; |
2647 ngx_int_t n; | 2644 ngx_int_t n; |
2648 ngx_uint_t ident; | 2645 ngx_uint_t ident; |
2649 ngx_resolver_hdr_t *query; | 2646 ngx_resolver_hdr_t *query; |
2650 struct sockaddr_in *sin; | 2647 struct sockaddr_in *sin; |
2651 #if (NGX_HAVE_INET6) | 2648 #if (NGX_HAVE_INET6) |
2652 struct sockaddr_in6 *sin6; | 2649 struct sockaddr_in6 *sin6; |
2653 #endif | 2650 #endif |
2654 | 2651 |
2655 switch (ctx->addr.sockaddr->sa_family) { | 2652 switch (addr->sockaddr->sa_family) { |
2656 | 2653 |
2657 #if (NGX_HAVE_INET6) | 2654 #if (NGX_HAVE_INET6) |
2658 case AF_INET6: | 2655 case AF_INET6: |
2659 len = sizeof(ngx_resolver_hdr_t) | 2656 len = sizeof(ngx_resolver_hdr_t) |
2660 + 64 + sizeof(".ip6.arpa.") - 1 | 2657 + 64 + sizeof(".ip6.arpa.") - 1 |
2667 len = sizeof(ngx_resolver_hdr_t) | 2664 len = sizeof(ngx_resolver_hdr_t) |
2668 + sizeof(".255.255.255.255.in-addr.arpa.") - 1 | 2665 + sizeof(".255.255.255.255.in-addr.arpa.") - 1 |
2669 + sizeof(ngx_resolver_qs_t); | 2666 + sizeof(ngx_resolver_qs_t); |
2670 } | 2667 } |
2671 | 2668 |
2672 p = ngx_resolver_alloc(ctx->resolver, len); | 2669 p = ngx_resolver_alloc(r, len); |
2673 if (p == NULL) { | 2670 if (p == NULL) { |
2674 return NGX_ERROR; | 2671 return NGX_ERROR; |
2675 } | 2672 } |
2676 | 2673 |
2677 rn->query = p; | 2674 rn->query = p; |
2691 query->nns_hi = 0; query->nns_lo = 0; | 2688 query->nns_hi = 0; query->nns_lo = 0; |
2692 query->nar_hi = 0; query->nar_lo = 0; | 2689 query->nar_hi = 0; query->nar_lo = 0; |
2693 | 2690 |
2694 p += sizeof(ngx_resolver_hdr_t); | 2691 p += sizeof(ngx_resolver_hdr_t); |
2695 | 2692 |
2696 switch (ctx->addr.sockaddr->sa_family) { | 2693 switch (addr->sockaddr->sa_family) { |
2697 | 2694 |
2698 #if (NGX_HAVE_INET6) | 2695 #if (NGX_HAVE_INET6) |
2699 case AF_INET6: | 2696 case AF_INET6: |
2700 sin6 = (struct sockaddr_in6 *) ctx->addr.sockaddr; | 2697 sin6 = (struct sockaddr_in6 *) addr->sockaddr; |
2701 | 2698 |
2702 for (n = 15; n >= 0; n--) { | 2699 for (n = 15; n >= 0; n--) { |
2703 p = ngx_sprintf(p, "\1%xd\1%xd", | 2700 p = ngx_sprintf(p, "\1%xd\1%xd", |
2704 sin6->sin6_addr.s6_addr[n] & 0xf, | 2701 sin6->sin6_addr.s6_addr[n] & 0xf, |
2705 (sin6->sin6_addr.s6_addr[n] >> 4) & 0xf); | 2702 (sin6->sin6_addr.s6_addr[n] >> 4) & 0xf); |
2710 break; | 2707 break; |
2711 #endif | 2708 #endif |
2712 | 2709 |
2713 default: /* AF_INET */ | 2710 default: /* AF_INET */ |
2714 | 2711 |
2715 sin = (struct sockaddr_in *) ctx->addr.sockaddr; | 2712 sin = (struct sockaddr_in *) addr->sockaddr; |
2716 addr = ntohl(sin->sin_addr.s_addr); | 2713 inaddr = ntohl(sin->sin_addr.s_addr); |
2717 | 2714 |
2718 for (n = 0; n < 32; n += 8) { | 2715 for (n = 0; n < 32; n += 8) { |
2719 d = ngx_sprintf(&p[1], "%ud", (addr >> n) & 0xff); | 2716 d = ngx_sprintf(&p[1], "%ud", (inaddr >> n) & 0xff); |
2720 *p = (u_char) (d - &p[1]); | 2717 *p = (u_char) (d - &p[1]); |
2721 p = d; | 2718 p = d; |
2722 } | 2719 } |
2723 | 2720 |
2724 p = ngx_cpymem(p, "\7in-addr\4arpa\0", 14); | 2721 p = ngx_cpymem(p, "\7in-addr\4arpa\0", 14); |