| 1 | /* |
|---|
| 2 | * Copyright (c) 2006-2009 Bjorn Andersson <flex@kryo.se>, Erik Ekman <yarrick@kryo.se> |
|---|
| 3 | * |
|---|
| 4 | * Permission to use, copy, modify, and distribute this software for any |
|---|
| 5 | * purpose with or without fee is hereby granted, provided that the above |
|---|
| 6 | * copyright notice and this permission notice appear in all copies. |
|---|
| 7 | * |
|---|
| 8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
|---|
| 9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
|---|
| 10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
|---|
| 11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
|---|
| 12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
|---|
| 13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
|---|
| 14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
|---|
| 15 | */ |
|---|
| 16 | |
|---|
| 17 | #ifndef __COMMON_H__ |
|---|
| 18 | #define __COMMON_H__ |
|---|
| 19 | |
|---|
| 20 | /* Last byte of raw header is the command */ |
|---|
| 21 | #define RAW_HDR_LEN 4 |
|---|
| 22 | #define RAW_HDR_IDENT_LEN 3 |
|---|
| 23 | #define RAW_HDR_CMD 3 |
|---|
| 24 | #define RAW_HDR_CMD_LOGIN 0x10 |
|---|
| 25 | #define RAW_HDR_CMD_DATA 0x20 |
|---|
| 26 | #define RAW_HDR_CMD_PING 0x30 |
|---|
| 27 | |
|---|
| 28 | #define RAW_HDR_CMD_MASK 0xF0 |
|---|
| 29 | #define RAW_HDR_USR_MASK 0x0F |
|---|
| 30 | #define RAW_HDR_GET_CMD(x) ((x)[RAW_HDR_CMD] & RAW_HDR_CMD_MASK) |
|---|
| 31 | #define RAW_HDR_GET_USR(x) ((x)[RAW_HDR_CMD] & RAW_HDR_USR_MASK) |
|---|
| 32 | extern const unsigned char raw_header[RAW_HDR_LEN]; |
|---|
| 33 | |
|---|
| 34 | #ifdef WINDOWS32 |
|---|
| 35 | #include "windows.h" |
|---|
| 36 | #else |
|---|
| 37 | #include <sys/types.h> |
|---|
| 38 | #include <sys/socket.h> |
|---|
| 39 | #include <err.h> |
|---|
| 40 | #include <netinet/in.h> |
|---|
| 41 | #include <arpa/inet.h> |
|---|
| 42 | #endif |
|---|
| 43 | |
|---|
| 44 | #define DNS_PORT 53 |
|---|
| 45 | |
|---|
| 46 | #ifndef MIN |
|---|
| 47 | #define MIN(a,b) ((a)<(b)?(a):(b)) |
|---|
| 48 | #endif |
|---|
| 49 | #ifndef MAX |
|---|
| 50 | #define MAX(a,b) ((a)>(b)?(a):(b)) |
|---|
| 51 | #endif |
|---|
| 52 | |
|---|
| 53 | #define QUERY_NAME_SIZE 256 |
|---|
| 54 | |
|---|
| 55 | #if defined IP_RECVDSTADDR |
|---|
| 56 | # define DSTADDR_SOCKOPT IP_RECVDSTADDR |
|---|
| 57 | # define dstaddr(x) ((struct in_addr *) CMSG_DATA(x)) |
|---|
| 58 | #elif defined IP_PKTINFO |
|---|
| 59 | # define DSTADDR_SOCKOPT IP_PKTINFO |
|---|
| 60 | # define dstaddr(x) (&(((struct in_pktinfo *)(CMSG_DATA(x)))->ipi_addr)) |
|---|
| 61 | #endif |
|---|
| 62 | |
|---|
| 63 | #if defined IP_MTU_DISCOVER |
|---|
| 64 | /* Linux */ |
|---|
| 65 | # define IP_OPT_DONT_FRAG IP_MTU_DISCOVER |
|---|
| 66 | # define DONT_FRAG_VALUE IP_PMTUDISC_DO |
|---|
| 67 | #elif defined IP_DONTFRAG |
|---|
| 68 | /* FreeBSD */ |
|---|
| 69 | # define IP_OPT_DONT_FRAG IP_DONTFRAG |
|---|
| 70 | # define DONT_FRAG_VALUE 1 |
|---|
| 71 | #elif defined IP_DONTFRAGMENT |
|---|
| 72 | /* Winsock2 */ |
|---|
| 73 | # define IP_OPT_DONT_FRAG IP_DONTFRAGMENT |
|---|
| 74 | # define DONT_FRAG_VALUE 1 |
|---|
| 75 | #endif |
|---|
| 76 | |
|---|
| 77 | #define T_UNSET 65432 |
|---|
| 78 | /* Unused RR type; "private use" range, see http://www.bind9.net/dns-parameters */ |
|---|
| 79 | |
|---|
| 80 | struct packet |
|---|
| 81 | { |
|---|
| 82 | int len; /* Total packet length */ |
|---|
| 83 | int sentlen; /* Length of chunk currently transmitted */ |
|---|
| 84 | int offset; /* Current offset */ |
|---|
| 85 | char data[64*1024]; /* The data */ |
|---|
| 86 | char seqno; /* The packet sequence number */ |
|---|
| 87 | char fragment; /* Fragment index */ |
|---|
| 88 | }; |
|---|
| 89 | |
|---|
| 90 | struct query { |
|---|
| 91 | char name[QUERY_NAME_SIZE]; |
|---|
| 92 | unsigned short type; |
|---|
| 93 | unsigned short rcode; |
|---|
| 94 | unsigned short id; |
|---|
| 95 | struct in_addr destination; |
|---|
| 96 | struct sockaddr from; |
|---|
| 97 | int fromlen; |
|---|
| 98 | unsigned short id2; |
|---|
| 99 | struct sockaddr from2; |
|---|
| 100 | int fromlen2; |
|---|
| 101 | }; |
|---|
| 102 | |
|---|
| 103 | enum connection { |
|---|
| 104 | CONN_RAW_UDP, |
|---|
| 105 | CONN_DNS_NULL, |
|---|
| 106 | CONN_MAX |
|---|
| 107 | }; |
|---|
| 108 | |
|---|
| 109 | void check_superuser(void (*usage_fn)(void)); |
|---|
| 110 | int open_dns(int, in_addr_t); |
|---|
| 111 | void close_dns(int); |
|---|
| 112 | |
|---|
| 113 | void do_chroot(char *); |
|---|
| 114 | void do_setcon(char *); |
|---|
| 115 | void do_detach(); |
|---|
| 116 | void do_pidfile(char *); |
|---|
| 117 | |
|---|
| 118 | void read_password(char*, size_t); |
|---|
| 119 | |
|---|
| 120 | int check_topdomain(char *); |
|---|
| 121 | |
|---|
| 122 | #if defined(WINDOWS32) || defined(ANDROID) |
|---|
| 123 | #ifndef ANDROID |
|---|
| 124 | int inet_aton(const char *cp, struct in_addr *inp); |
|---|
| 125 | #endif |
|---|
| 126 | |
|---|
| 127 | void err(int eval, const char *fmt, ...); |
|---|
| 128 | void warn(const char *fmt, ...); |
|---|
| 129 | void errx(int eval, const char *fmt, ...); |
|---|
| 130 | void warnx(const char *fmt, ...); |
|---|
| 131 | #endif |
|---|
| 132 | |
|---|
| 133 | int recent_seqno(int , int); |
|---|
| 134 | |
|---|
| 135 | #endif |
|---|