diff options
author | Igor Sysoev <igor@sysoev.ru> | 2007-11-23 20:13:26 +0300 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2007-11-23 20:13:26 +0300 |
commit | cb4d53861c0722ee6dc7da0753c90a41152260ab (patch) | |
tree | f98075d0b59f9e99f6c6276fd117c03e3244b7c1 /src/core/ngx_resolver.h | |
parent | 2e8f0d0b302758ebb08961d0ad632fdd4e35e837 (diff) |
resolver
Diffstat (limited to 'src/core/ngx_resolver.h')
-rw-r--r-- | src/core/ngx_resolver.h | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/src/core/ngx_resolver.h b/src/core/ngx_resolver.h new file mode 100644 index 000000000..e69f42087 --- /dev/null +++ b/src/core/ngx_resolver.h @@ -0,0 +1,142 @@ + +/* + * 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_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 + + +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_event_t *event; +}; + + +ngx_resolver_t *ngx_resolver_create(ngx_peer_addr_t *addr, ngx_log_t *log); +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); +void *ngx_resolver_calloc(ngx_resolver_t *r, size_t size); +char *ngx_resolver_strerror(ngx_int_t err); + + +#endif /* _NGX_RESOLVER_H_INCLUDED_ */ |