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