#ifndef __DNS_UTIL_H__
#define __DNS_UTIL_H__
#include <sys/cdefs.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <dns.h>
#define DNS_STATUS_OK 0
#define DNS_STATUS_BAD_HANDLE 1
#define DNS_STATUS_MALFORMED_QUERY 2
#define DNS_STATUS_TIMEOUT 3
#define DNS_STATUS_SEND_FAILED 4
#define DNS_STATUS_RECEIVE_FAILED 5
#define DNS_STATUS_CONNECTION_FAILED 6
#define DNS_STATUS_WRONG_SERVER 7
#define DNS_STATUS_WRONG_XID 8
#define DNS_STATUS_WRONG_QUESTION 9
#define DNS_PRINT_XID 0x0001
#define DNS_PRINT_QR 0x0002
#define DNS_PRINT_OPCODE 0x0004
#define DNS_PRINT_AA 0x0008
#define DNS_PRINT_TC 0x0010
#define DNS_PRINT_RD 0x0020
#define DNS_PRINT_RA 0x0040
#define DNS_PRINT_PR 0x0080
#define DNS_PRINT_RCODE 0x0100
#define DNS_PRINT_QUESTION 0x0200
#define DNS_PRINT_ANSWER 0x0400
#define DNS_PRINT_AUTHORITY 0x0800
#define DNS_PRINT_ADDITIONAL 0x1000
#define DNS_PRINT_SERVER 0x2000
typedef struct {
uint16_t xid;
uint16_t flags;
uint16_t qdcount;
uint16_t ancount;
uint16_t nscount;
uint16_t arcount;
} dns_header_t;
typedef struct
{
char *name;
uint16_t dnstype;
uint16_t dnsclass;
} dns_question_t;
typedef struct
{
uint16_t length;
char *data;
} dns_raw_resource_record_t;
typedef struct
{
struct in_addr addr;
} dns_address_record_t;
typedef struct
{
struct in6_addr addr;
} dns_in6_address_record_t;
typedef struct
{
char *name;
} dns_domain_name_record_t;
typedef struct
{
char *mname;
char *rname;
uint32_t serial;
uint32_t refresh;
uint32_t retry;
uint32_t expire;
uint32_t minimum;
} dns_SOA_record_t;
typedef struct
{
char *cpu;
char *os;
} dns_HINFO_record_t;
typedef struct
{
char *rmailbx;
char *emailbx;
} dns_MINFO_record_t;
typedef struct
{
uint16_t preference;
char *name;
} dns_MX_record_t;
typedef struct
{
uint32_t string_count;
char **strings;
} dns_TXT_record_t;
typedef struct
{
struct in_addr addr;
uint8_t protocol;
uint32_t maplength;
uint8_t *map;
} dns_WKS_record_t;
typedef struct
{
char *mailbox;
char *txtdname;
} dns_RP_record_t;
typedef struct
{
uint32_t subtype;
char *hostname;
} dns_AFSDB_record_t;
typedef struct
{
char *psdn_address;
} dns_X25_record_t;
typedef struct
{
char *isdn_address;
char *subaddress;
} dns_ISDN_record_t;
typedef struct
{
uint16_t preference;
char * intermediate;
} dns_RT_record_t;
typedef struct
{
uint8_t version;
uint8_t size;
uint8_t horizontal_precision;
uint8_t vertical_precision;
uint32_t latitude;
uint32_t longitude;
uint32_t altitude;
} dns_LOC_record_t;
typedef struct
{
uint16_t priority;
uint16_t weight;
uint16_t port;
char *target;
} dns_SRV_record_t;
typedef struct
{
char *name;
uint16_t dnstype;
uint16_t dnsclass;
uint32_t ttl;
union
{
dns_address_record_t *A;
dns_domain_name_record_t *NS;
dns_domain_name_record_t *MD;
dns_domain_name_record_t *MF;
dns_domain_name_record_t *CNAME;
dns_SOA_record_t *SOA;
dns_domain_name_record_t *MB;
dns_domain_name_record_t *MG;
dns_domain_name_record_t *MR;
dns_raw_resource_record_t *DNSNULL;
dns_WKS_record_t *WKS;
dns_domain_name_record_t *PTR;
dns_HINFO_record_t *HINFO;
dns_MINFO_record_t *MINFO;
dns_MX_record_t *MX;
dns_TXT_record_t *TXT;
dns_RP_record_t *RP;
dns_AFSDB_record_t *AFSDB;
dns_X25_record_t *X25;
dns_ISDN_record_t *ISDN;
dns_RT_record_t *RT;
dns_in6_address_record_t *AAAA;
dns_LOC_record_t *LOC;
dns_SRV_record_t *SRV;
} data;
} dns_resource_record_t;
typedef struct
{
uint32_t status;
struct sockaddr *server;
dns_header_t *header;
dns_question_t **question;
dns_resource_record_t **answer;
dns_resource_record_t **authority;
dns_resource_record_t **additional;
} dns_reply_t;
__BEGIN_DECLS
extern dns_reply_t *dns_lookup(dns_handle_t dns, const char *name, uint32_t dnsclass, uint32_t dnstype);
extern uint32_t dns_get_buffer_size(dns_handle_t d);
extern void dns_set_buffer_size(dns_handle_t d, uint32_t len);
extern dns_reply_t *dns_parse_packet(const char *buf, uint32_t len);
extern void dns_free_reply(dns_reply_t *r);
extern dns_question_t *dns_parse_question(const char *buf, uint32_t len);
extern void dns_free_question(dns_question_t *q);
extern dns_resource_record_t *dns_parse_resource_record(const char *buf, uint32_t len);
extern void dns_free_resource_record(dns_resource_record_t *rr);
extern const char *dns_class_string(uint16_t dnsclass);
extern int32_t dns_class_number(const char *c, uint16_t *n);
extern const char *dns_type_string(uint16_t dnstype);
extern int32_t dns_type_number(const char *t, uint16_t *n);
extern void dns_print_handle(dns_handle_t d, FILE *f);
extern void dns_print_question(const dns_question_t *q, FILE *f);
extern void dns_print_resource_record(const dns_resource_record_t *r, FILE *f);
extern void dns_print_reply(const dns_reply_t *r, FILE *f, uint16_t mask);
__END_DECLS
#endif