// #ifndef XPLDNS_H #define XPLDNS_H #include #define XPLDNS_NAMELEN 256 /* A TXT RR can contain multiple 255-byte character strings. Keep enough of * the concatenated value for modern mail policies without allocating the DNS * protocol maximum for every answer record. */ #define XPLDNS_TXTLEN 16384 typedef enum { XPLDNS_INTERNAL_ERROR = -1, // internal error, see errno XPLDNS_SUCCESS = 0, XPLDNS_NOT_FOUND = 1, // authoritative host not found XPLDNS_TRY_AGAIN = 2, // host not found or server failure XPLDNS_DNS_ERROR = 3, // query refused/other non-recoverable XPLDNS_NO_DATA = 4, // name valid, no records exist XPLDNS_FAIL = 100, XPLDNS_FAIL_CNAME_LOOP = 101 } XplDns_ResultCode; typedef enum { XPLDNS_RR_A = 0x0001, XPLDNS_RR_CNAME = 0x0005, XPLDNS_RR_SOA = 0x0006, XPLDNS_RR_PTR = 0x000C, XPLDNS_RR_MX = 0x000F, XPLDNS_RR_TXT = 0x0010 } XplDns_RecordType; typedef struct { char name[XPLDNS_NAMELEN + 1]; // Domain name on MX record char mxname[XPLDNS_NAMELEN + 1]; // address of record unsigned short preference; // Preference of record } XplDns_MxRecord; typedef struct { char name[XPLDNS_NAMELEN + 1]; // Domain name on A record int address; // IP address of record } XplDns_ARecord; typedef struct { char name[XPLDNS_NAMELEN + 1]; // Domain name on PTR record } XplDns_PtrRecord; typedef struct { char name[XPLDNS_NAMELEN + 1]; // Domain name on CNAME char cname[XPLDNS_NAMELEN + 1]; // what it points to } XplDns_CnameRecord; typedef struct { char mname[XPLDNS_NAMELEN + 1]; // source host char rname[XPLDNS_NAMELEN + 1]; // contact e-mail unsigned long serial; // serial number unsigned long refresh; // refresh time (secs) unsigned long retry; // retry time (secs) unsigned long expire; // expiry time (secs) unsigned long minimum; // minimum TTL (secs) } XplDns_SoaRecord; typedef struct { char txt[XPLDNS_TXTLEN + 1]; // Concatenated TXT character strings } XplDns_TxtRecord; typedef union { XplDns_ARecord A; XplDns_CnameRecord CNAME; XplDns_MxRecord MX; XplDns_PtrRecord PTR; XplDns_SoaRecord SOA; XplDns_TxtRecord TXT; } XplDns_Record; typedef struct _XplDns_RecordList XplDns_RecordList; struct _XplDns_RecordList { XplDns_RecordList *next; XplDns_RecordType type; XplDns_Record record; }; typedef struct { XplDns_ResultCode status; int dnssec_authenticated; XplDns_RecordList *list; } XplDns_Result; #define XPLDNS_MAX_IP_IN_LIST 20 typedef struct{ XplDns_ResultCode status; int dnssec_authenticated; int ip_list[XPLDNS_MAX_IP_IN_LIST + 1]; int number; char canonical_name[XPLDNS_NAMELEN + 1]; } XplDns_IpList; typedef struct { XplDns_ResultCode status; int preference; int null_mx; int dnssec_authenticated; char current_mx[XPLDNS_NAMELEN + 1]; XplDns_Result *_mx_result; XplDns_RecordList *_mx_current; } XplDns_MxLookup; int XplDnsInit(void); void XplDnsResultFree(XplDns_Result *result); XplDns_Result * XplDnsLookupIP(const char *domain); XplDns_Result * XplDnsLookupTXT(const char *domain); int XplDnsMxRecordsAreNull(const XplDns_RecordList *records); void XplDnsCanonicalName(const XplDns_RecordList *records, const char *hostname, char *canonical, size_t canonical_size); XplDns_MxLookup *XplDnsNewMxLookup(const char *domain); XplDns_IpList * XplDnsNextMxLookupIpList(XplDns_MxLookup *mx); void XplDnsFreeMxLookup(XplDns_MxLookup *mx); #endif