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