#ifndef _DNS_H_INCLUDED_
#define _DNS_H_INCLUDED_
#include <netinet/in.h>
#include <arpa/nameser.h>
#ifdef RESOLVE_H_NEEDS_STDIO_H
#include <stdio.h>
#endif
#ifdef RESOLVE_H_NEEDS_NAMESER8_COMPAT_H
#include <nameser8_compat.h>
#endif
#include <resolv.h>
#ifndef GETSHORT
#define GETSHORT(s, cp) { \
unsigned char *t_cp = (u_char *)(cp); \
(s) = ((unsigned)t_cp[0] << 8) \
| ((unsigned)t_cp[1]) \
; \
(cp) += 2; \
}
#define GETLONG(l, cp) { \
unsigned char *t_cp = (u_char *)(cp); \
(l) = ((unsigned)t_cp[0] << 24) \
| ((unsigned)t_cp[1] << 16) \
| ((unsigned)t_cp[2] << 8) \
| ((unsigned)t_cp[3]) \
; \
(cp) += 4; \
}
#endif
#ifndef T_TXT
#define T_TXT 16
#endif
#include <vstring.h>
#include <sock_addr.h>
#include <myaddrinfo.h>
typedef struct DNS_FIXED {
unsigned short type;
unsigned short class;
unsigned int ttl;
unsigned length;
} DNS_FIXED;
typedef struct DNS_RR {
char *qname;
char *rname;
unsigned short type;
unsigned short class;
unsigned int ttl;
unsigned short pref;
struct DNS_RR *next;
size_t data_len;
char data[1];
} DNS_RR;
extern const char *dns_strerror(unsigned);
extern const char *dns_strtype(unsigned);
extern unsigned dns_type(const char *);
extern DNS_RR *dns_rr_create(const char *, const char *,
ushort, ushort,
unsigned, unsigned,
const char *, size_t);
extern void dns_rr_free(DNS_RR *);
extern DNS_RR *dns_rr_copy(DNS_RR *);
extern DNS_RR *dns_rr_append(DNS_RR *, DNS_RR *);
extern DNS_RR *dns_rr_sort(DNS_RR *, int (*) (DNS_RR *, DNS_RR *));
extern int dns_rr_compare_pref(DNS_RR *, DNS_RR *);
extern DNS_RR *dns_rr_shuffle(DNS_RR *);
extern DNS_RR *dns_rr_remove(DNS_RR *, DNS_RR *);
extern const char *dns_rr_to_pa(DNS_RR *, MAI_HOSTADDR_STR *);
extern DNS_RR *dns_sa_to_rr(const char *, unsigned, struct sockaddr *);
extern int dns_rr_to_sa(DNS_RR *, unsigned, struct sockaddr *, SOCKADDR_SIZE *);
extern int dns_rr_eq_sa(DNS_RR *, struct sockaddr *);
#ifdef HAS_IPV6
#define DNS_RR_EQ_SA(rr, sa) \
((SOCK_ADDR_IN_FAMILY(sa) == AF_INET && (rr)->type == T_A \
&& SOCK_ADDR_IN_ADDR(sa).s_addr == IN_ADDR((rr)->data).s_addr) \
|| (SOCK_ADDR_IN_FAMILY(sa) == AF_INET6 && (rr)->type == T_AAAA \
&& memcmp((char *) &(SOCK_ADDR_IN6_ADDR(sa)), \
(rr)->data, (rr)->data_len) == 0))
#else
#define DNS_RR_EQ_SA(rr, sa) \
(SOCK_ADDR_IN_FAMILY(sa) == AF_INET && (rr)->type == T_A \
&& SOCK_ADDR_IN_ADDR(sa).s_addr == IN_ADDR((rr)->data).s_addr)
#endif
extern int dns_lookup(const char *, unsigned, unsigned, DNS_RR **,
VSTRING *, VSTRING *);
extern int dns_lookup_l(const char *, unsigned, DNS_RR **, VSTRING *,
VSTRING *, int,...);
extern int dns_lookup_v(const char *, unsigned, DNS_RR **, VSTRING *,
VSTRING *, int, unsigned *);
#define DNS_REQ_FLAG_STOP_OK (1<<0)
#define DNS_REQ_FLAG_STOP_INVAL (1<<1)
#define DNS_REQ_FLAG_NONE (0)
#define DNS_INVAL (-5)
#define DNS_FAIL (-4)
#define DNS_NOTFOUND (-3)
#define DNS_RETRY (-2)
#define DNS_RECURSE (-1)
#define DNS_OK 0
#define DNS_NAME_LEN 1024
#endif