1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
/* Copyright (C) 2007-2008 The Android Open Source Project
**
** This software is licensed under the terms of the GNU General Public
** License version 2, as published by the Free Software Foundation, and
** may be copied, distributed, and modified under those terms.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
*/
#ifndef _PROXY_INT_H
#define _PROXY_INT_H
#include "proxy_common.h"
#include "sockets.h"
extern int proxy_log;
extern void
proxy_LOG(const char* fmt, ...);
#define PROXY_LOG(...) \
do { if (proxy_log) proxy_LOG(__VA_ARGS__); } while (0)
/* sockets proxy manager internals */
typedef struct ProxyConnection ProxyConnection;
typedef struct ProxyService ProxyService;
/* root ProxyConnection object */
struct ProxyConnection {
int socket;
struct sockaddr_in address; /* for debugging */
ProxyConnection* next;
ProxyConnection* prev;
ProxyEventFunc ev_func;
void* ev_opaque;
ProxyService* service;
/* the following is useful for all types of services */
char name[64]; /* for debugging purposes */
int buffer_pos;
int buffer_len;
char* buffer;
char buffer0[ 1024 ];
/* rest of data depend on ProxyService */
};
extern void
proxy_connection_init( ProxyConnection* conn,
int socket,
struct sockaddr_in* address,
ProxyService* service );
extern void
proxy_connection_done( ProxyConnection* conn );
extern void
proxy_connection_free( ProxyConnection* conn,
ProxyEvent event );
/* tries to send data from the connection's buffer to the proxy.
* returns 1 when all data has been sent (i.e. buffer_pos == buffer_len),
* 0 if there is still some data to send, or -1 in case of error
*/
extern int
proxy_connection_send( ProxyConnection* conn );
/* tries to receive data from the connection's buffer from the proxy
* returns 1 when all data has been received (buffer_pos == buffer_len)
* returns 0 if there is still some data to receive
* returns -1 in case of error
*/
extern int
proxy_connection_receive( ProxyConnection* conn );
/* tries to receive a line of text from the proxy
* returns 1 when a line has been received
* returns 0 if there is still some data to receive
* returns -1 in case of error
*/
extern int
proxy_connection_receive_line( ProxyConnection* conn );
/* base64 encode a source string, returns size of encoded result,
* or -1 if there was not enough room in the destination buffer
*/
extern int
proxy_base64_encode( const char* src, int srclen,
char* dst, int dstlen );
extern int
proxy_resolve_server( struct sockaddr_in* addr,
const char* servername,
int servernamelen,
int serverport );
/* a ProxyService is really a proxy server and associated options */
enum {
PROXY_SELECT_READ = (1 << 0),
PROXY_SELECT_WRITE = (1 << 1),
PROXY_SELECT_ERROR = (1 << 2)
};
/* destroy a given proxy service */
typedef void (*ProxyServiceFreeFunc) ( void* opaque );
/* tries to create a new proxified connection, returns NULL if the service can't
* handle this address */
typedef ProxyConnection* (*ProxyServiceConnectFunc)( void* opaque,
int socket,
struct sockaddr_in* address );
/* free a given proxified connection */
typedef void (*ProxyConnectionFreeFunc) ( ProxyConnection* conn );
/* return flags corresponding to the select() events to wait to a proxified connection */
typedef unsigned (*ProxyConnectionSelectFunc) ( ProxyConnection* conn );
/* action a proxy connection when select() returns certain events for its socket */
typedef void (*ProxyConnectionPollFunc) ( ProxyConnection* conn,
unsigned select_flags );
struct ProxyService {
void* opaque;
ProxyServiceFreeFunc serv_free;
ProxyServiceConnectFunc serv_connect;
ProxyConnectionFreeFunc conn_free;
ProxyConnectionSelectFunc conn_select;
ProxyConnectionPollFunc conn_poll;
};
extern int
proxy_manager_add_service( ProxyService* service );
#endif /* _PROXY_INT_H */
|