| /* | |
| * Copyright (C) Igor Sysoev | |
| */ | |
| #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 | |
| #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_connection_t *connection; | |
| struct sockaddr *sockaddr; | |
| socklen_t socklen; | |
| ngx_str_t server; | |
| ngx_log_t *log; | |
| } ngx_udp_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 { | |
| ngx_rbtree_node_t node; | |
| ngx_queue_t queue; | |
| /* PTR: resolved name, A: name to resolve */ | |
| u_char *name; | |
| u_short nlen; | |
| u_short qlen; | |
| u_char *query; | |
| union { | |
| in_addr_t addr; | |
| in_addr_t *addrs; | |
| u_char *cname; | |
| } u; | |
| u_short naddrs; | |
| u_short cnlen; | |
| time_t expire; | |
| time_t valid; | |
| ngx_resolver_ctx_t *waiting; | |
| } ngx_resolver_node_t; | |
| typedef struct { | |
| /* has to be pointer because of "incomplete type" */ | |
| ngx_event_t *event; | |
| /* TODO: DNS peers balancer */ | |
| /* STUB */ | |
| ngx_udp_connection_t *udp_connection; | |
| ngx_log_t *log; | |
| /* ident must be after 3 pointers */ | |
| ngx_int_t ident; | |
| ngx_rbtree_t name_rbtree; | |
| ngx_rbtree_node_t name_sentinel; | |
| ngx_rbtree_t addr_rbtree; | |
| ngx_rbtree_node_t addr_sentinel; | |
| ngx_queue_t name_resend_queue; | |
| ngx_queue_t addr_resend_queue; | |
| ngx_queue_t name_expire_queue; | |
| ngx_queue_t addr_expire_queue; | |
| time_t resend_timeout; | |
| time_t expire; | |
| time_t valid; | |
| ngx_uint_t log_level; | |
| } ngx_resolver_t; | |
| struct ngx_resolver_ctx_s { | |
| ngx_resolver_ctx_t *next; | |
| ngx_resolver_t *resolver; | |
| ngx_udp_connection_t *udp_connection; | |
| /* ident must be after 3 pointers */ | |
| ngx_int_t ident; | |
| ngx_int_t state; | |
| ngx_int_t type; | |
| ngx_str_t name; | |
| ngx_uint_t naddrs; | |
| in_addr_t *addrs; | |
| in_addr_t addr; | |
| /* TODO: DNS peers balancer ctx */ | |
| 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_peer_addr_t *addr); | |
| 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_ */ |