acl  3.5.3.0
acl_netdb.h
浏览该文件的文档.
1 #ifndef ACL_NETDB_INCLUDE_H
2 #define ACL_NETDB_INCLUDE_H
3 
4 #include "../stdlib/acl_define.h"
5 
6 #ifdef ACL_UNIX
7 #include <netinet/in.h>
8 #endif
9 
10 #include "../stdlib/acl_array.h"
11 #include "acl_sane_inet.h"
12 
13 /**
14  * 主机地址结构
15  */
16 typedef struct ACL_HOSTNAME ACL_HOST_INFO;
17 typedef struct ACL_HOSTNAME {
18  char ip[256]; /**< hold ip or cname of the HOST */
19  ACL_SOCKADDR saddr; /**< ip addr in ACL_SOCKADDR */
20  unsigned int ttl; /**< the HOST's ip timeout(second) */
21  int priority; /**< the priority of mx record */
22  int hport;
23  unsigned int nrefer; /**< refer number to this HOST */
24  unsigned int type; /**< the content type in ip buf */
25 #define ACL_HOSTNAME_TYPE_IPV4 0
26 #define ACL_HOSTNAME_TYPE_IPV6 1
27 #define ACL_HOSTNAME_TYPE_CNAME 2
28 #define ACL_HOSTNAME_TYPE_MX 3
29 #define ACL_HOSTNAME_TYPE_SOA 4
30 #define ACL_HOSTNAME_TYPE_NS 5
31 #define ACL_HOSTNAME_TYPE_TXT 6
32 } ACL_HOSTNAME;
33 
34 /**
35  * DNS查询结果集
36  */
37 typedef struct ACL_DNS_DB {
39  int size;
40  char name[256];
41  const ACL_HOSTNAME *refer; /**< refer to the cname node in h_db */
43 
44  /* for acl_iterator */
45 
46  /* 取迭代器头函数 */
47  const ACL_HOSTNAME *(*iter_head)(ACL_ITER*, struct ACL_DNS_DB*);
48  /* 取迭代器下一个函数 */
49  const ACL_HOSTNAME *(*iter_next)(ACL_ITER*, struct ACL_DNS_DB*);
50  /* 取迭代器尾函数 */
51  const ACL_HOSTNAME *(*iter_tail)(ACL_ITER*, struct ACL_DNS_DB*);
52  /* 取迭代器上一个函数 */
53  const ACL_HOSTNAME *(*iter_prev)(ACL_ITER*, struct ACL_DNS_DB*);
54  /* 取迭代器关联的当前容器成员结构对象 */
55  const ACL_HOSTNAME *(*iter_info)(ACL_ITER*, struct ACL_DNS_DB*);
56 } ACL_DNS_DB;
57 
58 /* in acl_netdb.c */
59 
60 /**
61  * 从结果集中取得某个下标位置的主机地址结构
62  * @param h_dns_db {const ACL_DNS_DB*} DNS结果集
63  * @param i {int} 下标位置
64  * @return {const ACL_HOSTNAME*} 返回相应下标的主机地址结构
65  */
66 ACL_API const ACL_HOSTNAME *acl_netdb_index(const ACL_DNS_DB *h_dns_db, int i);
67 
68 /**
69  * 从结果集中取得某个下标位置的主机IP地址
70  * @param h_dns_db {const ACL_DNS_DB*} DNS结果集
71  * @param i {int} 下标位置
72  * @return {const ACL_SOCKADDR*} IP地址结构, NULL表示失败
73  */
74 ACL_API const ACL_SOCKADDR *acl_netdb_index_saddr(ACL_DNS_DB *h_dns_db, int i);
75 
76 /**
77  * 将结果集中的对应某个下标的主机地址引用增加
78  * @param h_dns_db {const ACL_DNS_DB*} DNS结果集
79  * @param i {int} 下标位置
80  * @param n {int} 需要增加的引用值
81  */
82 ACL_API void acl_netdb_refer_oper(ACL_DNS_DB *h_dns_db, int i, int n);
83 
84 /**
85  * 将结果集中的对应某个下标的主机地址引用加1
86  * @param h_dns_db {const ACL_DNS_DB*} DNS结果集
87  * @param i {int} 下标位置
88  */
89 ACL_API void acl_netdb_refer(ACL_DNS_DB *h_dns_db, int i);
90 
91 /**
92  * 将结果集中的对应某个下标的主机地址引用减1
93  * @param h_dns_db {const ACL_DNS_DB*} DNS结果集
94  * @param i {int} 下标位置
95  */
96 ACL_API void acl_netdb_unrefer(ACL_DNS_DB *h_dns_db, int i);
97 
98 /**
99  * 将结果集中的对应某个下标的IP地址,以字符串表示
100  * @param h_dns_db {const ACL_DNS_DB*} DNS结果集
101  * @param i {int} 下标位置
102  * @return {const char*} 查得的结果,NULL 表示失败
103  */
104 ACL_API const char *acl_netdb_index_ip(const ACL_DNS_DB *h_dns_db, int i);
105 
106 /**
107  * 取得结果集中主机地址的个数
108  * @param h_dns_db {const ACL_DNS_DB*} DNS结果集
109  * @return {int} 主机地址个数 > 0, -1 表示参数输入有误
110  */
111 ACL_API int acl_netdb_size(const ACL_DNS_DB *h_dns_db);
112 
113 /**
114  * 释放结果集内存资源
115  * @param h_dns_db {ACL_DNS_DB*} DNS结果集
116  */
117 ACL_API void acl_netdb_free(ACL_DNS_DB *h_dns_db);
118 
119 /**
120  * 根据域名创建一个查询结果集的结构,但并不进行DNS查询
121  * @param domain {const char*} 要查询的域名
122  * @return {ACL_DNS_DB*} 创建的结果集对象
123  */
124 ACL_API ACL_DNS_DB *acl_netdb_new(const char *domain);
125 
126 /**
127  * 设置该 DNS 查询对象所绑定的 DNS 服务器地址
128  * @param db {ACL_DNS_DB*} 由 acl_netdb_new 或 acl_netdb_clone 创建
129  * @param sa {ACL_SOCKADDR*} DNS 服务器地址
130  */
131 ACL_API void acl_netdb_set_ns(ACL_DNS_DB *db, ACL_SOCKADDR *sa);
132 
133 /**
134  * 向结果集中添加IP地址
135  * @param h_dns_db {ACL_DNS_DB*} 查询结果集对象
136  * @param ip {const char*} 要添加的IP地址
137  */
138 ACL_API void acl_netdb_addip(ACL_DNS_DB *h_dns_db, const char *ip);
139 
140 /**
141  * 向结果集中添加IP地址及端口号
142  * @param h_dns_db {ACL_DNS_DB*} 查询结果集对象
143  * @param ip {const char*} 要添加的IP地址
144  * @param port {int} 要添加的端口号
145  */
146 ACL_API void acl_netdb_add_addr(ACL_DNS_DB *h_dns_db, const char *ip, int port);
147 
148 /**
149  * 克隆一个查询结果集对象
150  * @param h_dns_db {const ACL_DNS_DB*} 源结果集对象
151  * @return {ACL_DNS_DB*} 新克隆的结果集对象
152  */
153 ACL_API ACL_DNS_DB *acl_netdb_clone(const ACL_DNS_DB *h_dns_db);
154 
155 /**
156  * 查询某个域名的IP地址集
157  * @param name {const char*} 域名
158  * @param h_error {int*} 如果查询失败存储出错原因
159  * @return {ACL_DNS_DB*} 查询结果集, 如果为NULL则查询失败, 另外,即使返回不为空,
160  * 也得需要通过 acl_netdb_size()/1 获得结果集的数组长度
161  */
162 ACL_API ACL_DNS_DB *acl_gethostbyname(const char *name, int *h_error);
163 
164 /**
165  * 查询某个域名的IP地址集
166  * @param name {const char*} 域名
167  * @param socktype {int} 查询域名服务器所采用的 socket 类型:
168  * SOCK_DGRAM -- UDP 方式, SOCK_STREAM -- TCP 方式
169  * @param family {int} IP 地址簇类型:PF_INET -- IPV4, PF_INET6 -- IPV6,
170  * PF_UNSPEC -- 由系统自动选择
171  * @param h_error {int*} 如果查询失败存储出错原因
172  * @return {ACL_DNS_DB*} 查询结果集, 如果为NULL则查询失败, 另外,即使返回不为空,
173  * 也得需要通过 acl_netdb_size()/1 获得结果集的数组长度
174  */
175 ACL_API ACL_DNS_DB *acl_gethostbyname2(const char *name, int socktype,
176  int family, int *h_error);
177 
178 /**
179  * 根据错误号获得出错提示信息
180  * @param errnum {int} 错误号
181  * @return {const char*} 出错信息
182  */
183 ACL_API const char *acl_netdb_strerror(int errnum);
184 
185 /* in acl_netdb_cache.c */
186 /**
187  * 向DNS缓存中添加缓存数据
188  * @param h_dns_db {const ACL_DNS_DB*} DNS查询结果集
189  * @param timeout {int} 该结果集被缓存的超时时间,如果 <= 0, 则采用默认的值,
190  * 该默认值是在 acl_netdb_cache_init()/2 中的设置值, 单位为秒
191  */
192 ACL_API void acl_netdb_cache_push(const ACL_DNS_DB *h_dns_db, int timeout);
193 
194 /**
195  * 从DNS缓存中取得DNS查询结果集
196  * @param name {const char*} 域名
197  * @return {ACL_DNS_DB*} DNS查询结果集
198  */
199 ACL_API ACL_DNS_DB *acl_netdb_cache_lookup(const char *name);
200 
201 /**
202  * 从DNS缓存中删除某个DNS查询结果集
203  * @param name {const char*} 域名
204  */
205 ACL_API void acl_netdb_cache_del_host(const char *name);
206 
207 /**
208  * 初始化DNS缓存区
209  * @param timeout {int} DNS结果集的默认缓存时间(秒)
210  * @param thread_safe {int} 是否需要DNS缓存区线程安全, 0: 表示不需要,
211  * 1: 表示需要线程安全
212  */
213 ACL_API void acl_netdb_cache_init(int timeout, int thread_safe);
214 
215 #endif
ACL_API void acl_netdb_free(ACL_DNS_DB *h_dns_db)
ACL_API void acl_netdb_cache_init(int timeout, int thread_safe)
struct ACL_DNS_DB ACL_DNS_DB
ACL_API const char * acl_netdb_strerror(int errnum)
HTTP_API void const char * name
Definition: lib_http.h:620
ACL_API ACL_DNS_DB * acl_netdb_clone(const ACL_DNS_DB *h_dns_db)
ACL_API const char * acl_netdb_index_ip(const ACL_DNS_DB *h_dns_db, int i)
char name[256]
Definition: acl_netdb.h:40
unsigned int nrefer
Definition: acl_netdb.h:23
ACL_API void acl_netdb_unrefer(ACL_DNS_DB *h_dns_db, int i)
ACL_API ACL_DNS_DB * acl_gethostbyname2(const char *name, int socktype, int family, int *h_error)
ACL_API void acl_netdb_addip(ACL_DNS_DB *h_dns_db, const char *ip)
ACL_API void acl_netdb_cache_del_host(const char *name)
ACL_API void acl_netdb_refer(ACL_DNS_DB *h_dns_db, int i)
ACL_SOCKADDR ns_addr
Definition: acl_netdb.h:42
ACL_API void acl_netdb_set_ns(ACL_DNS_DB *db, ACL_SOCKADDR *sa)
unsigned int type
Definition: acl_netdb.h:24
ACL_API ACL_DNS_DB * acl_gethostbyname(const char *name, int *h_error)
ACL_ARRAY * h_db
Definition: acl_netdb.h:38
ACL_API const ACL_HOSTNAME * acl_netdb_index(const ACL_DNS_DB *h_dns_db, int i)
ACL_SOCKADDR saddr
Definition: acl_netdb.h:19
ACL_API ACL_DNS_DB * acl_netdb_new(const char *domain)
int size
Definition: acl_netdb.h:39
ACL_API void acl_netdb_cache_push(const ACL_DNS_DB *h_dns_db, int timeout)
const ACL_HOSTNAME * refer
Definition: acl_netdb.h:41
ACL_API int acl_netdb_size(const ACL_DNS_DB *h_dns_db)
int priority
Definition: acl_netdb.h:21
unsigned int ttl
Definition: acl_netdb.h:20
ACL_API const ACL_SOCKADDR * acl_netdb_index_saddr(ACL_DNS_DB *h_dns_db, int i)
char ip[256]
Definition: acl_netdb.h:18
ACL_API ACL_DNS_DB * acl_netdb_cache_lookup(const char *name)
ACL_API void acl_netdb_refer_oper(ACL_DNS_DB *h_dns_db, int i, int n)
ACL_API void acl_netdb_add_addr(ACL_DNS_DB *h_dns_db, const char *ip, int port)
struct ACL_HOSTNAME ACL_HOSTNAME