#ifndef __DNS_CLIENT_H__
#define __DNS_CLIENT_H__
#include <NetInfo/config.h>
#include <sys/types.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#ifdef _UNIX_BSD_43_
#define ssize_t int
#define __P(X) X
#else
#include <sys/cdefs.h>
#endif
#define IN_ADDR_DOMAIN_STRING "in-addr.arpa"
#define LOCAL_DOMAIN_STRING "local"
#define LOCAL_DOMAIN_MULTICAST_ADDR "224.0.0.251"
#define DNS_SERVICE_PORT 53
#define DNS_LOCAL_DOMAIN_SERVICE_PORT 5353
#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_MAX_DNAME_LENGTH 63
#define DNS_FLAGS_QR_MASK 0x8000
#define DNS_FLAGS_QR_QUERY 0x0000
#define DNS_FLAGS_QR_REPLY 0x8000
#define DNS_FLAGS_OPCODE_MASK 0x7800
#define DNS_FLAGS_QUERY_STANDARD 0x0000
#define DNS_FLAGS_QUERY_INVERSE 0x0800
#define DNS_FLAGS_QUERY_STATUS 0x1000
#define DNS_FLAGS_AA 0x0400
#define DNS_FLAGS_TC 0x0200
#define DNS_FLAGS_RD 0x0100
#define DNS_FLAGS_RA 0x0080
#define DNS_FLAGS_RCODE_MASK 0x000f
#define DNS_FLAGS_RCODE_NO_ERROR 0x0000
#define DNS_FLAGS_RCODE_FORMAT_ERROR 0x0001
#define DNS_FLAGS_RCODE_SERVER_FAILURE 0x0002
#define DNS_FLAGS_RCODE_NAME_ERROR 0x0003
#define DNS_FLAGS_RCODE_NOT_IMPLEMENTED 0x0004
#define DNS_FLAGS_RCODE_REFUSED 0x0005
#define DNS_TYPE_A 1
#define DNS_TYPE_NS 2
#define DNS_TYPE_CNAME 5
#define DNS_TYPE_SOA 6
#define DNS_TYPE_MB 7
#define DNS_TYPE_MG 8
#define DNS_TYPE_MR 9
#define DNS_TYPE_NULL 10
#define DNS_TYPE_WKS 11
#define DNS_TYPE_PTR 12
#define DNS_TYPE_HINFO 13
#define DNS_TYPE_MINFO 14
#define DNS_TYPE_MX 15
#define DNS_TYPE_TXT 16
#define DNS_TYPE_RP 17
#define DNS_TYPE_AFSDB 18
#define DNS_TYPE_X25 19
#define DNS_TYPE_ISDN 20
#define DNS_TYPE_RT 21
#define DNS_TYPE_AAAA 28
#define DNS_TYPE_LOC 29
#define DNS_TYPE_SRV 33
#define DNS_TYPE_AXFR 252
#define DNS_TYPE_MAILB 253
#define DNS_TYPE_MAILA 254
#define DNS_TYPE_ANY 255
#define DNS_CLASS_IN 1
#define DNS_CLASS_CS 2
#define DNS_CLASS_CH 3
#define DNS_CLASS_HS 4
#define DNS_HEADER_SIZE 12
#define DNS_LOG_NONE 0x0000
#define DNS_LOG_STDERR 0x0001
#define DNS_LOG_SYSLOG 0x0002
#define DNS_LOG_FILE 0x0004
#define DNS_LOG_CALLBACK 0x0008
#define DNS_SOCK_UDP 0
#define DNS_SOCK_TCP_UNCONNECTED 1
#define DNS_SOCK_TCP_CONNECTED 2
typedef struct
{
u_int16_t xid;
char *domain;
u_int32_t latency_adjust;
struct sockaddr_in *server;
u_int32_t *server_latency;
u_int32_t server_count;
u_int32_t selected_server;
char **search;
u_int32_t search_count;
#ifdef DNS_EXCLUSION
char **exclude;
u_int32_t exclude_count;
u_int32_t exclusive;
#endif
struct timeval timeout;
struct timeval server_timeout;
u_int32_t server_retries;
int sock;
int sockstate;
int protocol;
struct sockaddr_in src;
u_int32_t ias_dots;
u_int32_t log_dest;
FILE *log_file;
int (*log_callback)(int, char *);
char *log_title;
u_int32_t *sort_addr;
u_int32_t *sort_mask;
u_int32_t sort_count;
} dns_handle_t;
typedef struct {
u_int16_t xid;
u_int16_t flags;
u_int16_t qdcount;
u_int16_t ancount;
u_int16_t nscount;
u_int16_t arcount;
} dns_header_t;
typedef struct
{
char *name;
u_int16_t type;
u_int16_t class;
} dns_question_t;
typedef struct
{
u_int16_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;
u_int32_t serial;
u_int32_t refresh;
u_int32_t retry;
u_int32_t expire;
u_int32_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
{
u_int16_t preference;
char *name;
} dns_MX_record_t;
typedef struct
{
u_int32_t string_count;
char **strings;
} dns_TXT_record_t;
typedef struct
{
struct in_addr addr;
u_int8_t protocol;
u_int32_t maplength;
u_int8_t *map;
} dns_WKS_record_t;
typedef struct
{
char *mailbox;
char *txtdname;
} dns_RP_record_t;
typedef struct
{
u_int32_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
{
u_int16_t preference;
char * intermediate;
} dns_RT_record_t;
typedef struct
{
u_int8_t version;
u_int8_t size;
u_int8_t horizontal_precision;
u_int8_t vertical_precision;
u_int32_t latitude;
u_int32_t longitude;
u_int32_t altitude;
} dns_LOC_record_t;
typedef struct
{
u_int16_t priority;
u_int16_t weight;
u_int16_t port;
char *target;
} dns_SRV_record_t;
typedef struct
{
char *name;
u_int16_t type;
u_int16_t class;
u_int32_t ttl;
union
{
dns_address_record_t *A;
dns_in6_address_record_t *AAAA;
dns_domain_name_record_t *CNAME;
dns_domain_name_record_t *MB;
dns_domain_name_record_t *MG;
dns_domain_name_record_t *MR;
dns_domain_name_record_t *PTR;
dns_domain_name_record_t *NS;
dns_SOA_record_t *SOA;
dns_WKS_record_t *WKS;
dns_raw_resource_record_t *DNSNULL;
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_LOC_record_t *LOC;
dns_SRV_record_t *SRV;
} data;
} dns_resource_record_t;
typedef struct
{
u_int32_t status;
struct in_addr 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;
typedef struct
{
u_int32_t count;
dns_reply_t **reply;
} dns_reply_list_t;
dns_handle_t *dns_open __P((char *));
dns_handle_t *dns_connect __P((char *, struct sockaddr_in *));
void dns_shutdown __P((void));
void dns_add_server __P((dns_handle_t *, struct sockaddr_in *));
void dns_remove_server __P((dns_handle_t *, u_int32_t));
void dns_free __P((dns_handle_t *));
void dns_free_resource_record __P((dns_resource_record_t *));
void dns_free_reply __P((dns_reply_t *));
void dns_free_reply_list __P((dns_reply_list_t *));
void dns_set_xid __P((dns_handle_t *, u_int32_t));
void dns_set_protocol __P((dns_handle_t *, u_int32_t));
void dns_select_server __P((dns_handle_t *, u_int32_t));
void dns_set_timeout __P((dns_handle_t *, struct timeval *));
void dns_set_server_timeout __P((dns_handle_t *, struct timeval *));
void dns_set_server_retries __P((dns_handle_t *, u_int32_t));
dns_reply_t *dns_parse_packet __P((char *));
char *dns_build_reply __P((dns_reply_t *, u_int16_t *));
dns_question_t *dns_parse_question __P((char *, char **));
dns_resource_record_t *dns_parse_resource_record __P((char *, char **));
char *dns_build_query __P((dns_handle_t *, dns_question_t *, u_int32_t *));
dns_reply_t *dns_query __P((dns_handle_t *, dns_question_t *));
dns_reply_t *dns_query_server __P((dns_handle_t *, u_int32_t, dns_question_t *));
dns_reply_t *dns_fqdn_query __P((dns_handle_t *, dns_question_t *));
dns_reply_t *dns_fqdn_query_server __P((dns_handle_t *, u_int32_t, dns_question_t *));
dns_reply_list_t * dns_zone_transfer(dns_handle_t *, u_int16_t);
void dns_open_log __P((dns_handle_t *, char *, int, FILE *, int, int, int (*)(int, char *)));
void dns_close_log __P((dns_handle_t *));
void dns_log __P((dns_handle_t *, int, char *));
#endif __DNS_CLIENT_H__