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 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 int strtoresopt(const char*); 45 void parseresopt(const char*); 46 47 void print_rrsetinfo(struct rrsetinfo *); 48 void print_addrinfo(struct addrinfo *); 49 void print_errors(void); 50 void print_hostent(struct hostent *); 51 void print_netent(struct netent *); 52 53 int sockaddr_from_str(struct sockaddr *, int, const char *); 54 int addr_from_str(char *, int *, int *, const char *); 55 char* 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 70 struct packed { 71 char *data; 72 size_t len; 73 size_t offset; 74 const char *err; 75 }; 76 77 struct 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 86 struct query { 87 char q_dname[MAXDNAME]; 88 uint16_t q_type; 89 uint16_t q_class; 90 }; 91 92 struct 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 133 void packed_init(struct packed*, char*, size_t); 134 int pack_header(struct packed*, const struct header*); 135 int pack_query(struct packed*, uint16_t, uint16_t, const char*); 136 int unpack_header(struct packed*, struct header*); 137 int unpack_query(struct packed*, struct query*); 138 int unpack_rr(struct packed*, struct rr*); 139