1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-03-24 07:29:24 -05:00

Defer passing a ConnectionLayer to sshshare.c.

This paves the way for me to reorganise ssh.c in a way that will mean
I don't have a ConnectionLayer available yet at the time I have to
create the connshare. The constructor function now takes a mere
Frontend, for generating setup-time Event Log messages, and there's a
separate ssh_connshare_provide_connlayer() function I can call later
once I have the ConnectionLayer to provide.

NFC for the moment: the new provide_connlayer function is called
immediately after ssh_connection_sharing_init.
This commit is contained in:
Simon Tatham 2018-09-21 17:00:36 +01:00
parent 54b300f154
commit a703f86731
3 changed files with 21 additions and 10 deletions

7
ssh.c

@ -1249,8 +1249,11 @@ static const char *connect_to_host(Ssh ssh, const char *host, int port,
ssh->connshare = NULL; ssh->connshare = NULL;
ssh->attempting_connshare = TRUE; /* affects socket logging behaviour */ ssh->attempting_connshare = TRUE; /* affects socket logging behaviour */
ssh->s = ssh_connection_sharing_init( ssh->s = ssh_connection_sharing_init(
ssh->savedhost, ssh->savedport, ssh->conf, &ssh->cl, &ssh->plugvt, ssh->savedhost, ssh->savedport, ssh->conf, ssh->frontend,
&ssh->connshare); &ssh->plugvt, &ssh->connshare);
if (ssh->connshare)
ssh_connshare_provide_connlayer(ssh->connshare, &ssh->cl);
ssh->attempting_connshare = FALSE; ssh->attempting_connshare = FALSE;
if (ssh->s != NULL) { if (ssh->s != NULL) {
/* /*

4
ssh.h

@ -160,8 +160,10 @@ PktOut *ssh_new_packet(void);
void ssh_free_pktout(PktOut *pkt); void ssh_free_pktout(PktOut *pkt);
extern Socket ssh_connection_sharing_init( extern Socket ssh_connection_sharing_init(
const char *host, int port, Conf *conf, ConnectionLayer *cl, const char *host, int port, Conf *conf, Frontend *frontend,
Plug sshplug, ssh_sharing_state **state); Plug sshplug, ssh_sharing_state **state);
void ssh_connshare_provide_connlayer(ssh_sharing_state *sharestate,
ConnectionLayer *cl);
int ssh_share_test_for_upstream(const char *host, int port, Conf *conf); int ssh_share_test_for_upstream(const char *host, int port, Conf *conf);
void share_got_pkt_from_server(ssh_sharing_connstate *ctx, int type, void share_got_pkt_from_server(ssh_sharing_connstate *ctx, int type,
const void *pkt, int pktlen); const void *pkt, int pktlen);

@ -2052,6 +2052,12 @@ static const Plug_vtable ssh_sharing_listen_plugvt = {
share_listen_accepting share_listen_accepting
}; };
void ssh_connshare_provide_connlayer(ssh_sharing_state *sharestate,
ConnectionLayer *cl)
{
sharestate->cl = cl;
}
/* /*
* Init function for connection sharing. We either open a listening * Init function for connection sharing. We either open a listening
* socket and become an upstream, or connect to an existing one and * socket and become an upstream, or connect to an existing one and
@ -2063,7 +2069,7 @@ static const Plug_vtable ssh_sharing_listen_plugvt = {
* upstream) we return NULL. * upstream) we return NULL.
*/ */
Socket ssh_connection_sharing_init( Socket ssh_connection_sharing_init(
const char *host, int port, Conf *conf, ConnectionLayer *cl, const char *host, int port, Conf *conf, Frontend *frontend,
Plug sshplug, ssh_sharing_state **state) Plug sshplug, ssh_sharing_state **state)
{ {
int result, can_upstream, can_downstream; int result, can_upstream, can_downstream;
@ -2090,6 +2096,7 @@ Socket ssh_connection_sharing_init(
sharestate = snew(struct ssh_sharing_state); sharestate = snew(struct ssh_sharing_state);
sharestate->plugvt = &ssh_sharing_listen_plugvt; sharestate->plugvt = &ssh_sharing_listen_plugvt;
sharestate->listensock = NULL; sharestate->listensock = NULL;
sharestate->cl = NULL;
/* /*
* Now hand off to a per-platform routine that either connects to * Now hand off to a per-platform routine that either connects to
@ -2115,16 +2122,16 @@ Socket ssh_connection_sharing_init(
/* For this result, if 'logtext' is not NULL then it is an /* For this result, if 'logtext' is not NULL then it is an
* error message indicating a reason why connection sharing * error message indicating a reason why connection sharing
* couldn't be set up _at all_ */ * couldn't be set up _at all_ */
logeventf(cl->frontend, logeventf(frontend,
"Could not set up connection sharing: %s", logtext); "Could not set up connection sharing: %s", logtext);
} else { } else {
/* Failing that, ds_err and us_err indicate why we /* Failing that, ds_err and us_err indicate why we
* couldn't be a downstream and an upstream respectively */ * couldn't be a downstream and an upstream respectively */
if (ds_err) if (ds_err)
logeventf(cl->frontend, "Could not set up connection sharing" logeventf(frontend, "Could not set up connection sharing"
" as downstream: %s", ds_err); " as downstream: %s", ds_err);
if (us_err) if (us_err)
logeventf(cl->frontend, "Could not set up connection sharing" logeventf(frontend, "Could not set up connection sharing"
" as upstream: %s", us_err); " as upstream: %s", us_err);
} }
@ -2142,7 +2149,7 @@ Socket ssh_connection_sharing_init(
*/ */
/* 'logtext' is a local endpoint address */ /* 'logtext' is a local endpoint address */
logeventf(cl->frontend, logeventf(frontend,
"Using existing shared connection at %s", logtext); "Using existing shared connection at %s", logtext);
*state = NULL; *state = NULL;
@ -2159,12 +2166,11 @@ Socket ssh_connection_sharing_init(
*/ */
/* 'logtext' is a local endpoint address */ /* 'logtext' is a local endpoint address */
logeventf(cl->frontend, "Sharing this connection at %s", logtext); logeventf(frontend, "Sharing this connection at %s", logtext);
*state = sharestate; *state = sharestate;
sharestate->listensock = sock; sharestate->listensock = sock;
sharestate->connections = newtree234(share_connstate_cmp); sharestate->connections = newtree234(share_connstate_cmp);
sharestate->cl = cl;
sharestate->server_verstring = NULL; sharestate->server_verstring = NULL;
sharestate->sockname = sockname; sharestate->sockname = sockname;
sharestate->nextid = 1; sharestate->nextid = 1;