18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Copyright (C) 2007-2008 The Android Open Source Project
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project**
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This software is licensed under the terms of the GNU General Public
48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** License version 2, as published by the Free Software Foundation, and
58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** may be copied, distributed, and modified under those terms.
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project**
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This program is distributed in the hope that it will be useful,
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** but WITHOUT ANY WARRANTY; without even the implied warranty of
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** GNU General Public License for more details.
118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*/
128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* headers to use the BSD sockets */
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef QEMU_SOCKET_H
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define QEMU_SOCKET_H
158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stddef.h>
178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdint.h>
188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <errno.h>
198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* we're going to hide the implementation details of sockets behind
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * a simple wrapper interface declared here.
228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * all socket operations set the global 'errno' variable on error.
248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * this is unlike Winsock which instead modifies another internal
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * variable accessed through WSAGetLastError() and WSASetLastError()
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* the wrapper will convert any Winsock error message into an errno
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * code for you. There are however a few standard Unix error codes
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * that are not defined by the MS C library headers, so we add them
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * here. We use the official Winsock error codes, which are documented
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * even though we don't want to include the Winsock headers
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  ifndef EINTR
368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#    define EINTR        10004
378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  endif
38ce0f4b02160ee72d7d2428867fe757bc37c68c98David 'Digit' Turner#  ifndef EAGAIN
39ce0f4b02160ee72d7d2428867fe757bc37c68c98David 'Digit' Turner#    define EAGAIN       10035
40ce0f4b02160ee72d7d2428867fe757bc37c68c98David 'Digit' Turner#  endif
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  ifndef EWOULDBLOCK
42ce0f4b02160ee72d7d2428867fe757bc37c68c98David 'Digit' Turner#    define EWOULDBLOCK  EAGAIN
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  endif
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  ifndef EINPROGRESS
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#    define EINPROGRESS  10036
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  endif
478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  ifndef EALREADY
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#    define EALREADY     10037
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  endif
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  ifndef EDESTADDRREQ
518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#    define EDESTADDRREQ 10039
528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  endif
538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  ifndef EMSGSIZE
548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#    define EMSGSIZE     10040
558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  endif
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  ifndef EPROTOTYPE
578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#    define EPROTOTYPE   10041
588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  endif
598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  ifndef ENOPROTOOPT
608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#    define ENOPROTOOPT  10042
618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  endif
625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#  ifndef EAFNOSUPPORT
635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#    define EAFNOSUPPORT 10047
645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#  endif
658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  ifndef EADDRINUSE
668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#    define EADDRINUSE   10048
678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  endif
688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  ifndef EADDRNOTAVAIL
698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#    define EADDRNOTAVAIL 10049
708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  endif
718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  ifndef ENETDOWN
728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#    define ENETDOWN     10050
738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  endif
748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  ifndef ENETUNREACH
758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#    define ENETUNREACH  10051
768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  endif
778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  ifndef ENETRESET
788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#    define ENETRESET    10052
798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  endif
808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  ifndef ECONNABORTED
818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#    define ECONNABORTED 10053
828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  endif
838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  ifndef ECONNRESET
848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#    define ECONNRESET   10054
858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  endif
868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  ifndef ENOBUFS
878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#    define ENOBUFS      10055
888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  endif
898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  ifndef EISCONN
908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#    define EISCONN      10056
918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  endif
928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  ifndef ENOTCONN
938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#    define ENOTCONN     10057
948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  endif
958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  ifndef ESHUTDOWN
968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#    define ESHUTDOWN     10058
978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  endif
988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  ifndef ETOOMANYREFS
998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#    define ETOOMANYREFS  10059
1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  endif
1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  ifndef ETIMEDOUT
1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#    define ETIMEDOUT     10060
1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  endif
1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  ifndef ECONNREFUSED
1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#    define ECONNREFUSED  10061
1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  endif
1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  ifndef ELOOP
1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#    define ELOOP         10062
1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  endif
1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  ifndef EHOSTDOWN
1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#    define EHOSTDOWN     10064
1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  endif
1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  ifndef EHOSTUNREACH
1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#    define EHOSTUNREACH  10065
1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  endif
1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* _WIN32 */
1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Define 'errno_str' as a handy macro to return the string
1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * corresponding to a given errno code. On Unix, this is
1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * equivalent to strerror(errno), but on Windows, this will
1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * take care of Winsock-originated errors as well.
1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32
1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  extern const char*  _errno_str(void);
1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  define  errno_str   _errno_str()
1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  define  errno_str   strerror(errno)
1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* always enable IPv6 sockets for now.
1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the QEMU internal router is not capable of
1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * supporting them, but we plan to replace it
1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * with something better in the future.
1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  HAVE_IN6_SOCKETS   1
1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Unix sockets are not available on Win32 */
1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef _WIN32
1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  define  HAVE_UNIX_SOCKETS  1
1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* initialize the socket sub-system. this must be called before
1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * using any of the declarations below.
1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint  socket_init( void );
1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* return the name of the current host */
1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectchar*  host_name( void );
1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* supported socket types */
1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef enum {
1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SOCKET_DGRAM = 0,
1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SOCKET_STREAM
1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} SocketType;
1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* supported socket families */
1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef enum {
1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SOCKET_UNSPEC,
1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SOCKET_INET,
1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SOCKET_IN6,
1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SOCKET_UNIX
1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} SocketFamily;
1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Generic socket address structure. Note that for Unix
1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * sockets, the path is stored in a heap-allocated block,
1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * unless the 'owner' field is cleared. If this is the case,
1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct {
1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SocketFamily  family;
1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    union {
1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        struct {
1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            uint16_t   port;
1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            uint32_t   address;
1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        } inet;
1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        struct {
1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            uint16_t   port;
1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            uint8_t    address[16];
1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        } in6;
1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        struct {
1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            int          owner;
1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            const char*  path;
1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        } _unix;
1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    } u;
1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} SockAddress;
1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  SOCK_ADDRESS_INET_ANY       0x00000000
1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  SOCK_ADDRESS_INET_LOOPBACK  0x7f000001
1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* initialize a new IPv4 socket address, the IP address and port are
1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * in host endianess.
1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid  sock_address_init_inet( SockAddress*  a, uint32_t  ip, uint16_t  port );
1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Initialize an IPv6 socket address, the address is in network order
1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * and the port in host endianess.
1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if HAVE_IN6_SOCKETS
1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid  sock_address_init_in6 ( SockAddress*  a, const uint8_t*  ip6[16], uint16_t  port );
1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Intialize a Unix socket address, this will copy the 'path' string into the
2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * heap. You need to call sock_address_done() to release the copy
2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if HAVE_UNIX_SOCKETS
2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid  sock_address_init_unix( SockAddress*  a, const char*  path );
2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Finalize a socket address, only needed for now for Unix addresses */
2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid  sock_address_done( SockAddress*  a );
2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint   sock_address_equal( const SockAddress*  a, const SockAddress*  b );
2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* return a static string describing the address */
2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst char*  sock_address_to_string( const SockAddress*  a );
2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic __inline__
2175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerSocketFamily  sock_address_get_family( const SockAddress*  a )
2185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
2195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    return a->family;
2205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
2215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* return the port number of a given socket address, or -1 if it's a Unix one */
2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint   sock_address_get_port( const SockAddress*  a );
2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* set the port number of a given socket address, don't do anything for Unix ones */
2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid  sock_address_set_port( SockAddress*  a, uint16_t  port );
2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* return the path of a given Unix socket, returns NULL for non-Unix ones */
2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst char*  sock_address_get_path( const SockAddress*  a );
2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* return the inet address, or -1 if it's not SOCKET_INET */
2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint   sock_address_get_ip( const SockAddress*  a );
2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* bufprint a socket address into a human-readable string */
2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectchar* bufprint_sock_address( char*  p, char*  end, const SockAddress*  a );
2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* resolve a hostname or decimal IPv4/IPv6 address into a socket address.
2387d9a2705e7ae6d8c4b1d9d5b4e2a67ab88c19044David Turner * returns 0 on success, or -1 on failure. Note that the values or errno
2397d9a2705e7ae6d8c4b1d9d5b4e2a67ab88c19044David Turner * set by this function are the following:
2407d9a2705e7ae6d8c4b1d9d5b4e2a67ab88c19044David Turner *
2417d9a2705e7ae6d8c4b1d9d5b4e2a67ab88c19044David Turner *   EINVAL    : invalid argument
2427d9a2705e7ae6d8c4b1d9d5b4e2a67ab88c19044David Turner *   EHOSTDOWN : could not reach DNS server
2437d9a2705e7ae6d8c4b1d9d5b4e2a67ab88c19044David Turner *   ENOENT    : no host with this name, or host doesn't have any IP address
2447d9a2705e7ae6d8c4b1d9d5b4e2a67ab88c19044David Turner *   ENOMEM    : not enough memory to perform request
2457d9a2705e7ae6d8c4b1d9d5b4e2a67ab88c19044David Turner */
2467d9a2705e7ae6d8c4b1d9d5b4e2a67ab88c19044David Turnerint   sock_address_init_resolve( SockAddress*  a,
2477d9a2705e7ae6d8c4b1d9d5b4e2a67ab88c19044David Turner                                 const char*   hostname,
2487d9a2705e7ae6d8c4b1d9d5b4e2a67ab88c19044David Turner                                 uint16_t      port,
2497d9a2705e7ae6d8c4b1d9d5b4e2a67ab88c19044David Turner                                 int           preferIn6 );
2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint  sock_address_get_numeric_info( SockAddress*  a,
2525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                    char*         host,
2535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                    size_t        hostlen,
2545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                    char*         serv,
2555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                    size_t        servlen );
2565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Support for listing all socket addresses of a given host */
2585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerenum {
2595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    SOCKET_LIST_PASSIVE    = (1 << 0),
2605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    SOCKET_LIST_FORCE_INET = (1 << 1),
261c611a19e65c13248bfd881a2d30681d7e24ea773David 'Digit' Turner    SOCKET_LIST_FORCE_IN6  = (1 << 2),
262c611a19e65c13248bfd881a2d30681d7e24ea773David 'Digit' Turner    SOCKET_LIST_DGRAM      = (1 << 3),
2635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner};
2645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* resolve a host and service/port name into a list of SockAddress objects.
2665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * returns a NULL-terminated array of SockAddress pointers on success,
2675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * or NULL in case of failure, with the value of errno set to one of the
2685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * following:
2695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *
2705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *    EINVAL    : invalid argument
2715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *    EHOSTDOWN : could not reach DNS server
2725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *    ENOENT    : no host with this name, or host doesn't have IP address
2735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *    ENOMEM    : not enough memory to perform request
2745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *
2755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * other system-level errors can also be set depending on the host sockets
2765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * implementation.
2775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *
2785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * This function loops on EINTR so the caller shouldn't have to check for it.
2795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */
2805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerSockAddress**  sock_address_list_create( const char*  hostname,
2815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                         const char*  port,
2825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                         unsigned     flags );
2835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
28450eef01259415a59067de542a21f30f6f4b829d0Vladimir Chtchetkine/* resolve a string containing host and port name into a list of SockAddress
28550eef01259415a59067de542a21f30f6f4b829d0Vladimir Chtchetkine * objects. Parameter host_and_port should be in format [host:]port, where
28650eef01259415a59067de542a21f30f6f4b829d0Vladimir Chtchetkine * 'host' addresses the machine and must be resolvable into an IP address, and
28750eef01259415a59067de542a21f30f6f4b829d0Vladimir Chtchetkine * 'port' is a decimal numeric value for the port. 'host' is optional, and if
28850eef01259415a59067de542a21f30f6f4b829d0Vladimir Chtchetkine * ommited, localhost will be used.
28950eef01259415a59067de542a21f30f6f4b829d0Vladimir Chtchetkine * returns a NULL-terminated array of SockAddress pointers on success,
29050eef01259415a59067de542a21f30f6f4b829d0Vladimir Chtchetkine * or NULL in case of failure, with the value of errno set to one of the
29150eef01259415a59067de542a21f30f6f4b829d0Vladimir Chtchetkine * following:
29250eef01259415a59067de542a21f30f6f4b829d0Vladimir Chtchetkine *
29350eef01259415a59067de542a21f30f6f4b829d0Vladimir Chtchetkine *    EINVAL    : invalid argument
29450eef01259415a59067de542a21f30f6f4b829d0Vladimir Chtchetkine *    EHOSTDOWN : could not reach DNS server
29550eef01259415a59067de542a21f30f6f4b829d0Vladimir Chtchetkine *    ENOENT    : no host with this name, or host doesn't have IP address
29650eef01259415a59067de542a21f30f6f4b829d0Vladimir Chtchetkine *    ENOMEM    : not enough memory to perform request
29750eef01259415a59067de542a21f30f6f4b829d0Vladimir Chtchetkine *
29850eef01259415a59067de542a21f30f6f4b829d0Vladimir Chtchetkine * other system-level errors can also be set depending on the host sockets
29950eef01259415a59067de542a21f30f6f4b829d0Vladimir Chtchetkine * implementation.
30050eef01259415a59067de542a21f30f6f4b829d0Vladimir Chtchetkine *
30150eef01259415a59067de542a21f30f6f4b829d0Vladimir Chtchetkine * This function loops on EINTR so the caller shouldn't have to check for it.
30250eef01259415a59067de542a21f30f6f4b829d0Vladimir Chtchetkine */
30350eef01259415a59067de542a21f30f6f4b829d0Vladimir ChtchetkineSockAddress**  sock_address_list_create2(const char*  host_and_port,
30450eef01259415a59067de542a21f30f6f4b829d0Vladimir Chtchetkine                                         unsigned     flags );
30550eef01259415a59067de542a21f30f6f4b829d0Vladimir Chtchetkine
3065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid sock_address_list_free( SockAddress**  list );
3075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* create a new socket, return the socket number of -1 on failure */
3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint  socket_create( SocketFamily  family, SocketType  type );
3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* create a new socket intended for IPv4 communication. returns the socket number,
3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * or -1 on failure.
3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint   socket_create_inet( SocketType  type );
3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* create a new socket intended for IPv6 communication. returns the socket number,
3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * or -1 on failure.
3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if HAVE_IN6_SOCKETS
3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint   socket_create_in6 ( SocketType  type );
3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* create a unix/local domain socket. returns the socket number,
3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * or -1 on failure.
3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if HAVE_UNIX_SOCKETS
3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint   socket_create_unix( SocketType  type );
3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* return the type of a given socket */
3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectSocketType  socket_get_type(int  fd);
3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* set SO_REUSEADDR on Unix, SO_EXCLUSIVEADDR on Windows */
3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint  socket_set_xreuseaddr(int  fd);
3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* set socket in non-blocking mode */
3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint  socket_set_nonblock(int fd);
3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* set socket in blocking mode */
3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint  socket_set_blocking(int fd);
3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3426731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner/* set cork mode on Linux (if set, don't send partial frames). */
3436731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turnerint socket_set_cork(int fd, int value);
3446731cf52901064b55e19bae60ade2ccb5f69829cDavid 'Digit' Turner
3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* disable the TCP Nagle algorithm for lower latency */
3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint  socket_set_nodelay(int fd);
3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* send OOB data inline for this socket */
3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint  socket_set_oobinline(int  fd);
3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* force listening to IPv6 interfaces only */
3525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint  socket_set_ipv6only(int  fd);
3535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
3545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* retrieve last socket error code */
3555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint  socket_get_error(int  fd);
3565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* close an opened socket. Note that this is unlike the Unix 'close' because:
3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * - it will properly shutdown the socket in the background
3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * - it does not modify errno
3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid  socket_close( int  fd );
3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* the following functions are equivalent to the BSD sockets ones
3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint   socket_recv    ( int  fd, void*  buf, int  buflen );
3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint   socket_recvfrom( int  fd, void*  buf, int  buflen, SockAddress*  from );
3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint   socket_send  ( int  fd, const void*  buf, int  buflen );
3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint   socket_send_oob( int  fd, const void*  buf, int  buflen );
3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint   socket_sendto( int  fd, const void*  buf, int  buflen, const SockAddress*  to );
3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint   socket_connect( int  fd, const SockAddress*  address );
3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint   socket_bind( int  fd, const SockAddress*  address );
3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint   socket_get_address( int  fd, SockAddress*  address );
3755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint   socket_get_peer_address( int  fd, SockAddress*  address );
3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint   socket_listen( int  fd, int  backlog );
3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint   socket_accept( int  fd, SockAddress*  address );
3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* returns the number of bytes that can be read from a socket */
3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint   socket_can_read( int  fd );
3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* this call creates a pair of non-blocking sockets connected
3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * to each other. this is equivalent to calling the Unix function:
3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * socketpair(AF_LOCAL,SOCK_STREAM,0,&fds)
3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * on Windows, this will use a pair of TCP loopback sockets instead
3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * returns 0 on success, -1 on error.
3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint  socket_pair(int  *fd1, int *fd2);
3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* create a server socket listening on the host's loopback interface */
3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint  socket_loopback_server( int  port, SocketType  type );
3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* connect to a port on the host's loopback interface */
3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint  socket_loopback_client( int  port, SocketType  type );
3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* create a server socket listening to a Unix domain path */
3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if HAVE_UNIX_SOCKETS
3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint  socket_unix_server( const char*  name, SocketType  type );
4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* create a Unix sockets and connects it to a Unix server */
4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if HAVE_UNIX_SOCKETS
4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint  socket_unix_client( const char*  name, SocketType  type );
4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* create an IPv4 client socket and connect it to a given host */
4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint  socket_network_client( const char*  host, int  port, SocketType  type );
4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* create an IPv4 socket and binds it to a given port of the host's interface */
4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint  socket_anyaddr_server( int  port, SocketType  type );
4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* accept a connection from the host's any interface, return the new socket
4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * descriptor or -1 */
4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint  socket_accept_any( int  server_fd );
4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint  socket_mcast_inet_add_membership( int  s, uint32_t  ip );
4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint  socket_mcast_inet_drop_membership( int  s, uint32_t  ip );
4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint  socket_mcast_inet_set_loop( int  s, int  enabled );
4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint  socket_mcast_inet_set_ttl( int  s, int  ttl );
4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* QEMU_SOCKET_H */
424