1 /* $OpenBSD: unpack_dns.h,v 1.1 2018/01/06 07:57:53 sunil Exp $ */ 2 3 /* 4 * Copyright (c) 2011-2014 Eric Faurot <eric@faurot.net> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 #include <sys/types.h> 20 21 #include <netinet/in.h> 22 23 #include <arpa/inet.h> 24 #include <arpa/nameser.h> 25 26 struct unpack { 27 const char *buf; 28 size_t len; 29 size_t offset; 30 const char *err; 31 }; 32 33 struct dns_header { 34 uint16_t id; 35 uint16_t flags; 36 uint16_t qdcount; 37 uint16_t ancount; 38 uint16_t nscount; 39 uint16_t arcount; 40 }; 41 42 struct dns_query { 43 char q_dname[MAXDNAME]; 44 uint16_t q_type; 45 uint16_t q_class; 46 }; 47 48 struct dns_rr { 49 char rr_dname[MAXDNAME]; 50 uint16_t rr_type; 51 uint16_t rr_class; 52 uint32_t rr_ttl; 53 union { 54 struct { 55 char cname[MAXDNAME]; 56 } cname; 57 struct { 58 uint16_t preference; 59 char exchange[MAXDNAME]; 60 } mx; 61 struct { 62 char nsname[MAXDNAME]; 63 } ns; 64 struct { 65 char ptrname[MAXDNAME]; 66 } ptr; 67 struct { 68 char mname[MAXDNAME]; 69 char rname[MAXDNAME]; 70 uint32_t serial; 71 uint32_t refresh; 72 uint32_t retry; 73 uint32_t expire; 74 uint32_t minimum; 75 } soa; 76 struct { 77 struct in_addr addr; 78 } in_a; 79 struct { 80 struct in6_addr addr6; 81 } in_aaaa; 82 struct { 83 uint16_t rdlen; 84 const void *rdata; 85 } other; 86 } rr; 87 }; 88 89 void unpack_init(struct unpack *, const char *, size_t); 90 int unpack_header(struct unpack *, struct dns_header *); 91 int unpack_rr(struct unpack *, struct dns_rr *); 92 int unpack_query(struct unpack *, struct dns_query *); 93 char *print_dname(const char *, char *, size_t); 94 ssize_t dname_expand(const unsigned char *, size_t, size_t, size_t *, 95 char *, size_t); 96 97