#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/nameser.h>
#include <netinet/in.h>
#include <netdb.h>
#define unpack_rr __unpack_rr
#define unpack_header __unpack_header
#define packed_init __packed_init
#define unpack_query __unpack_query
#define sockaddr_from_str __sockaddr_from_str
#define print_addr __print_addr
extern int long_err;
extern int gai_errno;
extern int rrset_errno;
const char *classtostr(uint16_t);
const char *typetostr(uint16_t);
const char *rcodetostr(uint16_t);
uint16_t strtotype(const char*);
uint16_t strtoclass(const char*);
int strtoresopt(const char*);
void parseresopt(const char*);
void print_rrsetinfo(struct rrsetinfo *);
void print_addrinfo(struct addrinfo *);
void print_errors(void);
void print_hostent(struct hostent *);
void print_netent(struct netent *);
int sockaddr_from_str(struct sockaddr *, int, const char *);
int addr_from_str(char *, int *, int *, const char *);
char* gethostarg(char *);
#define QR_MASK (0x1 << 15)
#define OPCODE_MASK (0xf << 11)
#define AA_MASK (0x1 << 10)
#define TC_MASK (0x1 << 9)
#define RD_MASK (0x1 << 8)
#define RA_MASK (0x1 << 7)
#define Z_MASK (0x7 << 4)
#define RCODE_MASK (0xf)
#define OPCODE(v) ((v) & OPCODE_MASK)
#define RCODE(v) ((v) & RCODE_MASK)
struct packed {
char *data;
size_t len;
size_t offset;
const char *err;
};
struct header {
uint16_t id;
uint16_t flags;
uint16_t qdcount;
uint16_t ancount;
uint16_t nscount;
uint16_t arcount;
};
struct query {
char q_dname[MAXDNAME];
uint16_t q_type;
uint16_t q_class;
};
struct rr {
char rr_dname[MAXDNAME];
uint16_t rr_type;
uint16_t rr_class;
uint32_t rr_ttl;
union {
struct {
char cname[MAXDNAME];
} cname;
struct {
uint16_t preference;
char exchange[MAXDNAME];
} mx;
struct {
char nsname[MAXDNAME];
} ns;
struct {
char ptrname[MAXDNAME];
} ptr;
struct {
char mname[MAXDNAME];
char rname[MAXDNAME];
uint32_t serial;
uint32_t refresh;
uint32_t retry;
uint32_t expire;
uint32_t minimum;
} soa;
struct {
struct in_addr addr;
} in_a;
struct {
struct in6_addr addr6;
} in_aaaa;
struct {
uint16_t rdlen;
const void *rdata;
} other;
} rr;
};
void packed_init(struct packed*, char*, size_t);
int pack_header(struct packed*, const struct header*);
int pack_query(struct packed*, uint16_t, uint16_t, const char*);
int unpack_header(struct packed*, struct header*);
int unpack_query(struct packed*, struct query*);
int unpack_rr(struct packed*, struct rr*);