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#ifndef _PROXY_INT_H 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define _PROXY_INT_H 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "proxy_common.h" 16cc330d4169441727fecf1da08aee806fc021c4e2David 'Digit' Turner#include "android/sockets.h" 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/stralloc.h" 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int proxy_log; 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectproxy_LOG(const char* fmt, ...); 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PROXY_LOG(...) \ 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do { if (proxy_log) proxy_LOG(__VA_ARGS__); } while (0) 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* ProxySelect is used to handle events */ 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectenum { 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PROXY_SELECT_READ = (1 << 0), 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PROXY_SELECT_WRITE = (1 << 1), 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PROXY_SELECT_ERROR = (1 << 2) 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct { 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int* pcount; 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fd_set* reads; 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fd_set* writes; 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fd_set* errors; 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} ProxySelect; 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void proxy_select_set( ProxySelect* sel, 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int fd, 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned flags ); 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern unsigned proxy_select_poll( ProxySelect* sel, int fd ); 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* sockets proxy manager internals */ 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct ProxyConnection ProxyConnection; 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct ProxyService ProxyService; 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* free a given proxified connection */ 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef void (*ProxyConnectionFreeFunc) ( ProxyConnection* conn ); 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* modify the ProxySelect to tell which events to listen to */ 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef void (*ProxyConnectionSelectFunc) ( ProxyConnection* conn, 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ProxySelect* sel ); 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* action a proxy connection when select() returns certain events for its socket */ 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef void (*ProxyConnectionPollFunc) ( ProxyConnection* conn, 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ProxySelect* sel ); 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* root ProxyConnection object */ 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct ProxyConnection { 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int socket; 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SockAddress address; /* for debugging */ 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ProxyConnection* next; 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ProxyConnection* prev; 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ProxyEventFunc ev_func; 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void* ev_opaque; 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ProxyService* service; 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* the following is useful for all types of services */ 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char name[64]; /* for debugging purposes */ 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project stralloc_t str[1]; /* network buffer (dynamic) */ 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int str_pos; /* see proxy_connection_send() */ 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int str_sent; /* see proxy_connection_send() */ 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int str_recv; /* see proxy_connection_receive() */ 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* connection methods */ 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ProxyConnectionFreeFunc conn_free; 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ProxyConnectionSelectFunc conn_select; 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ProxyConnectionPollFunc conn_poll; 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* rest of data depend on exact implementation */ 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectproxy_connection_init( ProxyConnection* conn, 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int socket, 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SockAddress* address, 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ProxyService* service, 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ProxyConnectionFreeFunc conn_free, 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ProxyConnectionSelectFunc conn_select, 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ProxyConnectionPollFunc conn_poll ); 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectproxy_connection_done( ProxyConnection* conn ); 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* free the proxy connection object. this will also 108c005246ed03de874fdc432073ba8e5e8ebfed922David 'Digit' Turner * close the corresponding socket unless the 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 'keep_alive' flag is set to TRUE. 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectproxy_connection_free( ProxyConnection* conn, 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int keep_alive, 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ProxyEvent event ); 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* status of data transfer operations */ 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef enum { 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DATA_ERROR = -1, 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DATA_NEED_MORE = 0, 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DATA_COMPLETED = 1 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} DataStatus; 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* try to send data from the connection's buffer to a socket. 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * starting from offset conn->str_pos in the buffer 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * returns DATA_COMPLETED if everything could be written 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * returns DATA_ERROR for a socket disconnection or error 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * returns DATA_NEED_MORE if all data could not be sent. 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * on exit, conn->str_sent contains the number of bytes 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * that were really sent. conn->str_pos will be incremented 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * by conn->str_sent as well. 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * note that in case of success (DATA_COMPLETED), this also 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * performs a proxy_connection_rewind which sets conn->str_pos 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * to 0. 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern DataStatus 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectproxy_connection_send( ProxyConnection* conn, int fd ); 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* try to read 'wanted' bytes into conn->str from a socket 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * returns DATA_COMPLETED if all bytes could be read 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * returns DATA_NEED_MORE if not all bytes could be read 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * returns DATA_ERROR in case of socket disconnection or error 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * on exit, the amount of data received is in conn->str_recv 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern DataStatus 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectproxy_connection_receive( ProxyConnection* conn, int fd, int wanted ); 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* tries to receive a line of text from the proxy. 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * when an entire line is read, the trailing \r\n is stripped 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * and replaced by a terminating zero. str->n will be the 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * lenght of the line, exclusing the terminating zero. 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * returns 1 when a line has been received 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * returns 0 if there is still some data to receive 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * returns -1 in case of error 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern DataStatus 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectproxy_connection_receive_line( ProxyConnection* conn, int fd ); 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* rewind the string buffer for a new operation */ 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectproxy_connection_rewind( ProxyConnection* conn ); 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* base64 encode a source string, returns size of encoded result, 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * or -1 if there was not enough room in the destination buffer 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectproxy_base64_encode( const char* src, int srclen, 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* dst, int dstlen ); 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectproxy_resolve_server( SockAddress* addr, 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* servername, 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int servernamelen, 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int serverport ); 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* a ProxyService is really a proxy server and associated options */ 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* destroy a given proxy service */ 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef void (*ProxyServiceFreeFunc) ( void* opaque ); 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* tries to create a new proxified connection, returns NULL if the service can't 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * handle this address */ 1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef ProxyConnection* (*ProxyServiceConnectFunc)( void* opaque, 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SocketType socket_type, 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const SockAddress* address ); 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct ProxyService { 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void* opaque; 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ProxyServiceFreeFunc serv_free; 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ProxyServiceConnectFunc serv_connect; 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectproxy_manager_add_service( ProxyService* service ); 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* _PROXY_INT_H */ 202