Mercurial > hg > nginx
diff src/core/ngx_resolver.h @ 1649:80901499140d
resolver
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Fri, 23 Nov 2007 17:13:26 +0000 |
parents | |
children | 1e0b028055ec |
line wrap: on
line diff
new file mode 100644 --- /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_ */