]>
jfr.im git - irc/quakenet/snircd.git/blob - include/res.h
2 * @brief IRC resolver API.
3 * @version $Id: res.h,v 1.17 2005/06/27 13:25:51 entrope Exp $
9 #ifndef INCLUDED_config_h
13 #ifndef INCLUDED_sys_types_h
14 #include <sys/types.h>
15 #define INCLUDED_sys_types_h
18 #ifndef INCLUDED_sys_socket_h
19 #include <sys/socket.h>
20 #define INCLUDED_sys_socket_h
25 #ifndef INCLUDED_netinet_in_h
26 #include <netinet/in.h>
27 #define INCLUDED_netinet_in_h
31 #ifndef INCLUDED_stdint_h
33 #define INCLUDED_stdint_h
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. */
56 /** Structure to store an IP address. */
59 unsigned short in6_16
[8]; /**< IPv6 encoded parts, little-endian. */
62 /** Structure to store an IP address and port number. */
65 struct irc_in_addr addr
; /**< IP address. */
66 unsigned short port
; /**< Port number, host-endian. */
69 /** DNS callback function signature. */
70 typedef void (*dns_callback_f
)(void *vptr
, const struct irc_in_addr
*addr
, const char *h_name
);
72 /** DNS query and response header. */
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 */
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 */
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 */
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
);
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)))