xref: /openbsd/regress/lib/libc/asr/bin/common.h (revision fc61954a)
1 /*	$OpenBSD: common.h,v 1.1.1.1 2012/07/13 17:49:53 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 
34 extern int long_err;
35 extern int gai_errno;
36 extern int rrset_errno;
37 
38 const char *classtostr(uint16_t);
39 const char *typetostr(uint16_t);
40 const char *rcodetostr(uint16_t);
41 
42 uint16_t strtotype(const char*);
43 uint16_t strtoclass(const char*);
44 
45 void	print_rrsetinfo(struct rrsetinfo *);
46 void	print_addrinfo(struct addrinfo *);
47 void	print_errors(void);
48 void	print_hostent(struct hostent *);
49 void	print_netent(struct netent *);
50 
51 int	sockaddr_from_str(struct sockaddr *, int, const char *);
52 int	addr_from_str(char *, int *, int *, const char *);
53 char*	gethostarg(char *);
54 
55 #define QR_MASK		(0x1 << 15)
56 #define OPCODE_MASK	(0xf << 11)
57 #define AA_MASK		(0x1 << 10)
58 #define TC_MASK		(0x1 <<  9)
59 #define RD_MASK		(0x1 <<  8)
60 #define RA_MASK		(0x1 <<  7)
61 #define Z_MASK		(0x7 <<  4)
62 #define RCODE_MASK	(0xf)
63 
64 #define OPCODE(v)	((v) & OPCODE_MASK)
65 #define RCODE(v)	((v) & RCODE_MASK)
66 
67 
68 struct packed {
69 	char		*data;
70 	size_t		 len;
71 	size_t		 offset;
72 	const char	*err;
73 };
74 
75 struct header {
76 	uint16_t	id;
77 	uint16_t	flags;
78 	uint16_t	qdcount;
79 	uint16_t	ancount;
80 	uint16_t	nscount;
81 	uint16_t	arcount;
82 };
83 
84 struct query {
85 	char		q_dname[MAXDNAME];
86 	uint16_t	q_type;
87 	uint16_t	q_class;
88 };
89 
90 struct rr {
91 	char		rr_dname[MAXDNAME];
92 	uint16_t	rr_type;
93 	uint16_t	rr_class;
94 	uint32_t	rr_ttl;
95 	union {
96 		struct {
97 			char	cname[MAXDNAME];
98 		} cname;
99 		struct {
100 			uint16_t	preference;
101 			char		exchange[MAXDNAME];
102 		} mx;
103 		struct {
104 			char	nsname[MAXDNAME];
105 		} ns;
106 		struct {
107 			char	ptrname[MAXDNAME];
108 		} ptr;
109 		struct {
110 			char		mname[MAXDNAME];
111 			char		rname[MAXDNAME];
112 			uint32_t	serial;
113 			uint32_t	refresh;
114 			uint32_t	retry;
115 			uint32_t	expire;
116 			uint32_t	minimum;
117 		} soa;
118 		struct {
119 			struct in_addr	addr;
120 		} in_a;
121 		struct {
122 			struct in6_addr	addr6;
123 		} in_aaaa;
124 		struct {
125 			uint16_t	 rdlen;
126 			const void	*rdata;
127 		} other;
128 	} rr;
129 };
130 
131 void	packed_init(struct packed*, char*, size_t);
132 int	pack_header(struct packed*, const struct header*);
133 int	pack_query(struct packed*, uint16_t, uint16_t, const char*);
134 int	unpack_header(struct packed*, struct header*);
135 int	unpack_query(struct packed*, struct query*);
136 int	unpack_rr(struct packed*, struct rr*);
137