Don't leak file descriptors
[qemu.git] / slirp / slirp.h
1 #ifndef __COMMON_H__
2 #define __COMMON_H__
3
4 #include "config-host.h"
5 #include "slirp_config.h"
6
7 #ifdef _WIN32
8 # include <inttypes.h>
9
10 typedef uint8_t u_int8_t;
11 typedef uint16_t u_int16_t;
12 typedef uint32_t u_int32_t;
13 typedef uint64_t u_int64_t;
14 typedef char *caddr_t;
15
16 # include <windows.h>
17 # include <winsock2.h>
18 # include <ws2tcpip.h>
19 # include <sys/timeb.h>
20 # include <iphlpapi.h>
21
22 # define EWOULDBLOCK WSAEWOULDBLOCK
23 # define EINPROGRESS WSAEINPROGRESS
24 # define ENOTCONN WSAENOTCONN
25 # define EHOSTUNREACH WSAEHOSTUNREACH
26 # define ENETUNREACH WSAENETUNREACH
27 # define ECONNREFUSED WSAECONNREFUSED
28 #else
29 # define ioctlsocket ioctl
30 # define closesocket(s) close(s)
31 # define O_BINARY 0
32 #endif
33
34 #include <sys/types.h>
35 #ifdef HAVE_SYS_BITYPES_H
36 # include <sys/bitypes.h>
37 #endif
38
39 #include <sys/time.h>
40
41 #ifdef NEED_TYPEDEFS
42 typedef char int8_t;
43 typedef unsigned char u_int8_t;
44
45 # if SIZEOF_SHORT == 2
46 typedef short int16_t;
47 typedef unsigned short u_int16_t;
48 # else
49 # if SIZEOF_INT == 2
50 typedef int int16_t;
51 typedef unsigned int u_int16_t;
52 # else
53 #error Cannot find a type with sizeof() == 2
54 # endif
55 # endif
56
57 # if SIZEOF_SHORT == 4
58 typedef short int32_t;
59 typedef unsigned short u_int32_t;
60 # else
61 # if SIZEOF_INT == 4
62 typedef int int32_t;
63 typedef unsigned int u_int32_t;
64 # else
65 #error Cannot find a type with sizeof() == 4
66 # endif
67 # endif
68 #endif /* NEED_TYPEDEFS */
69
70 #ifdef HAVE_UNISTD_H
71 # include <unistd.h>
72 #endif
73
74 #ifdef HAVE_STDLIB_H
75 # include <stdlib.h>
76 #endif
77
78 #include <stdio.h>
79 #include <errno.h>
80
81 #ifndef HAVE_MEMMOVE
82 #define memmove(x, y, z) bcopy(y, x, z)
83 #endif
84
85 #if TIME_WITH_SYS_TIME
86 # include <sys/time.h>
87 # include <time.h>
88 #else
89 # ifdef HAVE_SYS_TIME_H
90 # include <sys/time.h>
91 # else
92 # include <time.h>
93 # endif
94 #endif
95
96 #ifdef HAVE_STRING_H
97 # include <string.h>
98 #else
99 # include <strings.h>
100 #endif
101
102 #ifndef _WIN32
103 #include <sys/uio.h>
104 #endif
105
106 #ifndef _WIN32
107 #include <netinet/in.h>
108 #include <arpa/inet.h>
109 #endif
110
111 /* Systems lacking strdup() definition in <string.h>. */
112 #if defined(ultrix)
113 char *strdup(const char *);
114 #endif
115
116 /* Systems lacking malloc() definition in <stdlib.h>. */
117 #if defined(ultrix) || defined(hcx)
118 void *malloc(size_t arg);
119 void free(void *ptr);
120 #endif
121
122 #ifndef HAVE_INET_ATON
123 int inet_aton(const char *cp, struct in_addr *ia);
124 #endif
125
126 #include <fcntl.h>
127 #ifndef NO_UNIX_SOCKETS
128 #include <sys/un.h>
129 #endif
130 #include <signal.h>
131 #ifdef HAVE_SYS_SIGNAL_H
132 # include <sys/signal.h>
133 #endif
134 #ifndef _WIN32
135 #include <sys/socket.h>
136 #endif
137
138 #if defined(HAVE_SYS_IOCTL_H)
139 # include <sys/ioctl.h>
140 #endif
141
142 #ifdef HAVE_SYS_SELECT_H
143 # include <sys/select.h>
144 #endif
145
146 #ifdef HAVE_SYS_WAIT_H
147 # include <sys/wait.h>
148 #endif
149
150 #ifdef HAVE_SYS_FILIO_H
151 # include <sys/filio.h>
152 #endif
153
154 #ifdef USE_PPP
155 #include <ppp/slirppp.h>
156 #endif
157
158 #ifdef __STDC__
159 #include <stdarg.h>
160 #else
161 #include <varargs.h>
162 #endif
163
164 #include <sys/stat.h>
165
166 /* Avoid conflicting with the libc insque() and remque(), which
167 have different prototypes. */
168 #define insque slirp_insque
169 #define remque slirp_remque
170
171 #ifdef HAVE_SYS_STROPTS_H
172 #include <sys/stropts.h>
173 #endif
174
175 #include "debug.h"
176
177 #include "qemu-queue.h"
178
179 #include "libslirp.h"
180 #include "ip.h"
181 #include "tcp.h"
182 #include "tcp_timer.h"
183 #include "tcp_var.h"
184 #include "tcpip.h"
185 #include "udp.h"
186 #include "mbuf.h"
187 #include "sbuf.h"
188 #include "socket.h"
189 #include "if.h"
190 #include "main.h"
191 #include "misc.h"
192 #ifdef USE_PPP
193 #include "ppp/pppd.h"
194 #include "ppp/ppp.h"
195 #endif
196
197 #include "bootp.h"
198 #include "tftp.h"
199
200 /* osdep.c */
201 int qemu_socket(int domain, int type, int protocol);
202
203
204 struct Slirp {
205 QTAILQ_ENTRY(Slirp) entry;
206
207 /* virtual network configuration */
208 struct in_addr vnetwork_addr;
209 struct in_addr vnetwork_mask;
210 struct in_addr vhost_addr;
211 struct in_addr vdhcp_startaddr;
212 struct in_addr vnameserver_addr;
213
214 /* ARP cache for the guest IP addresses (XXX: allow many entries) */
215 uint8_t client_ethaddr[6];
216
217 struct in_addr client_ipaddr;
218 char client_hostname[33];
219
220 int restricted;
221 struct timeval tt;
222 struct ex_list *exec_list;
223
224 /* mbuf states */
225 struct mbuf m_freelist, m_usedlist;
226 int mbuf_alloced;
227
228 /* if states */
229 int if_queued; /* number of packets queued so far */
230 struct mbuf if_fastq; /* fast queue (for interactive data) */
231 struct mbuf if_batchq; /* queue for non-interactive data */
232 struct mbuf *next_m; /* pointer to next mbuf to output */
233
234 /* ip states */
235 struct ipq ipq; /* ip reass. queue */
236 u_int16_t ip_id; /* ip packet ctr, for ids */
237
238 /* bootp/dhcp states */
239 BOOTPClient bootp_clients[NB_BOOTP_CLIENTS];
240 char *bootp_filename;
241
242 /* tcp states */
243 struct socket tcb;
244 struct socket *tcp_last_so;
245 tcp_seq tcp_iss; /* tcp initial send seq # */
246 u_int32_t tcp_now; /* for RFC 1323 timestamps */
247
248 /* udp states */
249 struct socket udb;
250 struct socket *udp_last_so;
251
252 /* tftp states */
253 char *tftp_prefix;
254 struct tftp_session tftp_sessions[TFTP_SESSIONS_MAX];
255
256 void *opaque;
257 };
258
259 extern Slirp *slirp_instance;
260
261 #ifndef NULL
262 #define NULL (void *)0
263 #endif
264
265 #ifndef FULL_BOLT
266 void if_start(Slirp *);
267 #else
268 void if_start(struct ttys *);
269 #endif
270
271 #ifdef BAD_SPRINTF
272 # define vsprintf vsprintf_len
273 # define sprintf sprintf_len
274 extern int vsprintf_len(char *, const char *, va_list);
275 extern int sprintf_len(char *, const char *, ...);
276 #endif
277
278 #ifdef DECLARE_SPRINTF
279 # ifndef BAD_SPRINTF
280 extern int vsprintf(char *, const char *, va_list);
281 # endif
282 extern int vfprintf(FILE *, const char *, va_list);
283 #endif
284
285 #ifndef HAVE_STRERROR
286 extern char *strerror(int error);
287 #endif
288
289 #ifndef HAVE_INDEX
290 char *index(const char *, int);
291 #endif
292
293 #ifndef HAVE_GETHOSTID
294 long gethostid(void);
295 #endif
296
297 void lprint(const char *, ...);
298
299 #ifndef _WIN32
300 #include <netdb.h>
301 #endif
302
303 #define DEFAULT_BAUD 115200
304
305 #define SO_OPTIONS DO_KEEPALIVE
306 #define TCP_MAXIDLE (TCPTV_KEEPCNT * TCPTV_KEEPINTVL)
307
308 /* cksum.c */
309 int cksum(struct mbuf *m, int len);
310
311 /* if.c */
312 void if_init(Slirp *);
313 void if_output(struct socket *, struct mbuf *);
314
315 /* ip_input.c */
316 void ip_init(Slirp *);
317 void ip_input(struct mbuf *);
318 void ip_slowtimo(Slirp *);
319 void ip_stripoptions(register struct mbuf *, struct mbuf *);
320
321 /* ip_output.c */
322 int ip_output(struct socket *, struct mbuf *);
323
324 /* tcp_input.c */
325 void tcp_input(register struct mbuf *, int, struct socket *);
326 int tcp_mss(register struct tcpcb *, u_int);
327
328 /* tcp_output.c */
329 int tcp_output(register struct tcpcb *);
330 void tcp_setpersist(register struct tcpcb *);
331
332 /* tcp_subr.c */
333 void tcp_init(Slirp *);
334 void tcp_template(struct tcpcb *);
335 void tcp_respond(struct tcpcb *, register struct tcpiphdr *, register struct mbuf *, tcp_seq, tcp_seq, int);
336 struct tcpcb * tcp_newtcpcb(struct socket *);
337 struct tcpcb * tcp_close(register struct tcpcb *);
338 void tcp_sockclosed(struct tcpcb *);
339 int tcp_fconnect(struct socket *);
340 void tcp_connect(struct socket *);
341 int tcp_attach(struct socket *);
342 u_int8_t tcp_tos(struct socket *);
343 int tcp_emu(struct socket *, struct mbuf *);
344 int tcp_ctl(struct socket *);
345 struct tcpcb *tcp_drop(struct tcpcb *tp, int err);
346
347 #ifdef USE_PPP
348 #define MIN_MRU MINMRU
349 #define MAX_MRU MAXMRU
350 #else
351 #define MIN_MRU 128
352 #define MAX_MRU 16384
353 #endif
354
355 #ifndef _WIN32
356 #define min(x,y) ((x) < (y) ? (x) : (y))
357 #define max(x,y) ((x) > (y) ? (x) : (y))
358 #endif
359
360 #ifdef _WIN32
361 #undef errno
362 #define errno (WSAGetLastError())
363 #endif
364
365 #endif