Blame


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