sockets.h revision ce0f4b02160ee72d7d2428867fe757bc37c68c98
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/* THIS SHOULD DISAPPEAR SOON - TRANSITIONAL HELPER */ 2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint sock_address_to_bsd( const SockAddress* a, void* sa, size_t* salen ); 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint sock_address_from_bsd( SockAddress* a, const void* sa, size_t salen ); 2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint sock_address_to_inet( SockAddress* a, int *paddr_ip, int *paddr_port ); 2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* return a static string describing the address */ 2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst char* sock_address_to_string( const SockAddress* a ); 2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic __inline__ 2225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerSocketFamily sock_address_get_family( const SockAddress* a ) 2235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 2245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return a->family; 2255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 2265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* return the port number of a given socket address, or -1 if it's a Unix one */ 2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint sock_address_get_port( const SockAddress* a ); 2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* set the port number of a given socket address, don't do anything for Unix ones */ 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid sock_address_set_port( SockAddress* a, uint16_t port ); 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* return the path of a given Unix socket, returns NULL for non-Unix ones */ 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst char* sock_address_get_path( const SockAddress* a ); 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* return the inet address, or -1 if it's not SOCKET_INET */ 2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint sock_address_get_ip( const SockAddress* a ); 2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* bufprint a socket address into a human-readable string */ 2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectchar* bufprint_sock_address( char* p, char* end, const SockAddress* a ); 2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* resolve a hostname or decimal IPv4/IPv6 address into a socket address. 2437d9a2705e7ae6d8c4b1d9d5b4e2a67ab88c19044David Turner * returns 0 on success, or -1 on failure. Note that the values or errno 2447d9a2705e7ae6d8c4b1d9d5b4e2a67ab88c19044David Turner * set by this function are the following: 2457d9a2705e7ae6d8c4b1d9d5b4e2a67ab88c19044David Turner * 2467d9a2705e7ae6d8c4b1d9d5b4e2a67ab88c19044David Turner * EINVAL : invalid argument 2477d9a2705e7ae6d8c4b1d9d5b4e2a67ab88c19044David Turner * EHOSTDOWN : could not reach DNS server 2487d9a2705e7ae6d8c4b1d9d5b4e2a67ab88c19044David Turner * ENOENT : no host with this name, or host doesn't have any IP address 2497d9a2705e7ae6d8c4b1d9d5b4e2a67ab88c19044David Turner * ENOMEM : not enough memory to perform request 2507d9a2705e7ae6d8c4b1d9d5b4e2a67ab88c19044David Turner */ 2517d9a2705e7ae6d8c4b1d9d5b4e2a67ab88c19044David Turnerint sock_address_init_resolve( SockAddress* a, 2527d9a2705e7ae6d8c4b1d9d5b4e2a67ab88c19044David Turner const char* hostname, 2537d9a2705e7ae6d8c4b1d9d5b4e2a67ab88c19044David Turner uint16_t port, 2547d9a2705e7ae6d8c4b1d9d5b4e2a67ab88c19044David Turner int preferIn6 ); 2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint sock_address_get_numeric_info( SockAddress* a, 2575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner char* host, 2585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner size_t hostlen, 2595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner char* serv, 2605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner size_t servlen ); 2615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 2625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Support for listing all socket addresses of a given host */ 2635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerenum { 2645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner SOCKET_LIST_PASSIVE = (1 << 0), 2655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner SOCKET_LIST_FORCE_INET = (1 << 1), 2665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner SOCKET_LIST_FORCE_IN6 = (1 << 2) 2675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}; 2685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 2695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* resolve a host and service/port name into a list of SockAddress objects. 2705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * returns a NULL-terminated array of SockAddress pointers on success, 2715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * or NULL in case of failure, with the value of errno set to one of the 2725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * following: 2735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * 2745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * EINVAL : invalid argument 2755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * EHOSTDOWN : could not reach DNS server 2765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * ENOENT : no host with this name, or host doesn't have IP address 2775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * ENOMEM : not enough memory to perform request 2785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * 2795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * other system-level errors can also be set depending on the host sockets 2805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * implementation. 2815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * 2825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * This function loops on EINTR so the caller shouldn't have to check for it. 2835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */ 2845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerSockAddress** sock_address_list_create( const char* hostname, 2855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner const char* port, 2865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner unsigned flags ); 2875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 2885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid sock_address_list_free( SockAddress** list ); 2895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* create a new socket, return the socket number of -1 on failure */ 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_create( SocketFamily family, SocketType type ); 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* create a new socket intended for IPv4 communication. returns the socket number, 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * or -1 on failure. 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_create_inet( SocketType type ); 2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* create a new socket intended for IPv6 communication. returns the socket number, 2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * or -1 on failure. 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if HAVE_IN6_SOCKETS 3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_create_in6 ( SocketType type ); 3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* create a unix/local domain socket. returns the socket number, 3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * or -1 on failure. 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if HAVE_UNIX_SOCKETS 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_create_unix( SocketType type ); 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* return the type of a given socket */ 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectSocketType socket_get_type(int fd); 3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* set SO_REUSEADDR on Unix, SO_EXCLUSIVEADDR on Windows */ 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_set_xreuseaddr(int fd); 3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* set socket in non-blocking mode */ 3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_set_nonblock(int fd); 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* set socket in blocking mode */ 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_set_blocking(int fd); 3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* disable the TCP Nagle algorithm for lower latency */ 3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_set_nodelay(int fd); 3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* send OOB data inline for this socket */ 3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_set_oobinline(int fd); 3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* force listening to IPv6 interfaces only */ 3315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint socket_set_ipv6only(int fd); 3325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 3335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* retrieve last socket error code */ 3345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint socket_get_error(int fd); 3355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* close an opened socket. Note that this is unlike the Unix 'close' because: 3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * - it will properly shutdown the socket in the background 3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * - it does not modify errno 3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid socket_close( int fd ); 3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* the following functions are equivalent to the BSD sockets ones 3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_recv ( int fd, void* buf, int buflen ); 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_recvfrom( int fd, void* buf, int buflen, SockAddress* from ); 3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_send ( int fd, const void* buf, int buflen ); 3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_send_oob( int fd, const void* buf, int buflen ); 3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_sendto( int fd, const void* buf, int buflen, const SockAddress* to ); 3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_connect( int fd, const SockAddress* address ); 3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_bind( int fd, const SockAddress* address ); 3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_get_address( int fd, SockAddress* address ); 3545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint socket_get_peer_address( int fd, SockAddress* address ); 3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_listen( int fd, int backlog ); 3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_accept( int fd, SockAddress* address ); 3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* returns the number of bytes that can be read from a socket */ 3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_can_read( int fd ); 3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* this call creates a pair of non-blocking sockets connected 3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * to each other. this is equivalent to calling the Unix function: 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * socketpair(AF_LOCAL,SOCK_STREAM,0,&fds) 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * on Windows, this will use a pair of TCP loopback sockets instead 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * returns 0 on success, -1 on error. 3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_pair(int *fd1, int *fd2); 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* create a server socket listening on the host's loopback interface */ 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_loopback_server( int port, SocketType type ); 3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* connect to a port on the host's loopback interface */ 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_loopback_client( int port, SocketType type ); 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* create a server socket listening to a Unix domain path */ 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if HAVE_UNIX_SOCKETS 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_unix_server( const char* name, SocketType type ); 3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* create a Unix sockets and connects it to a Unix server */ 3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if HAVE_UNIX_SOCKETS 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_unix_client( const char* name, SocketType type ); 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* create an IPv4 client socket and connect it to a given host */ 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_network_client( const char* host, int port, SocketType type ); 3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* create an IPv4 socket and binds it to a given port of the host's interface */ 3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_anyaddr_server( int port, SocketType type ); 3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* accept a connection from the host's any interface, return the new socket 3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * descriptor or -1 */ 3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_accept_any( int server_fd ); 3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_mcast_inet_add_membership( int s, uint32_t ip ); 3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_mcast_inet_drop_membership( int s, uint32_t ip ); 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_mcast_inet_set_loop( int s, int enabled ); 4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint socket_mcast_inet_set_ttl( int s, int ttl ); 4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* QEMU_SOCKET_H */ 403