dinoco

Query DNS records
git clone git://git.relim.de/dinoco.git
Log | Files | Refs | README | LICENSE

dinoco.h (2153B)


      1 #include <stdint.h>
      2 
      3 #define MAX_DOMAIN_LENGTH 253
      4 #define MAX_UDP_MSG_LENGTH 512
      5 #define DNS_HEADER_LENGTH 12
      6 #define MIN_IP_LENGTH 7
      7 #define ANSI_COLOR_GREEN "\x1b[32m"
      8 #define ANSI_COLOR_RESET "\x1b[0m"
      9 
     10 #define LOG_ERR(msg) fprintf(stderr, "ERR: "msg"\n");
     11 #ifdef DEBUG
     12 #define LOG_DEBUG(msg) fprintf(stderr, msg"\n");
     13 #else
     14 #define LOG_DEBUG(msg)
     15 #endif
     16 
     17 enum ResponseCode {
     18 	RCODE_NO_ERROR,
     19 	RCODE_FORMAT_ERROR,
     20 	RCODE_SERVER_FAILURE,
     21 	RCODE_NAME_ERROR,
     22 	RCODE_NOT_IMPLEMENTED,
     23 	RCODE_REFUSED
     24 };
     25 
     26 enum Type {
     27 	TYPE_A = 1,
     28 	TYPE_NS,
     29 	TYPE_MD,
     30 	TYPE_MF,
     31 	TYPE_CNAME,
     32 	TYPE_SOA,
     33 	TYPE_MB,
     34 	TYPE_MG,
     35 	TYPE_MR,
     36 	TYPE_NULL,
     37 	TYPE_WKS,
     38 	TYPE_PTR,
     39 	TYPE_HINFO,
     40 	TYPE_MINFO,
     41 	TYPE_MX,
     42 	TYPE_TXT,
     43 	TYPE_AAAA = 28
     44 };
     45 
     46 enum Class {
     47 	CLASS_IN = 1,
     48 	CLASS_CS,
     49 	CLASS_CH,
     50 	CLASS_HS
     51 };
     52 
     53 enum OperationCode {
     54 	OPCODE_QUERY,
     55 	OPCODE_IQUERY,
     56 	OPCODE_STATUS
     57 };
     58 
     59 struct ByteArray {
     60 	uint8_t *b;
     61 	size_t len;
     62 };
     63 
     64 struct DnsHeader {
     65 	uint16_t id;
     66 	bool qr;
     67 	enum OperationCode opcode;
     68 	bool aa;
     69 	bool tc;
     70 	bool rd;
     71 	bool ra;
     72 	enum ResponseCode rcode;
     73 	uint16_t qdcount;
     74 	uint16_t ancount;
     75 	uint16_t nscount;
     76 	uint16_t arcount;
     77 };
     78 
     79 struct DnsQuestion {
     80 	const char *domain;
     81 	enum Type type;
     82 	enum Class class;
     83 };
     84 
     85 // Either Answer, Authority or Additional
     86 struct DnsResourceRecord {
     87 	char *domain;
     88 	enum Type type;
     89 	enum Class class;
     90 	int32_t ttl;
     91 	uint16_t rdlength;
     92 	struct ByteArray *rdata;
     93 };
     94 
     95 struct DnsMxResult {
     96 	uint16_t preference;
     97 	char *mail_domain;
     98 };
     99 
    100 struct DnsAResult
    101 {
    102 	char *ipv4;
    103 };
    104 
    105 struct DnsNsResult
    106 {
    107 	char *domain;
    108 };
    109 
    110 struct DnsCnameResult
    111 {
    112 	char *domain;
    113 };
    114 
    115 struct DnsTxtResult
    116 {
    117 	char *data;
    118 };
    119 
    120 struct DnsSoaResult
    121 {
    122 	char *mname;
    123 	char *rname;
    124 	uint32_t serial;
    125 	uint32_t refresh;
    126 	uint32_t retry;
    127 	uint32_t expire;
    128 	uint32_t minimum;
    129 };
    130 
    131 struct DnsPtrResult
    132 {
    133 	char *domain;
    134 };
    135 
    136 struct DnsHinfoResult
    137 {
    138 	char *cpu;
    139 	char *os;
    140 };
    141 
    142 struct DnsAaaaResult
    143 {
    144 	char *ipv6;
    145 };
    146 
    147 union DnsTypeResult
    148 {
    149 	struct DnsMxResult *mx;
    150 	struct DnsAResult *a;
    151 	struct DnsNsResult *ns;
    152 	struct DnsCnameResult *cname;
    153 	struct DnsTxtResult *txt;
    154 	struct DnsSoaResult *soa;
    155 	struct DnsPtrResult *ptr;
    156 	struct DnsHinfoResult *hinfo;
    157 	struct DnsAaaaResult *aaaa;
    158 };