1 /* $OpenBSD: unpack_dns.h,v 1.2 2021/06/14 17:58:16 eric 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/nameser.h> 24 25 struct unpack { 26 const char *buf; 27 size_t len; 28 size_t offset; 29 const char *err; 30 }; 31 32 struct dns_header { 33 uint16_t id; 34 uint16_t flags; 35 uint16_t qdcount; 36 uint16_t ancount; 37 uint16_t nscount; 38 uint16_t arcount; 39 }; 40 41 struct dns_query { 42 char q_dname[MAXDNAME]; 43 uint16_t q_type; 44 uint16_t q_class; 45 }; 46 47 struct dns_rr { 48 char rr_dname[MAXDNAME]; 49 uint16_t rr_type; 50 uint16_t rr_class; 51 uint32_t rr_ttl; 52 union { 53 struct { 54 char cname[MAXDNAME]; 55 } cname; 56 struct { 57 uint16_t preference; 58 char exchange[MAXDNAME]; 59 } mx; 60 struct { 61 char nsname[MAXDNAME]; 62 } ns; 63 struct { 64 char ptrname[MAXDNAME]; 65 } ptr; 66 struct { 67 char mname[MAXDNAME]; 68 char rname[MAXDNAME]; 69 uint32_t serial; 70 uint32_t refresh; 71 uint32_t retry; 72 uint32_t expire; 73 uint32_t minimum; 74 } soa; 75 struct { 76 struct in_addr addr; 77 } in_a; 78 struct { 79 struct in6_addr addr6; 80 } in_aaaa; 81 struct { 82 uint16_t rdlen; 83 const void *rdata; 84 } other; 85 } rr; 86 }; 87 88 void unpack_init(struct unpack *, const char *, size_t); 89 int unpack_header(struct unpack *, struct dns_header *); 90 int unpack_rr(struct unpack *, struct dns_rr *); 91 int unpack_query(struct unpack *, struct dns_query *); 92 char *print_dname(const char *, char *, size_t); 93 ssize_t dname_expand(const unsigned char *, size_t, size_t, size_t *, 94 char *, size_t); 95 96