Blob


1 /* $OpenBSD: unpack_dns.h,v 1.1 2018/01/06 07:57:53 sunil Exp $ */
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 */
19 #include <sys/types.h>
21 #include <netinet/in.h>
23 #include <arpa/inet.h>
24 #include <arpa/nameser.h>
26 struct unpack {
27 const char *buf;
28 size_t len;
29 size_t offset;
30 const char *err;
31 };
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 };
42 struct dns_query {
43 char q_dname[MAXDNAME];
44 uint16_t q_type;
45 uint16_t q_class;
46 };
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 };
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);