1/*	$OpenBSD: common.h,v 1.2 2018/12/15 15:16:12 eric Exp $	*/
2/*
3 * Copyright (c) 2012 Eric Faurot <eric@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17#include <sys/types.h>
18#include <sys/socket.h>
19
20#include <arpa/nameser.h>
21
22#include <netinet/in.h>
23
24#include <netdb.h>
25
26
27#define unpack_rr		__unpack_rr
28#define unpack_header		__unpack_header
29#define packed_init		__packed_init
30#define unpack_query		__unpack_query
31#define sockaddr_from_str	__sockaddr_from_str
32#define print_addr		__print_addr
33
34extern int long_err;
35extern int gai_errno;
36extern int rrset_errno;
37
38const char *classtostr(uint16_t);
39const char *typetostr(uint16_t);
40const char *rcodetostr(uint16_t);
41
42uint16_t strtotype(const char*);
43uint16_t strtoclass(const char*);
44int strtoresopt(const char*);
45void parseresopt(const char*);
46
47void	print_rrsetinfo(struct rrsetinfo *);
48void	print_addrinfo(struct addrinfo *);
49void	print_errors(void);
50void	print_hostent(struct hostent *);
51void	print_netent(struct netent *);
52
53int	sockaddr_from_str(struct sockaddr *, int, const char *);
54int	addr_from_str(char *, int *, int *, const char *);
55char*	gethostarg(char *);
56
57#define QR_MASK		(0x1 << 15)
58#define OPCODE_MASK	(0xf << 11)
59#define AA_MASK		(0x1 << 10)
60#define TC_MASK		(0x1 <<  9)
61#define RD_MASK		(0x1 <<  8)
62#define RA_MASK		(0x1 <<  7)
63#define Z_MASK		(0x7 <<  4)
64#define RCODE_MASK	(0xf)
65
66#define OPCODE(v)	((v) & OPCODE_MASK)
67#define RCODE(v)	((v) & RCODE_MASK)
68
69
70struct packed {
71	char		*data;
72	size_t		 len;
73	size_t		 offset;
74	const char	*err;
75};
76
77struct header {
78	uint16_t	id;
79	uint16_t	flags;
80	uint16_t	qdcount;
81	uint16_t	ancount;
82	uint16_t	nscount;
83	uint16_t	arcount;
84};
85
86struct query {
87	char		q_dname[MAXDNAME];
88	uint16_t	q_type;
89	uint16_t	q_class;
90};
91
92struct rr {
93	char		rr_dname[MAXDNAME];
94	uint16_t	rr_type;
95	uint16_t	rr_class;
96	uint32_t	rr_ttl;
97	union {
98		struct {
99			char	cname[MAXDNAME];
100		} cname;
101		struct {
102			uint16_t	preference;
103			char		exchange[MAXDNAME];
104		} mx;
105		struct {
106			char	nsname[MAXDNAME];
107		} ns;
108		struct {
109			char	ptrname[MAXDNAME];
110		} ptr;
111		struct {
112			char		mname[MAXDNAME];
113			char		rname[MAXDNAME];
114			uint32_t	serial;
115			uint32_t	refresh;
116			uint32_t	retry;
117			uint32_t	expire;
118			uint32_t	minimum;
119		} soa;
120		struct {
121			struct in_addr	addr;
122		} in_a;
123		struct {
124			struct in6_addr	addr6;
125		} in_aaaa;
126		struct {
127			uint16_t	 rdlen;
128			const void	*rdata;
129		} other;
130	} rr;
131};
132
133void	packed_init(struct packed*, char*, size_t);
134int	pack_header(struct packed*, const struct header*);
135int	pack_query(struct packed*, uint16_t, uint16_t, const char*);
136int	unpack_header(struct packed*, struct header*);
137int	unpack_query(struct packed*, struct query*);
138int	unpack_rr(struct packed*, struct rr*);
139