acl  3.5.3.0
acl_dns.h
浏览该文件的文档.
1 #ifndef ACL_DNS_INCLUDE_H
2 #define ACL_DNS_INCLUDE_H
3 
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7 
8 #include "../stdlib/acl_define.h"
9 #include "../stdlib/acl_htable.h"
10 #include "../stdlib/acl_cache2.h"
11 #ifdef ACL_UNIX
12 #include <netinet/in.h>
13 #include <arpa/inet.h>
14 #endif
15 #include "../event/acl_events.h"
16 #include "../aio/acl_aio.h"
17 #include "acl_rfc1035.h"
18 #include "acl_sane_inet.h"
19 #include "acl_netdb.h"
20 
21 /* DNS 查询时的错误码定义 */
22 
23 #define ACL_DNS_OK 0
24 #define ACL_DNS_OK_CACHE 1
25 #define ACL_DNS_ERR_FMT -1
26 #define ACL_DNS_ERR_SVR -2
27 #define ACL_DNS_ERR_NO_EXIST -3
28 #define ACL_DNS_ERR_NO_SUPPORT -4
29 #define ACL_DNS_ERR_DENY -5
30 #define ACL_DNS_ERR_YX -6
31 #define ACL_DNS_ERR_YXRR -7
32 #define ACL_DNS_ERR_NXRR -8
33 #define ACL_DNS_ERR_NO_AUTH -9
34 #define ACL_DNS_ERR_NOT_ZONE -10
35 #define ACL_DNS_ERR_UNPACK -15
36 #define ACL_DNS_ERR_TIMEOUT -16
37 #define ACL_DNS_ERR_EXIST -17
38 #define ACL_DNS_ERR_BUILD_REQ -18
39 
40 typedef struct ACL_DNS_ADDR {
41  char ip[64]; /* DNS 服务器地址 */
42  unsigned short port; /* DNS 服务器端口 */
43  ACL_SOCKADDR addr; /* DNS 地址 */
44  int addr_len; /* addr 大小 */
45  int mask_length; /* DNS 服务器所在网络的掩码长度(> 0 && < 32) */
46  struct in_addr in; /* addr 的网段地址 */
47 } ACL_DNS_ADDR;
48 
49 typedef struct ACL_DNS {
50  ACL_AIO *aio; /* 异步IO句柄 */
51  unsigned short qid; /* 发送请求的ID标识号 */
52  ACL_ASTREAM *astream; /* 异步流 */
53 
54  ACL_ARRAY *groups; /* 域名组列表 */
55  ACL_ARRAY *dns_list; /* DNS 服务器地址列表 */
56  unsigned dns_idx; /* 当前使用的 dns_list 数组下标 */
57  ACL_DNS_ADDR addr_from; /* 来源 DNS 地址 */
58  ACL_HTABLE *lookup_table; /* 查询对象表 */
59  ACL_CACHE2 *dns_cache; /* 用于缓存DNS查询结果 */
60  int timeout; /* 每次查询的超时时间值(秒) */
61  int retry_limit; /* 查询超时时重试的次数限制 */
62  unsigned int flag; /* 标志位 */
63 #define ACL_DNS_FLAG_ALLOC (1 << 0) /* 该异步句柄是动态分配的 */
64 #define ACL_DNS_FLAG_CHECK_DNS_IP (1 << 1) /* 检查DNS地址是否匹配 */
65 #define ACL_DNS_FLAG_CHECK_DNS_NET (1 << 2) /* 检查DNS网络是否匹配 */
66 
67  /* 该函数指针用来避免动态加载库的访问地址不一致问题 */
69 } ACL_DNS;
70 
71 typedef struct ACL_DNS_REQ ACL_DNS_REQ;
72 
73 /**
74  * 初始化DNS异步查询对象结构
75  * @param dns {ACL_DNS*} DNS异步查询句柄
76  * @param aio {ACL_AIO*} 异步句柄
77  * @param timeout {int} 每次DNS查询时的超时值
78  * @return {int} 初始化是否成功,返回 0 表示成功,-1 表示失败
79  */
80 ACL_API int acl_dns_init(ACL_DNS *dns, ACL_AIO *aio, int timeout);
81 
82 /**
83  * 创建一个DNS异步查询对象并同时进行初始化
84  * @param aio {ACL_AIO*} 异步句柄
85  * @param timeout {int} 每次DNS查询时的超时值
86  * @return {ACL_DNS*} DNS异步查询句柄,返回 NULL 表示创建 DNS 查询对象失败
87  */
88 ACL_API ACL_DNS *acl_dns_create(ACL_AIO *aio, int timeout);
89 
90 /**
91  * 打开DNS缓存机制
92  * @param dns {ACL_DNS*} DNS异步查询句柄
93  * @param limit {int} DNS 缓存中最大缓存条目
94  */
95 ACL_API void acl_dns_open_cache(ACL_DNS *dns, int limit);
96 
97 /**
98  * 添加一个DNS服务器地址
99  * @param dns {ACL_DNS*} DNS异步查询句柄
100  * @param dns_ip {const char*} DNS服务器IP地址
101  * @param dns_port {unsigned short} DNS服务器端口
102  * @param mask_length {int} DNS服务器所在的网段掩码长度(0 < && < 32)
103  */
104 ACL_API void acl_dns_add_dns(ACL_DNS *dns, const char *dns_ip,
105  unsigned short dns_port, int mask_length);
106 
107 /**
108  * 清除 DNS 服务器地址列表
109  * @param dns {ACL_DNS*} DNS异步查询句柄
110  */
111 ACL_API void acl_dns_clear_dns(ACL_DNS *dns);
112 
113 /**
114  * 获得 DNS 对象数组列表
115  * @param dns {ACL_DNS*} DNS异步查询句柄
116  * @return {ACL_ARRAY*} 容纳 ACL_DNS_ADDR 对象的数组对象,返回值永远非 NULL
117  */
118 ACL_API ACL_ARRAY *acl_dns_list(ACL_DNS *dns);
119 
120 /**
121  * 获得 DNS 服务器地址列表的数量
122  * @param dns {ACL_DNS*} DNS异步查询句柄
123  * @return {size_t}
124  */
125 ACL_API size_t acl_dns_size(ACL_DNS *dns);
126 
127 /**
128  * 判断 DNS 服务器地址列表是否为空
129  * @param dns {ACL_DNS*} DNS异步查询句柄
130  * @retrn {int} 返回值非 0 表示为空
131  */
132 ACL_API int acl_dns_empty(ACL_DNS *dns);
133 
134 /**
135  * 删除一个DNS服务器地址
136  * @param dns {ACL_DNS*} DNS异步查询句柄
137  * @param ip {const char*} DNS服务器IP地址
138  * @param port {unsigned short} DNS服务器端口
139  */
140 ACL_API void acl_dns_del_dns(ACL_DNS *dns, const char *ip, unsigned short port);
141 
142 /**
143  * 关闭异步查询句柄同时释放所有资源
144  * @param dns {ACL_DNS*} DNS异步查询句柄
145  */
146 ACL_API void acl_dns_close(ACL_DNS *dns);
147 
148 /**
149  * 设置标志位,检查DNS来源IP地址是否与目标地址相同,若不同则丢弃所读的
150  * 数据包,主要是为了防止DNS查询时的UDP攻击
151  * @param dns {ACL_DNS*} DNS异步查询句柄
152  */
153 ACL_API void acl_dns_check_dns_ip(ACL_DNS *dns);
154 
155 /**
156  * 设置标志位,检查DNS来源IP所在网段是否与目标网段相同,若不同则丢弃
157  * 所读的数据包,主要是为了防止DNS查询时的UDP攻击
158  * @param dns {ACL_DNS*} DNS异步查询句柄
159  */
160 ACL_API void acl_dns_check_dns_net(ACL_DNS *dns);
161 
162 /**
163  * 设置DNS查询超时时重试次数
164  * @param dns {ACL_DNS*} DNS异步查询句柄
165  * @param retry_limit {int} 重试次数
166  */
167 ACL_API void acl_dns_set_retry_limit(ACL_DNS *dns, int retry_limit);
168 
169 /**
170  * 异步查询一个域所对应的A记录IP地址集合
171  * @param dns {ACL_DNS*} DNS异步查询句柄
172  * @param domain {const char*} 域名
173  * @param callback {void (*)(ACL_DNS_DB*, void*, int, const ACL_RFC1035_MESSAGE*)}
174  * 查询成功或失败的回调函数, 若返回给 callback 的 ACL_DNS_DB 为空则表示查询失败,
175  * 第二个参数为用户设置的参数, 第三个参数为查询失败时的错误号
176  * @param ctx {void*} callback 的参数之一
177  */
178 ACL_API void acl_dns_lookup(ACL_DNS *dns, const char *domain,
179  void (*callback)(ACL_DNS_DB*, void*, int, const ACL_RFC1035_MESSAGE*),
180  void *ctx);
181 
182 /**
183  * 异步查询一个域所对应的记录类型的IP地址集合
184  * @param dns {ACL_DNS*} DNS异步查询句柄
185  * @param domain {const char*} 域名
186  * @param type {unsigned short} 查询类型,参见 acl_rfc1035.h 中的 ACL_RFC1035_TYPE_XXX
187  * @param callback {void (*)(ACL_DNS_DB*, void*, int, const ACL_RFC1035_MESSAGE*)}
188  * 查询成功或失败的回调函数, 若返回给 callback 的 ACL_DNS_DB 为空则表示查询失败,
189  * 第二个参数为用户设置的参数, 第三个参数为查询失败时的错误号
190  * @param ctx {void*} callback 的参数之一
191  */
192 ACL_API void acl_dns_lookup2(ACL_DNS *dns, const char *domain, unsigned short type,
193  void (*callback)(ACL_DNS_DB*, void*, int, const ACL_RFC1035_MESSAGE*),
194  void *ctx);
195 
196 /**
197  * 向DNS查询对象中添加静态主机信息
198  * @param dns {ACL_DNS*} DNS异步查询句柄
199  * @param domain {const char*} 域名
200  * @param ip_list {const char*} IP地址列表,分隔符为 ';',如: 192.168.0.1;192.168.0.2
201  */
202 ACL_API void acl_dns_add_host(ACL_DNS *dns, const char *domain, const char *ip_list);
203 
204 /**
205  * 向DNS查询对象中添加查询域名组信息
206  * @param dns {ACL_DNS*} DNS异步查询句柄
207  * @param group {const char*} 域名组名,如: .test.com, 则 a.test.com, b.test.com
208  * 都属于 .test.com 域名组
209  * @param ip_list {const char*} 如果非空则采用静态方式添加IP地址列表
210  * @param refer {const char*} 域名组的代表域名, 将会用此域名代表整个域名组去做DNS查询
211  * @param excepts {ACL_ARGV*} 虽然这些域名属于 group 的子域名但却不属于其域名组的
212  * 成员集合
213  */
214 ACL_API void acl_dns_add_group(ACL_DNS *dns, const char *group, const char *refer,
215  const char *ip_list, const char *excepts);
216 /**
217  * 取消某个查询事件对象
218  * @param handle {ACL_DNS_REQ*} 某次域名查询事件
219  */
220 ACL_API void acl_dns_cancel(ACL_DNS_REQ *handle);
221 
222 /**
223  * 根据错误号得到错误描述信息
224  * @param errnum {int} DNS查询时返回的错误号
225  * @return {const char*} 错误描述信息
226  */
227 ACL_API const char *acl_dns_serror(int errnum);
228 
229 #ifdef __cplusplus
230 }
231 #endif
232 
233 #endif
234 
ACL_API void acl_dns_add_dns(ACL_DNS *dns, const char *dns_ip, unsigned short dns_port, int mask_length)
ACL_API void acl_dns_cancel(ACL_DNS_REQ *handle)
ACL_ARRAY * dns_list
Definition: acl_dns.h:55
ACL_AIO * aio
Definition: acl_dns.h:50
struct ACL_DNS_REQ ACL_DNS_REQ
Definition: acl_dns.h:71
ACL_SOCKADDR addr
Definition: acl_dns.h:43
int mask_length
Definition: acl_dns.h:45
int addr_len
Definition: acl_dns.h:44
ACL_API void acl_dns_clear_dns(ACL_DNS *dns)
ACL_API void acl_dns_del_dns(ACL_DNS *dns, const char *ip, unsigned short port)
ACL_ARRAY * groups
Definition: acl_dns.h:54
ACL_API void acl_dns_lookup(ACL_DNS *dns, const char *domain, void(*callback)(ACL_DNS_DB *, void *, int, const ACL_RFC1035_MESSAGE *), void *ctx)
ACL_CACHE2 * dns_cache
Definition: acl_dns.h:59
ACL_API const char * acl_dns_serror(int errnum)
ACL_API void acl_dns_check_dns_net(ACL_DNS *dns)
ACL_API ACL_ARRAY * acl_dns_list(ACL_DNS *dns)
ACL_API void acl_dns_add_group(ACL_DNS *dns, const char *group, const char *refer, const char *ip_list, const char *excepts)
ACL_API size_t acl_dns_size(ACL_DNS *dns)
struct ACL_AIO ACL_AIO
Definition: acl_aio.h:31
ACL_API void acl_dns_lookup2(ACL_DNS *dns, const char *domain, unsigned short type, void(*callback)(ACL_DNS_DB *, void *, int, const ACL_RFC1035_MESSAGE *), void *ctx)
ACL_API int acl_dns_empty(ACL_DNS *dns)
ACL_ASTREAM * astream
Definition: acl_dns.h:52
struct in_addr in
Definition: acl_dns.h:46
ACL_API ACL_DNS * acl_dns_create(ACL_AIO *aio, int timeout)
ACL_HTABLE * lookup_table
Definition: acl_dns.h:58
ACL_API void acl_dns_set_retry_limit(ACL_DNS *dns, int retry_limit)
char ip[64]
Definition: acl_dns.h:41
struct ACL_DNS ACL_DNS
int timeout
Definition: acl_dns.h:60
ACL_API void acl_dns_close(ACL_DNS *dns)
ACL_API void acl_dns_add_host(ACL_DNS *dns, const char *domain, const char *ip_list)
ACL_API void acl_dns_open_cache(ACL_DNS *dns, int limit)
unsigned dns_idx
Definition: acl_dns.h:56
ACL_DNS_ADDR addr_from
Definition: acl_dns.h:57
struct ACL_DNS_ADDR ACL_DNS_ADDR
ACL_EVENT_NOTIFY_TIME lookup_timeout
Definition: acl_dns.h:68
unsigned short port
Definition: acl_dns.h:42
ACL_API void acl_dns_check_dns_ip(ACL_DNS *dns)
unsigned short qid
Definition: acl_dns.h:51
int retry_limit
Definition: acl_dns.h:61
void(* ACL_EVENT_NOTIFY_TIME)(int event_type, ACL_EVENT *event, void *context)
Definition: acl_events.h:56
ACL_API int acl_dns_init(ACL_DNS *dns, ACL_AIO *aio, int timeout)
unsigned int flag
Definition: acl_dns.h:62