/usr/include/bglibs/dns.h is in libbg-dev 2.04+dfsg-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 | #ifndef DNS_H
#define DNS_H
#include "sysdeps.h"
#include "systime.h"
#include "ipv4.h"
#include "ipv6.h"
#include "str.h"
#include "uint16.h"
/** True if \c struct \c timeval \c A is less than \c B */
#define TV_LESS(A,B) (((A)->tv_sec < (B)->tv_sec) || ((A)->tv_sec == (B)->tv_sec && (A)->tv_usec < (B)->tv_usec))
/** \defgroup dns dns: DNS Resolver Library
@{
The DNS resolver library is a modified copy of the public domain library
used in djbdns (http://cr.yp.to/djbdns.html). Many modifications have
been made, both to make it fit within the bglibs library and to extend
the functionality.
Notable enhancements are:
- support for IPv6 lookups (both forward and reverse)
- qualification support for lookup types other than IPv4 addresses
- support for multiple outstanding requests
\return Functions that return an \c int return -1 on error and set \c errno.
*/
/** Record class: Internet protocol */
#define DNS_C_IN 1
/** Record class: Any */
#define DNS_C_ANY 255
/** Record type: Address (IPv4) */
#define DNS_T_A 1
/** Record type: Name server */
#define DNS_T_NS 2
/** Record type: Canonical name (alias) */
#define DNS_T_CNAME 5
/** Record type: Start of authority */
#define DNS_T_SOA 6
/** Record type: Pointer */
#define DNS_T_PTR 12
/** Record type: Host information */
#define DNS_T_HINFO 13
/** Record type: Mail exchanger */
#define DNS_T_MX 15
/** Record type: Text */
#define DNS_T_TXT 16
/** Record type: Responsible person */
#define DNS_T_RP 17
/** Record type: Signature */
#define DNS_T_SIG 24
/** Record type: Key record */
#define DNS_T_KEY 25
/** Record type: Address (IPv6) */
#define DNS_T_AAAA 28
/** Record type: Authoritative zone transfer */
#define DNS_T_AXFR 252
/** Record type: Any (all known records) */
#define DNS_T_ANY 255
/** Size of data used by \c dns_random_init */
#define DNS_RANDOM_SEED (32*4)
/** Maximum number of IPs returned by \c dns_resolvconfip or used by \c dns_transmit_start */
#define DNS_MAX_IPS 16
/** Maximum output size of \c dns_name4_domain */
#define DNS_NAME4_DOMAIN (4*4+14)
/** Maximum output size of \c dns_name6_domain */
#define DNS_NAME6_DOMAIN (32*2+10)
/** DNS transmission record */
struct dns_transmit {
/** The transmitted query packet. This will either be \c NULL or dynamically allocated. */
char *query;
/** The length of the transmitted query packet. */
unsigned int querylen;
/** The received response packet. This will either be \c NULL or dynamically allocated. */
char *packet;
/** The length of the received response packet. */
unsigned int packetlen;
/** The socket file descriptor used for data transmission. This will
either be 0 or 1 + an open file descriptor. The addition is done
to allow the uninitialized state to be all zeros. */
int s1;
/** Current state of the TCP connection. Valid values are:
\li 0 is uninitialized (ie using UDP)
\li 1 is connecting
\li 2 is connected, sending query
\li 3 is query sent, waiting for start of response
\li 4 is reading response length
\li 5 is read packet length, reading response
*/
int tcpstate;
/** Count of number of times the UDP query was sent to each server. */
unsigned int udploop;
/** Index of the server we are currently sending to. */
unsigned int curserver;
/** Deadline for considering a request timed out. */
struct timeval deadline;
/** Current sending/receiving position within the buffer, for TCP transmissions. */
unsigned int pos;
/** The list of servers to try. */
const ipv4addr *servers;
/** The local IP address to transmit with. */
ipv4addr localip;
/** The requested query type. */
uint16 qtype;
};
/** An individual result from a \c dns_mx query. */
struct dns_mx
{
/** The distance (or preference) number for this MX. */
uint16 distance;
/** The domain name of this MX. */
char* name;
};
union dns_result_rrs
{
void* __ptr;
ipv4addr* ip4;
ipv6addr* ip6;
struct dns_mx* mx;
char** name;
};
/** DNS query results. */
struct dns_result
{
/** The number of results present. */
int count;
/** The record type of the results. */
int type;
/** The individual record arrays. */
union dns_result_rrs rr;
/** Internal use buffer pointer. */
void* __buffer;
};
extern int dns_result_alloc(struct dns_result* d, int type, int count, int size);
extern void dns_result_free(struct dns_result* d);
extern void dns_random_init(const char [DNS_RANDOM_SEED]);
extern unsigned int dns_random(unsigned int);
extern void dns_rotate(unsigned char*, unsigned int n, unsigned int shift);
extern void dns_rotateipv4(ipv4addr*, unsigned int);
extern void dns_rotateipv6(ipv6addr*, unsigned int);
extern void dns_sort_mx(struct dns_mx* mxs, int count);
extern void dns_domain_free(char **);
extern int dns_domain_copy(char **,const char *);
extern unsigned int dns_domain_length(const char *);
extern int dns_domain_equal(const char *,const char *);
extern int dns_domain_suffix(const char *,const char *);
extern unsigned int dns_domain_suffixpos(const char *,const char *);
extern int dns_domain_fromdot(char **,const char *,unsigned int);
extern int dns_domain_todot_cat(str *,const char *);
extern unsigned int dns_packet_copy(const char *,unsigned int,unsigned int,unsigned char *,unsigned int);
extern unsigned int dns_packet_getname(const char *,unsigned int,unsigned int,char **);
extern unsigned int dns_packet_skipname(const char *,unsigned int,unsigned int);
extern int dns_packet_extract(struct dns_result* out, const char* buf, unsigned int len, uint16 rrtype, uint16 rrclass,
int (*sizefn)(const char* buf, unsigned int len, unsigned int pos, uint16 datalen),
int (*copy)(struct dns_result* out, unsigned int index, unsigned int offset,
const char* buf, unsigned int len, unsigned int pos, uint16 datalen));
extern int dns_transmit_start(struct dns_transmit *,const ipv4addr [DNS_MAX_IPS],int,const char *,uint16,const ipv4addr *);
extern void dns_transmit_free(struct dns_transmit *);
extern void dns_transmit_io(const struct dns_transmit *,iopoll_fd *,struct timeval *);
extern int dns_transmit_get(struct dns_transmit *,const iopoll_fd *,const struct timeval *);
extern int dns_read_resolvconf(str *out);
extern int dns_resolvconfip(ipv4addr [DNS_MAX_IPS]);
extern int dns_resolve(struct dns_transmit *,const char *,uint16);
extern int dns_ip4_packet(struct dns_result*, const char*, unsigned int);
extern int dns_ip4_r(struct dns_transmit*, struct dns_result*, const char *);
extern int dns_ip4(struct dns_result*, const char *);
extern int dns_ip6_packet(struct dns_result*, const char*, unsigned int);
extern int dns_ip6_r(struct dns_transmit*, struct dns_result*, const char *);
extern int dns_ip6(struct dns_result*, const char*);
extern int dns_name_packet(struct dns_result*, const char *,unsigned int);
extern void dns_name4_domain(char [DNS_NAME4_DOMAIN],const ipv4addr *);
extern void dns_name6_domain(char [DNS_NAME6_DOMAIN],const ipv6addr *);
extern int dns_name4_r(struct dns_transmit*, struct dns_result*, const ipv4addr*);
extern int dns_name4(struct dns_result*, const ipv4addr*);
extern int dns_name6_r(struct dns_transmit*, struct dns_result*, const ipv6addr*);
extern int dns_name6(struct dns_result*, const ipv6addr*);
extern int dns_txt_packet(struct dns_result*, const char *,unsigned int);
extern int dns_txt_r(struct dns_transmit *,struct dns_result*, const char *);
extern int dns_txt(struct dns_result*, const char *);
extern int dns_mx_packet(struct dns_result*, const char *,unsigned int);
extern int dns_mx_r(struct dns_transmit *,struct dns_result*, const char *);
extern int dns_mx(struct dns_result*, const char *);
extern int dns_resolvconfrewrite(str *);
extern int dns_qualify_rules(struct dns_result*,str *,const char *,const str *,
int (*)(struct dns_transmit*, struct dns_result*, const char*));
extern int dns_qualify(struct dns_result*,str *,const char *,
int (*)(struct dns_transmit*, struct dns_result*, const char*));
extern unsigned fmt_dns_domain(char*, const char*);
/** Wrapper macro to create a non-reentrant function from a \c dns_*_r function. */
#define DNS_R_FN_WRAP(NAME,TYPE) \
int dns_##NAME(struct dns_result* out,TYPE in) \
{ \
struct dns_transmit tx = {0}; \
int r = dns_##NAME##_r(&tx,out,in); \
dns_transmit_free(&tx); \
return r; \
}
/** @} */
#endif
|