1 /* Copyright (C) 2007-2008 The Android Open Source Project
2 **
3 ** This software is licensed under the terms of the GNU General Public
4 ** License version 2, as published by the Free Software Foundation, and
5 ** may be copied, distributed, and modified under those terms.
6 **
7 ** This program is distributed in the hope that it will be useful,
8 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
9 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 ** GNU General Public License for more details.
11 */
12 /* headers to use the BSD sockets */
13 #ifndef QEMU_SOCKET_H
14 #define QEMU_SOCKET_H
15
16 #include <stddef.h>
17 #include <stdint.h>
18 #include <errno.h>
19
20 /* we're going to hide the implementation details of sockets behind
21 * a simple wrapper interface declared here.
22 *
23 * all socket operations set the global 'errno' variable on error.
24 * this is unlike Winsock which instead modifies another internal
25 * variable accessed through WSAGetLastError() and WSASetLastError()
26 */
27
28 /* the wrapper will convert any Winsock error message into an errno
29 * code for you. There are however a few standard Unix error codes
30 * that are not defined by the MS C library headers, so we add them
31 * here. We use the official Winsock error codes, which are documented
32 * even though we don't want to include the Winsock headers
33 */
34 #ifdef _WIN32
35 # ifndef EINTR
36 # define EINTR 10004
37 # endif
38 # ifndef EAGAIN
39 # define EAGAIN 10035
40 # endif
41 # ifndef EWOULDBLOCK
42 # define EWOULDBLOCK EAGAIN
43 # endif
44 # ifndef EINPROGRESS
45 # define EINPROGRESS 10036
46 # endif
47 # ifndef EALREADY
48 # define EALREADY 10037
49 # endif
50 # ifndef EDESTADDRREQ
51 # define EDESTADDRREQ 10039
52 # endif
53 # ifndef EMSGSIZE
54 # define EMSGSIZE 10040
55 # endif
56 # ifndef EPROTOTYPE
57 # define EPROTOTYPE 10041
58 # endif
59 # ifndef ENOPROTOOPT
60 # define ENOPROTOOPT 10042
61 # endif
62 # ifndef EAFNOSUPPORT
63 # define EAFNOSUPPORT 10047
64 # endif
65 # ifndef EADDRINUSE
66 # define EADDRINUSE 10048
67 # endif
68 # ifndef EADDRNOTAVAIL
69 # define EADDRNOTAVAIL 10049
70 # endif
71 # ifndef ENETDOWN
72 # define ENETDOWN 10050
73 # endif
74 # ifndef ENETUNREACH
75 # define ENETUNREACH 10051
76 # endif
77 # ifndef ENETRESET
78 # define ENETRESET 10052
79 # endif
80 # ifndef ECONNABORTED
81 # define ECONNABORTED 10053
82 # endif
83 # ifndef ECONNRESET
84 # define ECONNRESET 10054
85 # endif
86 # ifndef ENOBUFS
87 # define ENOBUFS 10055
88 # endif
89 # ifndef EISCONN
90 # define EISCONN 10056
91 # endif
92 # ifndef ENOTCONN
93 # define ENOTCONN 10057
94 # endif
95 # ifndef ESHUTDOWN
96 # define ESHUTDOWN 10058
97 # endif
98 # ifndef ETOOMANYREFS
99 # define ETOOMANYREFS 10059
100 # endif
101 # ifndef ETIMEDOUT
102 # define ETIMEDOUT 10060
103 # endif
104 # ifndef ECONNREFUSED
105 # define ECONNREFUSED 10061
106 # endif
107 # ifndef ELOOP
108 # define ELOOP 10062
109 # endif
110 # ifndef EHOSTDOWN
111 # define EHOSTDOWN 10064
112 # endif
113 # ifndef EHOSTUNREACH
114 # define EHOSTUNREACH 10065
115 # endif
116 #endif /* _WIN32 */
117
118 /* Define 'errno_str' as a handy macro to return the string
119 * corresponding to a given errno code. On Unix, this is
120 * equivalent to strerror(errno), but on Windows, this will
121 * take care of Winsock-originated errors as well.
122 */
123 #ifdef _WIN32
124 extern const char* _errno_str(void);
125 # define errno_str _errno_str()
126 #else
127 # define errno_str strerror(errno)
128 #endif
129
130 /* always enable IPv6 sockets for now.
131 * the QEMU internal router is not capable of
132 * supporting them, but we plan to replace it
133 * with something better in the future.
134 */
135 #define HAVE_IN6_SOCKETS 1
136
137 /* Unix sockets are not available on Win32 */
138 #ifndef _WIN32
139 # define HAVE_UNIX_SOCKETS 1
140 #endif
141
142 /* initialize the socket sub-system. this must be called before
143 * using any of the declarations below.
144 */
145 int socket_init( void );
146
147 /* return the name of the current host */
148 char* host_name( void );
149
150 /* supported socket types */
151 typedef enum {
152 SOCKET_DGRAM = 0,
153 SOCKET_STREAM
154 } SocketType;
155
156 /* supported socket families */
157 typedef enum {
158 SOCKET_UNSPEC,
159 SOCKET_INET,
160 SOCKET_IN6,
161 SOCKET_UNIX
162 } SocketFamily;
163
164 /* Generic socket address structure. Note that for Unix
165 * sockets, the path is stored in a heap-allocated block,
166 * unless the 'owner' field is cleared. If this is the case,
167 */
168 typedef struct {
169 SocketFamily family;
170 union {
171 struct {
172 uint16_t port;
173 uint32_t address;
174 } inet;
175 struct {
176 uint16_t port;
177 uint8_t address[16];
178 } in6;
179 struct {
180 int owner;
181 const char* path;
182 } _unix;
183 } u;
184 } SockAddress;
185
186 #define SOCK_ADDRESS_INET_ANY 0x00000000
187 #define SOCK_ADDRESS_INET_LOOPBACK 0x7f000001
188
189 /* initialize a new IPv4 socket address, the IP address and port are
190 * in host endianess.
191 */
192 void sock_address_init_inet( SockAddress* a, uint32_t ip, uint16_t port );
193
194 /* Initialize an IPv6 socket address, the address is in network order
195 * and the port in host endianess.
196 */
197 #if HAVE_IN6_SOCKETS
198 void sock_address_init_in6 ( SockAddress* a, const uint8_t* ip6[16], uint16_t port );
199 #endif
200
201 /* Intialize a Unix socket address, this will copy the 'path' string into the
202 * heap. You need to call sock_address_done() to release the copy
203 */
204 #if HAVE_UNIX_SOCKETS
205 void sock_address_init_unix( SockAddress* a, const char* path );
206 #endif
207
208 /* Finalize a socket address, only needed for now for Unix addresses */
209 void sock_address_done( SockAddress* a );
210
211 int sock_address_equal( const SockAddress* a, const SockAddress* b );
212
213 /* THIS SHOULD DISAPPEAR SOON - TRANSITIONAL HELPER */
214 int sock_address_to_bsd( const SockAddress* a, void* sa, size_t* salen );
215 int sock_address_from_bsd( SockAddress* a, const void* sa, size_t salen );
216 int sock_address_to_inet( SockAddress* a, int *paddr_ip, int *paddr_port );
217
218 /* return a static string describing the address */
219 const char* sock_address_to_string( const SockAddress* a );
220
221 static __inline__
sock_address_get_family(const SockAddress * a)222 SocketFamily sock_address_get_family( const SockAddress* a )
223 {
224 return a->family;
225 }
226
227 /* return the port number of a given socket address, or -1 if it's a Unix one */
228 int sock_address_get_port( const SockAddress* a );
229
230 /* set the port number of a given socket address, don't do anything for Unix ones */
231 void sock_address_set_port( SockAddress* a, uint16_t port );
232
233 /* return the path of a given Unix socket, returns NULL for non-Unix ones */
234 const char* sock_address_get_path( const SockAddress* a );
235
236 /* return the inet address, or -1 if it's not SOCKET_INET */
237 int sock_address_get_ip( const SockAddress* a );
238
239 /* bufprint a socket address into a human-readable string */
240 char* bufprint_sock_address( char* p, char* end, const SockAddress* a );
241
242 /* resolve a hostname or decimal IPv4/IPv6 address into a socket address.
243 * returns 0 on success, or -1 on failure. Note that the values or errno
244 * set by this function are the following:
245 *
246 * EINVAL : invalid argument
247 * EHOSTDOWN : could not reach DNS server
248 * ENOENT : no host with this name, or host doesn't have any IP address
249 * ENOMEM : not enough memory to perform request
250 */
251 int sock_address_init_resolve( SockAddress* a,
252 const char* hostname,
253 uint16_t port,
254 int preferIn6 );
255
256 int sock_address_get_numeric_info( SockAddress* a,
257 char* host,
258 size_t hostlen,
259 char* serv,
260 size_t servlen );
261
262 /* Support for listing all socket addresses of a given host */
263 enum {
264 SOCKET_LIST_PASSIVE = (1 << 0),
265 SOCKET_LIST_FORCE_INET = (1 << 1),
266 SOCKET_LIST_FORCE_IN6 = (1 << 2)
267 };
268
269 /* resolve a host and service/port name into a list of SockAddress objects.
270 * returns a NULL-terminated array of SockAddress pointers on success,
271 * or NULL in case of failure, with the value of errno set to one of the
272 * following:
273 *
274 * EINVAL : invalid argument
275 * EHOSTDOWN : could not reach DNS server
276 * ENOENT : no host with this name, or host doesn't have IP address
277 * ENOMEM : not enough memory to perform request
278 *
279 * other system-level errors can also be set depending on the host sockets
280 * implementation.
281 *
282 * This function loops on EINTR so the caller shouldn't have to check for it.
283 */
284 SockAddress** sock_address_list_create( const char* hostname,
285 const char* port,
286 unsigned flags );
287
288 void sock_address_list_free( SockAddress** list );
289
290 /* create a new socket, return the socket number of -1 on failure */
291 int socket_create( SocketFamily family, SocketType type );
292
293 /* create a new socket intended for IPv4 communication. returns the socket number,
294 * or -1 on failure.
295 */
296 int socket_create_inet( SocketType type );
297
298 /* create a new socket intended for IPv6 communication. returns the socket number,
299 * or -1 on failure.
300 */
301 #if HAVE_IN6_SOCKETS
302 int socket_create_in6 ( SocketType type );
303 #endif
304
305 /* create a unix/local domain socket. returns the socket number,
306 * or -1 on failure.
307 */
308 #if HAVE_UNIX_SOCKETS
309 int socket_create_unix( SocketType type );
310 #endif
311
312 /* return the type of a given socket */
313 SocketType socket_get_type(int fd);
314
315 /* set SO_REUSEADDR on Unix, SO_EXCLUSIVEADDR on Windows */
316 int socket_set_xreuseaddr(int fd);
317
318 /* set socket in non-blocking mode */
319 int socket_set_nonblock(int fd);
320
321 /* set socket in blocking mode */
322 int socket_set_blocking(int fd);
323
324 /* disable the TCP Nagle algorithm for lower latency */
325 int socket_set_nodelay(int fd);
326
327 /* send OOB data inline for this socket */
328 int socket_set_oobinline(int fd);
329
330 /* force listening to IPv6 interfaces only */
331 int socket_set_ipv6only(int fd);
332
333 /* retrieve last socket error code */
334 int socket_get_error(int fd);
335
336 /* close an opened socket. Note that this is unlike the Unix 'close' because:
337 * - it will properly shutdown the socket in the background
338 * - it does not modify errno
339 */
340 void socket_close( int fd );
341
342 /* the following functions are equivalent to the BSD sockets ones
343 */
344 int socket_recv ( int fd, void* buf, int buflen );
345 int socket_recvfrom( int fd, void* buf, int buflen, SockAddress* from );
346
347 int socket_send ( int fd, const void* buf, int buflen );
348 int socket_send_oob( int fd, const void* buf, int buflen );
349 int socket_sendto( int fd, const void* buf, int buflen, const SockAddress* to );
350
351 int socket_connect( int fd, const SockAddress* address );
352 int socket_bind( int fd, const SockAddress* address );
353 int socket_get_address( int fd, SockAddress* address );
354 int socket_get_peer_address( int fd, SockAddress* address );
355 int socket_listen( int fd, int backlog );
356 int socket_accept( int fd, SockAddress* address );
357
358 /* returns the number of bytes that can be read from a socket */
359 int socket_can_read( int fd );
360
361 /* this call creates a pair of non-blocking sockets connected
362 * to each other. this is equivalent to calling the Unix function:
363 * socketpair(AF_LOCAL,SOCK_STREAM,0,&fds)
364 *
365 * on Windows, this will use a pair of TCP loopback sockets instead
366 * returns 0 on success, -1 on error.
367 */
368 int socket_pair(int *fd1, int *fd2);
369
370 /* create a server socket listening on the host's loopback interface */
371 int socket_loopback_server( int port, SocketType type );
372
373 /* connect to a port on the host's loopback interface */
374 int socket_loopback_client( int port, SocketType type );
375
376 /* create a server socket listening to a Unix domain path */
377 #if HAVE_UNIX_SOCKETS
378 int socket_unix_server( const char* name, SocketType type );
379 #endif
380
381 /* create a Unix sockets and connects it to a Unix server */
382 #if HAVE_UNIX_SOCKETS
383 int socket_unix_client( const char* name, SocketType type );
384 #endif
385
386 /* create an IPv4 client socket and connect it to a given host */
387 int socket_network_client( const char* host, int port, SocketType type );
388
389 /* create an IPv4 socket and binds it to a given port of the host's interface */
390 int socket_anyaddr_server( int port, SocketType type );
391
392 /* accept a connection from the host's any interface, return the new socket
393 * descriptor or -1 */
394 int socket_accept_any( int server_fd );
395
396
397 int socket_mcast_inet_add_membership( int s, uint32_t ip );
398 int socket_mcast_inet_drop_membership( int s, uint32_t ip );
399 int socket_mcast_inet_set_loop( int s, int enabled );
400 int socket_mcast_inet_set_ttl( int s, int ttl );
401
402 #endif /* QEMU_SOCKET_H */
403