Refresh existing patches.
[debian/iodine.git] / src / common.h
1 /*
2  * Copyright (c) 2006-2014 Erik Ekman <yarrick@kryo.se>,
3  * 2006-2009 Bjorn Andersson <flex@kryo.se>
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
18 #ifndef __COMMON_H__
19 #define __COMMON_H__
20
21 /* Last byte of raw header is the command */
22 #define RAW_HDR_LEN 4
23 #define RAW_HDR_IDENT_LEN 3
24 #define RAW_HDR_CMD 3
25 #define RAW_HDR_CMD_LOGIN 0x10
26 #define RAW_HDR_CMD_DATA  0x20
27 #define RAW_HDR_CMD_PING  0x30
28
29 #define RAW_HDR_CMD_MASK  0xF0
30 #define RAW_HDR_USR_MASK  0x0F
31 #define RAW_HDR_GET_CMD(x) ((x)[RAW_HDR_CMD] & RAW_HDR_CMD_MASK)
32 #define RAW_HDR_GET_USR(x) ((x)[RAW_HDR_CMD] & RAW_HDR_USR_MASK)
33 extern const unsigned char raw_header[RAW_HDR_LEN];
34
35 #ifdef WINDOWS32
36 #include "windows.h"
37 #else
38 #include <sys/types.h>
39 #include <sys/socket.h>
40 #include <err.h>
41 #include <netinet/in.h>
42 #include <arpa/inet.h>
43 #endif
44
45 #define DNS_PORT 53
46
47 #ifndef MIN
48 #define MIN(a,b) ((a)<(b)?(a):(b))
49 #endif
50 #ifndef MAX
51 #define MAX(a,b) ((a)>(b)?(a):(b))
52 #endif
53
54 #define QUERY_NAME_SIZE 256
55
56 #if defined IP_RECVDSTADDR
57 # define DSTADDR_SOCKOPT IP_RECVDSTADDR
58 # define dstaddr(x) ((struct in_addr *) CMSG_DATA(x))
59 #elif defined IP_PKTINFO
60 # define DSTADDR_SOCKOPT IP_PKTINFO
61 # define dstaddr(x) (&(((struct in_pktinfo *)(CMSG_DATA(x)))->ipi_addr))
62 #endif
63
64 #if defined IP_MTU_DISCOVER
65   /* Linux */
66 # define IP_OPT_DONT_FRAG IP_MTU_DISCOVER
67 # define DONT_FRAG_VALUE IP_PMTUDISC_DO
68 #elif defined IP_DONTFRAG
69   /* FreeBSD */
70 # define IP_OPT_DONT_FRAG IP_DONTFRAG
71 # define DONT_FRAG_VALUE 1
72 #elif defined IP_DONTFRAGMENT
73   /* Winsock2 */
74 # define IP_OPT_DONT_FRAG IP_DONTFRAGMENT
75 # define DONT_FRAG_VALUE 1
76 #endif
77
78 #define T_PRIVATE 65399
79 /* Undefined RR type; "private use" range, see http://www.bind9.net/dns-parameters */
80 #define T_UNSET 65432
81 /* Unused RR type, never actually sent */
82
83 struct packet
84 {
85         int len;                /* Total packet length */
86         int sentlen;            /* Length of chunk currently transmitted */
87         int offset;             /* Current offset */
88         char data[64*1024];     /* The data */
89         char seqno;             /* The packet sequence number */
90         char fragment;          /* Fragment index */
91 };
92
93 struct query {
94         char name[QUERY_NAME_SIZE];
95         unsigned short type;
96         unsigned short rcode;
97         unsigned short id;
98         struct in_addr destination;
99         struct sockaddr_storage from;
100         int fromlen;
101         unsigned short id2;
102         struct sockaddr from2;
103         int fromlen2;
104 };
105
106 enum connection {
107         CONN_RAW_UDP,
108         CONN_DNS_NULL,
109         CONN_MAX
110 };
111
112 void check_superuser(void (*usage_fn)(void));
113 char *format_addr(struct sockaddr_storage *sockaddr, int sockaddr_len);
114 int get_addr(char *, int, int, int, struct sockaddr_storage *);
115 int open_dns(struct sockaddr_storage *, size_t);
116 int open_dns_from_host(char *host, int port, int addr_family, int flags);
117 void close_dns(int);
118
119 void do_chroot(char *);
120 void do_setcon(char *);
121 void do_detach();
122 void do_pidfile(char *);
123
124 void read_password(char*, size_t);
125
126 int check_topdomain(char *, char **);
127
128 #if defined(WINDOWS32) || defined(ANDROID)
129 #ifndef ANDROID
130 int inet_aton(const char *cp, struct in_addr *inp);
131 #endif
132
133 void err(int eval, const char *fmt, ...);
134 void warn(const char *fmt, ...);
135 void errx(int eval, const char *fmt, ...);
136 void warnx(const char *fmt, ...);
137 #endif
138
139 int recent_seqno(int , int);
140
141 #ifndef WINDOWS32
142 void fd_set_close_on_exec(int fd);
143 #endif
144
145 #endif