mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-07-15 18:17:32 -05:00
Modernise the Socket/Plug vtable system.
Now I've got FROMFIELD, I can rework it so that structures providing an implementation of the Socket or Plug trait no longer have to have the vtable pointer as the very first thing in the structure. In particular, this means that the ProxySocket structure can now directly implement _both_ the Socket and Plug traits, which is always _logically_ how it's worked, but previously it had to be implemented via two separate structs linked to each other.
This commit is contained in:
108
proxy.c
108
proxy.c
@ -23,7 +23,7 @@
|
||||
* Call this when proxy negotiation is complete, so that this
|
||||
* socket can begin working normally.
|
||||
*/
|
||||
void proxy_activate (Proxy_Socket p)
|
||||
void proxy_activate (ProxySocket *p)
|
||||
{
|
||||
void *data;
|
||||
int len;
|
||||
@ -73,14 +73,14 @@ void proxy_activate (Proxy_Socket p)
|
||||
* unfreezing the actual underlying socket.
|
||||
*/
|
||||
if (!p->freeze)
|
||||
sk_set_frozen((Socket)p, 0);
|
||||
sk_set_frozen(&p->sockvt, 0);
|
||||
}
|
||||
|
||||
/* basic proxy socket functions */
|
||||
|
||||
static Plug sk_proxy_plug (Socket s, Plug p)
|
||||
{
|
||||
Proxy_Socket ps = (Proxy_Socket) s;
|
||||
ProxySocket *ps = FROMFIELD(s, ProxySocket, sockvt);
|
||||
Plug ret = ps->plug;
|
||||
if (p)
|
||||
ps->plug = p;
|
||||
@ -89,7 +89,7 @@ static Plug sk_proxy_plug (Socket s, Plug p)
|
||||
|
||||
static void sk_proxy_close (Socket s)
|
||||
{
|
||||
Proxy_Socket ps = (Proxy_Socket) s;
|
||||
ProxySocket *ps = FROMFIELD(s, ProxySocket, sockvt);
|
||||
|
||||
sk_close(ps->sub_socket);
|
||||
sk_addr_free(ps->remote_addr);
|
||||
@ -98,7 +98,7 @@ static void sk_proxy_close (Socket s)
|
||||
|
||||
static int sk_proxy_write (Socket s, const void *data, int len)
|
||||
{
|
||||
Proxy_Socket ps = (Proxy_Socket) s;
|
||||
ProxySocket *ps = FROMFIELD(s, ProxySocket, sockvt);
|
||||
|
||||
if (ps->state != PROXY_STATE_ACTIVE) {
|
||||
bufchain_add(&ps->pending_output_data, data, len);
|
||||
@ -109,7 +109,7 @@ static int sk_proxy_write (Socket s, const void *data, int len)
|
||||
|
||||
static int sk_proxy_write_oob (Socket s, const void *data, int len)
|
||||
{
|
||||
Proxy_Socket ps = (Proxy_Socket) s;
|
||||
ProxySocket *ps = FROMFIELD(s, ProxySocket, sockvt);
|
||||
|
||||
if (ps->state != PROXY_STATE_ACTIVE) {
|
||||
bufchain_clear(&ps->pending_output_data);
|
||||
@ -122,7 +122,7 @@ static int sk_proxy_write_oob (Socket s, const void *data, int len)
|
||||
|
||||
static void sk_proxy_write_eof (Socket s)
|
||||
{
|
||||
Proxy_Socket ps = (Proxy_Socket) s;
|
||||
ProxySocket *ps = FROMFIELD(s, ProxySocket, sockvt);
|
||||
|
||||
if (ps->state != PROXY_STATE_ACTIVE) {
|
||||
ps->pending_eof = 1;
|
||||
@ -133,7 +133,7 @@ static void sk_proxy_write_eof (Socket s)
|
||||
|
||||
static void sk_proxy_flush (Socket s)
|
||||
{
|
||||
Proxy_Socket ps = (Proxy_Socket) s;
|
||||
ProxySocket *ps = FROMFIELD(s, ProxySocket, sockvt);
|
||||
|
||||
if (ps->state != PROXY_STATE_ACTIVE) {
|
||||
ps->pending_flush = 1;
|
||||
@ -144,7 +144,7 @@ static void sk_proxy_flush (Socket s)
|
||||
|
||||
static void sk_proxy_set_frozen (Socket s, int is_frozen)
|
||||
{
|
||||
Proxy_Socket ps = (Proxy_Socket) s;
|
||||
ProxySocket *ps = FROMFIELD(s, ProxySocket, sockvt);
|
||||
|
||||
if (ps->state != PROXY_STATE_ACTIVE) {
|
||||
ps->freeze = is_frozen;
|
||||
@ -183,7 +183,7 @@ static void sk_proxy_set_frozen (Socket s, int is_frozen)
|
||||
|
||||
static const char * sk_proxy_socket_error (Socket s)
|
||||
{
|
||||
Proxy_Socket ps = (Proxy_Socket) s;
|
||||
ProxySocket *ps = FROMFIELD(s, ProxySocket, sockvt);
|
||||
if (ps->error != NULL || ps->sub_socket == NULL) {
|
||||
return ps->error;
|
||||
}
|
||||
@ -195,8 +195,7 @@ static const char * sk_proxy_socket_error (Socket s)
|
||||
static void plug_proxy_log(Plug plug, int type, SockAddr addr, int port,
|
||||
const char *error_msg, int error_code)
|
||||
{
|
||||
Proxy_Plug pp = (Proxy_Plug) plug;
|
||||
Proxy_Socket ps = pp->proxy_socket;
|
||||
ProxySocket *ps = FROMFIELD(plug, ProxySocket, plugvt);
|
||||
|
||||
plug_log(ps->plug, type, addr, port, error_msg, error_code);
|
||||
}
|
||||
@ -204,8 +203,7 @@ static void plug_proxy_log(Plug plug, int type, SockAddr addr, int port,
|
||||
static void plug_proxy_closing (Plug p, const char *error_msg,
|
||||
int error_code, int calling_back)
|
||||
{
|
||||
Proxy_Plug pp = (Proxy_Plug) p;
|
||||
Proxy_Socket ps = pp->proxy_socket;
|
||||
ProxySocket *ps = FROMFIELD(p, ProxySocket, plugvt);
|
||||
|
||||
if (ps->state != PROXY_STATE_ACTIVE) {
|
||||
ps->closing_error_msg = error_msg;
|
||||
@ -219,8 +217,7 @@ static void plug_proxy_closing (Plug p, const char *error_msg,
|
||||
|
||||
static void plug_proxy_receive (Plug p, int urgent, char *data, int len)
|
||||
{
|
||||
Proxy_Plug pp = (Proxy_Plug) p;
|
||||
Proxy_Socket ps = pp->proxy_socket;
|
||||
ProxySocket *ps = FROMFIELD(p, ProxySocket, plugvt);
|
||||
|
||||
if (ps->state != PROXY_STATE_ACTIVE) {
|
||||
/* we will lose the urgentness of this data, but since most,
|
||||
@ -239,8 +236,7 @@ static void plug_proxy_receive (Plug p, int urgent, char *data, int len)
|
||||
|
||||
static void plug_proxy_sent (Plug p, int bufsize)
|
||||
{
|
||||
Proxy_Plug pp = (Proxy_Plug) p;
|
||||
Proxy_Socket ps = pp->proxy_socket;
|
||||
ProxySocket *ps = FROMFIELD(p, ProxySocket, plugvt);
|
||||
|
||||
if (ps->state != PROXY_STATE_ACTIVE) {
|
||||
ps->sent_bufsize = bufsize;
|
||||
@ -253,8 +249,7 @@ static void plug_proxy_sent (Plug p, int bufsize)
|
||||
static int plug_proxy_accepting(Plug p,
|
||||
accept_fn_t constructor, accept_ctx_t ctx)
|
||||
{
|
||||
Proxy_Plug pp = (Proxy_Plug) p;
|
||||
Proxy_Socket ps = pp->proxy_socket;
|
||||
ProxySocket *ps = FROMFIELD(p, ProxySocket, plugvt);
|
||||
|
||||
if (ps->state != PROXY_STATE_ACTIVE) {
|
||||
ps->accepting_constructor = constructor;
|
||||
@ -401,36 +396,35 @@ SockAddr name_lookup(const char *host, int port, char **canonicalname,
|
||||
}
|
||||
}
|
||||
|
||||
static const struct Socket_vtable ProxySocket_sockvt = {
|
||||
sk_proxy_plug,
|
||||
sk_proxy_close,
|
||||
sk_proxy_write,
|
||||
sk_proxy_write_oob,
|
||||
sk_proxy_write_eof,
|
||||
sk_proxy_flush,
|
||||
sk_proxy_set_frozen,
|
||||
sk_proxy_socket_error,
|
||||
NULL, /* peer_info */
|
||||
};
|
||||
|
||||
static const struct Plug_vtable ProxySocket_plugvt = {
|
||||
plug_proxy_log,
|
||||
plug_proxy_closing,
|
||||
plug_proxy_receive,
|
||||
plug_proxy_sent,
|
||||
plug_proxy_accepting
|
||||
};
|
||||
|
||||
Socket new_connection(SockAddr addr, const char *hostname,
|
||||
int port, int privport,
|
||||
int oobinline, int nodelay, int keepalive,
|
||||
Plug plug, Conf *conf)
|
||||
{
|
||||
static const struct socket_function_table socket_fn_table = {
|
||||
sk_proxy_plug,
|
||||
sk_proxy_close,
|
||||
sk_proxy_write,
|
||||
sk_proxy_write_oob,
|
||||
sk_proxy_write_eof,
|
||||
sk_proxy_flush,
|
||||
sk_proxy_set_frozen,
|
||||
sk_proxy_socket_error,
|
||||
NULL, /* peer_info */
|
||||
};
|
||||
|
||||
static const struct plug_function_table plug_fn_table = {
|
||||
plug_proxy_log,
|
||||
plug_proxy_closing,
|
||||
plug_proxy_receive,
|
||||
plug_proxy_sent,
|
||||
plug_proxy_accepting
|
||||
};
|
||||
|
||||
if (conf_get_int(conf, CONF_proxy_type) != PROXY_NONE &&
|
||||
proxy_for_destination(addr, hostname, port, conf))
|
||||
{
|
||||
Proxy_Socket ret;
|
||||
Proxy_Plug pplug;
|
||||
ProxySocket *ret;
|
||||
SockAddr proxy_addr;
|
||||
char *proxy_canonical_name;
|
||||
const char *proxy_type;
|
||||
@ -443,8 +437,9 @@ Socket new_connection(SockAddr addr, const char *hostname,
|
||||
NULL)
|
||||
return sret;
|
||||
|
||||
ret = snew(struct Socket_proxy_tag);
|
||||
ret->fn = &socket_fn_table;
|
||||
ret = snew(ProxySocket);
|
||||
ret->sockvt = &ProxySocket_sockvt;
|
||||
ret->plugvt = &ProxySocket_plugvt;
|
||||
ret->conf = conf_copy(conf);
|
||||
ret->plug = plug;
|
||||
ret->remote_addr = addr; /* will need to be freed on close */
|
||||
@ -478,7 +473,7 @@ Socket new_connection(SockAddr addr, const char *hostname,
|
||||
proxy_type = "Telnet";
|
||||
} else {
|
||||
ret->error = "Proxy error: Unknown proxy method";
|
||||
return (Socket) ret;
|
||||
return &ret->sockvt;
|
||||
}
|
||||
|
||||
{
|
||||
@ -491,12 +486,6 @@ Socket new_connection(SockAddr addr, const char *hostname,
|
||||
sfree(logmsg);
|
||||
}
|
||||
|
||||
/* create the proxy plug to map calls from the actual
|
||||
* socket into our proxy socket layer */
|
||||
pplug = snew(struct Plug_proxy_tag);
|
||||
pplug->fn = &plug_fn_table;
|
||||
pplug->proxy_socket = ret;
|
||||
|
||||
{
|
||||
char *logmsg = dns_log_msg(conf_get_str(conf, CONF_proxy_host),
|
||||
conf_get_int(conf, CONF_addressfamily),
|
||||
@ -511,9 +500,8 @@ Socket new_connection(SockAddr addr, const char *hostname,
|
||||
conf_get_int(conf, CONF_addressfamily));
|
||||
if (sk_addr_error(proxy_addr) != NULL) {
|
||||
ret->error = "Proxy error: Unable to resolve proxy host name";
|
||||
sfree(pplug);
|
||||
sk_addr_free(proxy_addr);
|
||||
return (Socket)ret;
|
||||
return &ret->sockvt;
|
||||
}
|
||||
sfree(proxy_canonical_name);
|
||||
|
||||
@ -533,15 +521,15 @@ Socket new_connection(SockAddr addr, const char *hostname,
|
||||
ret->sub_socket = sk_new(proxy_addr,
|
||||
conf_get_int(conf, CONF_proxy_port),
|
||||
privport, oobinline,
|
||||
nodelay, keepalive, (Plug) pplug);
|
||||
nodelay, keepalive, &ret->plugvt);
|
||||
if (sk_socket_error(ret->sub_socket) != NULL)
|
||||
return (Socket) ret;
|
||||
return &ret->sockvt;
|
||||
|
||||
/* start the proxy negotiation process... */
|
||||
sk_set_frozen(ret->sub_socket, 0);
|
||||
ret->negotiate(ret, PROXY_CHANGE_NEW);
|
||||
|
||||
return (Socket) ret;
|
||||
return &ret->sockvt;
|
||||
}
|
||||
|
||||
/* no proxy, so just return the direct socket */
|
||||
@ -596,7 +584,7 @@ static int get_line_end (char * data, int len)
|
||||
return -1;
|
||||
}
|
||||
|
||||
int proxy_http_negotiate (Proxy_Socket p, int change)
|
||||
int proxy_http_negotiate (ProxySocket *p, int change)
|
||||
{
|
||||
if (p->state == PROXY_STATE_NEW) {
|
||||
/* we are just beginning the proxy negotiate process,
|
||||
@ -781,7 +769,7 @@ int proxy_http_negotiate (Proxy_Socket p, int change)
|
||||
*/
|
||||
|
||||
/* SOCKS version 4 */
|
||||
int proxy_socks4_negotiate (Proxy_Socket p, int change)
|
||||
int proxy_socks4_negotiate (ProxySocket *p, int change)
|
||||
{
|
||||
if (p->state == PROXY_CHANGE_NEW) {
|
||||
|
||||
@ -932,7 +920,7 @@ int proxy_socks4_negotiate (Proxy_Socket p, int change)
|
||||
}
|
||||
|
||||
/* SOCKS version 5 */
|
||||
int proxy_socks5_negotiate (Proxy_Socket p, int change)
|
||||
int proxy_socks5_negotiate (ProxySocket *p, int change)
|
||||
{
|
||||
if (p->state == PROXY_CHANGE_NEW) {
|
||||
|
||||
@ -1508,7 +1496,7 @@ char *format_telnet_command(SockAddr addr, int port, Conf *conf)
|
||||
#undef ENSURE
|
||||
}
|
||||
|
||||
int proxy_telnet_negotiate (Proxy_Socket p, int change)
|
||||
int proxy_telnet_negotiate (ProxySocket *p, int change)
|
||||
{
|
||||
if (p->state == PROXY_CHANGE_NEW) {
|
||||
char *formatted_cmd;
|
||||
|
Reference in New Issue
Block a user