]> asedeno.scripts.mit.edu Git - PuTTY.git/blob - proxy.h
SOCKS proxy support added (next instalment of Justin Bradford's
[PuTTY.git] / proxy.h
1 /*
2  * Network proxy abstraction in PuTTY
3  *
4  * A proxy layer, if necessary, wedges itself between the
5  * network code and the higher level backend.
6  *
7  * Supported proxies: HTTP CONNECT, generic telnet
8  * In progress: SOCKS
9  */
10
11 #ifndef PUTTY_PROXY_H
12 #define PUTTY_PROXY_H
13
14 #define PROXY_ERROR_GENERAL 8000
15 #define PROXY_ERROR_UNEXPECTED 8001
16
17 typedef struct Socket_proxy_tag * Proxy_Socket;
18
19 struct Socket_proxy_tag {
20     struct socket_function_table *fn;
21     /* the above variable absolutely *must* be the first in this structure */
22
23     char * error;
24
25     Socket sub_socket;
26     Plug plug;
27     SockAddr remote_addr;
28     int remote_port;
29
30     bufchain pending_output_data;
31     bufchain pending_oob_output_data;
32     int pending_flush;
33     bufchain pending_input_data;
34
35 #define PROXY_STATE_NEW    -1
36 #define PROXY_STATE_ACTIVE  0
37
38     int state; /* proxy states greater than 0 are implementation
39                 * dependent, but represent various stages/states
40                 * of the initialization/setup/negotiation with the
41                 * proxy server.
42                 */
43     int freeze; /* should we freeze the underlying socket when
44                  * we are done with the proxy negotiation? this
45                  * simply caches the value of sk_set_frozen calls.
46                  */
47
48 #define PROXY_CHANGE_NEW      -1
49 #define PROXY_CHANGE_CLOSING   0
50 #define PROXY_CHANGE_SENT      1
51 #define PROXY_CHANGE_RECEIVE   2
52 #define PROXY_CHANGE_ACCEPTING 3
53
54     /* something has changed (a call from the sub socket
55      * layer into our Proxy Plug layer, or we were just
56      * created, etc), so the proxy layer needs to handle
57      * this change (the type of which is the second argument)
58      * and further the proxy negotiation process.
59      */
60
61     int (*negotiate) (Proxy_Socket /* this */, int /* change type */);
62
63     /* current arguments of plug handlers
64      * (for use by proxy's negotiate function)
65      */
66
67     /* closing */
68     char *closing_error_msg;
69     int closing_error_code;
70     int closing_calling_back;
71
72     /* receive */
73     int receive_urgent;
74     char *receive_data;
75     int receive_len;
76
77     /* sent */
78     int sent_bufsize;
79
80     /* accepting */
81     void *accepting_sock;
82
83 };
84
85 typedef struct Plug_proxy_tag * Proxy_Plug;
86
87 struct Plug_proxy_tag {
88     struct plug_function_table *fn;
89     /* the above variable absolutely *must* be the first in this structure */
90
91     Proxy_Socket proxy_socket;
92
93 };
94
95 extern void proxy_activate (Proxy_Socket);
96
97 extern int proxy_http_negotiate (Proxy_Socket, int);
98 extern int proxy_telnet_negotiate (Proxy_Socket, int);
99 extern int proxy_socks4_negotiate (Proxy_Socket, int);
100 extern int proxy_socks5_negotiate (Proxy_Socket, int);
101
102 #endif