]>
Commit | Line | Data |
---|---|---|
189935b1 | 1 | /** @file |
2 | * @brief IRC resolver API. | |
3 | * @version $Id: res.h,v 1.17 2005/06/27 13:25:51 entrope Exp $ | |
4 | */ | |
5 | ||
6 | #ifndef INCLUDED_res_h | |
7 | #define INCLUDED_res_h | |
8 | ||
9 | #ifndef INCLUDED_config_h | |
10 | #include "config.h" | |
11 | #endif | |
12 | ||
13 | #ifndef INCLUDED_sys_types_h | |
14 | #include <sys/types.h> | |
15 | #define INCLUDED_sys_types_h | |
16 | #endif | |
17 | ||
18 | #ifndef INCLUDED_sys_socket_h | |
19 | #include <sys/socket.h> | |
20 | #define INCLUDED_sys_socket_h | |
21 | #endif | |
22 | ||
23 | #include <netdb.h> | |
24 | ||
25 | #ifndef INCLUDED_netinet_in_h | |
26 | #include <netinet/in.h> | |
27 | #define INCLUDED_netinet_in_h | |
28 | #endif | |
29 | ||
30 | #ifdef HAVE_STDINT_H | |
31 | #ifndef INCLUDED_stdint_h | |
32 | #include <stdint.h> | |
33 | #define INCLUDED_stdint_h | |
34 | #endif | |
35 | #endif | |
36 | ||
37 | struct Client; | |
38 | struct StatDesc; | |
39 | ||
40 | /* Here we define some values lifted from nameser.h */ | |
41 | #define NS_INT16SZ 2 /**< Size of a 16-bit value. */ | |
42 | #define NS_INT32SZ 4 /**< Size of a 32-bit value. */ | |
43 | #define NS_CMPRSFLGS 0xc0 /**< Prefix flags that indicate special types */ | |
44 | #define NS_MAXCDNAME 255 /**< Maximum length of a compressed domain name. */ | |
45 | #define QUERY 0 /**< Forward (normal) DNS query operation. */ | |
46 | #define NO_ERRORS 0 /**< No errors processing a query. */ | |
47 | #define SERVFAIL 2 /**< Server error while processing a query. */ | |
48 | #define T_A 1 /**< Hostname -> IPv4 query type. */ | |
49 | #define T_AAAA 28 /**< Hostname -> IPv6 query type. */ | |
50 | #define T_PTR 12 /**< IP(v4 or v6) -> hostname query type. */ | |
51 | #define T_CNAME 5 /**< Canonical name resolution query type. */ | |
52 | #define C_IN 1 /**< Internet query class. */ | |
53 | #define QFIXEDSZ 4 /**< Length of fixed-size part of query. */ | |
54 | #define HFIXEDSZ 12 /**< Length of fixed-size DNS header. */ | |
55 | ||
56 | /** Structure to store an IP address. */ | |
57 | struct irc_in_addr | |
58 | { | |
59 | unsigned short in6_16[8]; /**< IPv6 encoded parts, little-endian. */ | |
60 | }; | |
61 | ||
62 | /** Structure to store an IP address and port number. */ | |
63 | struct irc_sockaddr | |
64 | { | |
65 | struct irc_in_addr addr; /**< IP address. */ | |
66 | unsigned short port; /**< Port number, host-endian. */ | |
67 | }; | |
68 | ||
69 | /** DNS callback function signature. */ | |
70 | typedef void (*dns_callback_f)(void *vptr, const struct irc_in_addr *addr, const char *h_name); | |
71 | ||
72 | /** DNS query and response header. */ | |
73 | typedef struct | |
74 | { | |
75 | unsigned id :16; /**< query identification number */ | |
76 | #ifdef WORDS_BIGENDIAN | |
77 | /* fields in third byte */ | |
78 | unsigned qr: 1; /**< response flag */ | |
79 | unsigned opcode: 4; /**< purpose of message */ | |
80 | unsigned aa: 1; /**< authoritive answer */ | |
81 | unsigned tc: 1; /**< truncated message */ | |
82 | unsigned rd: 1; /**< recursion desired */ | |
83 | /* fields in fourth byte */ | |
84 | unsigned ra: 1; /**< recursion available */ | |
85 | unsigned unused :1; /**< unused bits (MBZ as of 4.9.3a3) */ | |
86 | unsigned ad: 1; /**< authentic data from named */ | |
87 | unsigned cd: 1; /**< checking disabled by resolver */ | |
88 | unsigned rcode :4; /**< response code */ | |
89 | #else | |
90 | /* fields in third byte */ | |
91 | unsigned rd :1; /**< recursion desired */ | |
92 | unsigned tc :1; /**< truncated message */ | |
93 | unsigned aa :1; /**< authoritive answer */ | |
94 | unsigned opcode :4; /**< purpose of message */ | |
95 | unsigned qr :1; /**< response flag */ | |
96 | /* fields in fourth byte */ | |
97 | unsigned rcode :4; /**< response code */ | |
98 | unsigned cd: 1; /**< checking disabled by resolver */ | |
99 | unsigned ad: 1; /**< authentic data from named */ | |
100 | unsigned unused :1; /**< unused bits (MBZ as of 4.9.3a3) */ | |
101 | unsigned ra :1; /**< recursion available */ | |
102 | #endif | |
103 | /* remaining bytes */ | |
104 | unsigned qdcount :16; /**< number of question entries */ | |
105 | unsigned ancount :16; /**< number of answer entries */ | |
106 | unsigned nscount :16; /**< number of authority entries */ | |
107 | unsigned arcount :16; /**< number of resource entries */ | |
108 | } HEADER; | |
109 | ||
110 | extern void restart_resolver(void); | |
111 | extern void add_local_domain(char *hname, size_t size); | |
112 | extern size_t cres_mem(struct Client* cptr); | |
113 | extern void delete_resolver_queries(const void *vptr); | |
114 | extern void report_dns_servers(struct Client *source_p, const struct StatDesc *sd, char *param); | |
115 | extern void gethost_byname(const char *name, dns_callback_f callback, void *ctx); | |
116 | extern void gethost_byaddr(const struct irc_in_addr *addr, dns_callback_f callback, void *ctx); | |
117 | ||
118 | /** Evaluate to non-zero if \a ADDR is a valid address (not all 0s and not all 1s). */ | |
119 | #define irc_in_addr_valid(ADDR) (((ADDR)->in6_16[0] && ~(ADDR)->in6_16[0]) \ | |
120 | || (ADDR)->in6_16[1] != (ADDR)->in6_16[0] \ | |
121 | || (ADDR)->in6_16[2] != (ADDR)->in6_16[0] \ | |
122 | || (ADDR)->in6_16[3] != (ADDR)->in6_16[0] \ | |
123 | || (ADDR)->in6_16[4] != (ADDR)->in6_16[0] \ | |
124 | || (ADDR)->in6_16[5] != (ADDR)->in6_16[0] \ | |
125 | || (ADDR)->in6_16[6] != (ADDR)->in6_16[0] \ | |
126 | || (ADDR)->in6_16[7] != (ADDR)->in6_16[0]) | |
127 | /** Evaluate to non-zero if \a ADDR (of type struct irc_in_addr) is an IPv4 address. */ | |
128 | #define irc_in_addr_is_ipv4(ADDR) (!(ADDR)->in6_16[0] && !(ADDR)->in6_16[1] && !(ADDR)->in6_16[2] \ | |
129 | && !(ADDR)->in6_16[3] && !(ADDR)->in6_16[4] && (ADDR)->in6_16[6] \ | |
130 | && (!(ADDR)->in6_16[5] || (ADDR)->in6_16[5] == 65535)) | |
131 | /** Evaluate to non-zero if \a A is a different IP than \a B. */ | |
132 | #define irc_in_addr_cmp(A,B) (irc_in_addr_is_ipv4(A) ? ((A)->in6_16[6] != (B)->in6_16[6] \ | |
133 | || (A)->in6_16[7] != (B)->in6_16[7] || !irc_in_addr_is_ipv4(B)) \ | |
134 | : memcmp((A), (B), sizeof(struct irc_in_addr))) | |
135 | /** Evaluate to non-zero if \a ADDR is a loopback address. */ | |
136 | #define irc_in_addr_is_loopback(ADDR) (!(ADDR)->in6_16[0] && !(ADDR)->in6_16[1] && !(ADDR)->in6_16[2] \ | |
137 | && !(ADDR)->in6_16[3] && !(ADDR)->in6_16[4] \ | |
138 | && ((!(ADDR)->in6_16[5] \ | |
139 | && ((!(ADDR)->in6_16[6] && (ADDR)->in6_16[7] == htons(1)) \ | |
140 | || (ntohs((ADDR)->in6_16[6]) & 0xff00) == 0x7f00)) \ | |
141 | || (((ADDR)->in6_16[5] == 65535) \ | |
142 | && (ntohs((ADDR)->in6_16[6]) & 0xff00) == 0x7f00))) | |
143 | ||
144 | #endif |