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 };