1 f1509490 2022-03-20 martijn /* $OpenBSD: unpack_dns.h,v 1.1 2018/01/06 07:57:53 sunil Exp $ */
4 f1509490 2022-03-20 martijn * Copyright (c) 2011-2014 Eric Faurot <eric@faurot.net>
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.
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.
19 f1509490 2022-03-20 martijn #include <sys/types.h>
21 f1509490 2022-03-20 martijn #include <netinet/in.h>
23 f1509490 2022-03-20 martijn #include <arpa/inet.h>
24 f1509490 2022-03-20 martijn #include <arpa/nameser.h>
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;
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;
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;
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;
55 f1509490 2022-03-20 martijn char cname[MAXDNAME];
58 f1509490 2022-03-20 martijn uint16_t preference;
59 f1509490 2022-03-20 martijn char exchange[MAXDNAME];
62 f1509490 2022-03-20 martijn char nsname[MAXDNAME];
65 f1509490 2022-03-20 martijn char ptrname[MAXDNAME];
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;
77 f1509490 2022-03-20 martijn struct in_addr addr;
80 f1509490 2022-03-20 martijn struct in6_addr addr6;
81 f1509490 2022-03-20 martijn } in_aaaa;
83 f1509490 2022-03-20 martijn uint16_t rdlen;
84 f1509490 2022-03-20 martijn const void *rdata;
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);