| /* | |
| * Copyright (C) Igor Sysoev | |
| * Copyright (C) Nginx, Inc. | |
| */ | |
| #include <ngx_config.h> | |
| #include <ngx_core.h> | |
| #ifndef _NGX_RESOLVER_H_INCLUDED_ | |
| #define _NGX_RESOLVER_H_INCLUDED_ | |
| #define NGX_RESOLVE_A 1 | |
| #define NGX_RESOLVE_CNAME 5 | |
| #define NGX_RESOLVE_PTR 12 | |
| #define NGX_RESOLVE_MX 15 | |
| #define NGX_RESOLVE_TXT 16 | |
| #if (NGX_HAVE_INET6) | |
| #define NGX_RESOLVE_AAAA 28 | |
| #endif | |
| #define NGX_RESOLVE_SRV 33 | |
| #define NGX_RESOLVE_DNAME 39 | |
| #define NGX_RESOLVE_FORMERR 1 | |
| #define NGX_RESOLVE_SERVFAIL 2 | |
| #define NGX_RESOLVE_NXDOMAIN 3 | |
| #define NGX_RESOLVE_NOTIMP 4 | |
| #define NGX_RESOLVE_REFUSED 5 | |
| #define NGX_RESOLVE_TIMEDOUT NGX_ETIMEDOUT | |
| #define NGX_NO_RESOLVER (void *) -1 | |
| #define NGX_RESOLVER_MAX_RECURSION 50 | |
| typedef struct ngx_resolver_s ngx_resolver_t; | |
| typedef struct { | |
| ngx_connection_t *udp; | |
| ngx_connection_t *tcp; | |
| struct sockaddr *sockaddr; | |
| socklen_t socklen; | |
| ngx_str_t server; | |
| ngx_log_t log; | |
| ngx_buf_t *read_buf; | |
| ngx_buf_t *write_buf; | |
| ngx_resolver_t *resolver; | |
| } ngx_resolver_connection_t; | |
| typedef struct ngx_resolver_ctx_s ngx_resolver_ctx_t; | |
| typedef void (*ngx_resolver_handler_pt)(ngx_resolver_ctx_t *ctx); | |
| typedef struct { | |
| struct sockaddr *sockaddr; | |
| socklen_t socklen; | |
| ngx_str_t name; | |
| u_short priority; | |
| u_short weight; | |
| } ngx_resolver_addr_t; | |
| typedef struct { | |
| ngx_str_t name; | |
| u_short priority; | |
| u_short weight; | |
| u_short port; | |
| } ngx_resolver_srv_t; | |
| typedef struct { | |
| ngx_str_t name; | |
| u_short priority; | |
| u_short weight; | |
| u_short port; | |
| ngx_resolver_ctx_t *ctx; | |
| ngx_int_t state; | |
| ngx_uint_t naddrs; | |
| ngx_addr_t *addrs; | |
| } ngx_resolver_srv_name_t; | |
| typedef struct { | |
| ngx_rbtree_node_t node; | |
| ngx_queue_t queue; | |
| /* PTR: resolved name, A: name to resolve */ | |
| u_char *name; | |
| #if (NGX_HAVE_INET6) | |
| /* PTR: IPv6 address to resolve (IPv4 address is in rbtree node key) */ | |
| struct in6_addr addr6; | |
| #endif | |
| u_short nlen; | |
| u_short qlen; | |
| u_char *query; | |
| #if (NGX_HAVE_INET6) | |
| u_char *query6; | |
| #endif | |
| union { | |
| in_addr_t addr; | |
| in_addr_t *addrs; | |
| u_char *cname; | |
| ngx_resolver_srv_t *srvs; | |
| } u; | |
| u_char code; | |
| u_short naddrs; | |
| u_short nsrvs; | |
| u_short cnlen; | |
| #if (NGX_HAVE_INET6) | |
| union { | |
| struct in6_addr addr6; | |
| struct in6_addr *addrs6; | |
| } u6; | |
| u_short naddrs6; | |
| #endif | |
| time_t expire; | |
| time_t valid; | |
| uint32_t ttl; | |
| unsigned tcp:1; | |
| #if (NGX_HAVE_INET6) | |
| unsigned tcp6:1; | |
| #endif | |
| ngx_uint_t last_connection; | |
| ngx_resolver_ctx_t *waiting; | |
| } ngx_resolver_node_t; | |
| struct ngx_resolver_s { | |
| /* has to be pointer because of "incomplete type" */ | |
| ngx_event_t *event; | |
| void *dummy; | |
| ngx_log_t *log; | |
| /* event ident must be after 3 pointers as in ngx_connection_t */ | |
| ngx_int_t ident; | |
| /* simple round robin DNS peers balancer */ | |
| ngx_array_t connections; | |
| ngx_uint_t last_connection; | |
| ngx_rbtree_t name_rbtree; | |
| ngx_rbtree_node_t name_sentinel; | |
| ngx_rbtree_t srv_rbtree; | |
| ngx_rbtree_node_t srv_sentinel; | |
| ngx_rbtree_t addr_rbtree; | |
| ngx_rbtree_node_t addr_sentinel; | |
| ngx_queue_t name_resend_queue; | |
| ngx_queue_t srv_resend_queue; | |
| ngx_queue_t addr_resend_queue; | |
| ngx_queue_t name_expire_queue; | |
| ngx_queue_t srv_expire_queue; | |
| ngx_queue_t addr_expire_queue; | |
| #if (NGX_HAVE_INET6) | |
| ngx_uint_t ipv6; /* unsigned ipv6:1; */ | |
| ngx_rbtree_t addr6_rbtree; | |
| ngx_rbtree_node_t addr6_sentinel; | |
| ngx_queue_t addr6_resend_queue; | |
| ngx_queue_t addr6_expire_queue; | |
| #endif | |
| time_t resend_timeout; | |
| time_t tcp_timeout; | |
| time_t expire; | |
| time_t valid; | |
| ngx_uint_t log_level; | |
| }; | |
| struct ngx_resolver_ctx_s { | |
| ngx_resolver_ctx_t *next; | |
| ngx_resolver_t *resolver; | |
| ngx_resolver_node_t *node; | |
| /* event ident must be after 3 pointers as in ngx_connection_t */ | |
| ngx_int_t ident; | |
| ngx_int_t state; | |
| ngx_str_t name; | |
| ngx_str_t service; | |
| time_t valid; | |
| ngx_uint_t naddrs; | |
| ngx_resolver_addr_t *addrs; | |
| ngx_resolver_addr_t addr; | |
| struct sockaddr_in sin; | |
| ngx_uint_t count; | |
| ngx_uint_t nsrvs; | |
| ngx_resolver_srv_name_t *srvs; | |
| ngx_resolver_handler_pt handler; | |
| void *data; | |
| ngx_msec_t timeout; | |
| ngx_uint_t quick; /* unsigned quick:1; */ | |
| ngx_uint_t recursion; | |
| ngx_event_t *event; | |
| }; | |
| ngx_resolver_t *ngx_resolver_create(ngx_conf_t *cf, ngx_str_t *names, | |
| ngx_uint_t n); | |
| ngx_resolver_ctx_t *ngx_resolve_start(ngx_resolver_t *r, | |
| ngx_resolver_ctx_t *temp); | |
| ngx_int_t ngx_resolve_name(ngx_resolver_ctx_t *ctx); | |
| void ngx_resolve_name_done(ngx_resolver_ctx_t *ctx); | |
| ngx_int_t ngx_resolve_addr(ngx_resolver_ctx_t *ctx); | |
| void ngx_resolve_addr_done(ngx_resolver_ctx_t *ctx); | |
| char *ngx_resolver_strerror(ngx_int_t err); | |
| #endif /* _NGX_RESOLVER_H_INCLUDED_ */ |