mirror of
https://github.com/curl/curl.git
synced 2026-08-24 15:03:34 +03:00
conn: add 'attach' to protocol handler, make libssh2 use it
The libssh2 backend has SSH session associated with the connection but the callback context is the easy handle, so when a connection gets attached to a transfer, the protocol handler now allows for a custom function to get used to set things up correctly. Reported-by: Michael O'Farrell Fixes #6898 Closes #7078
This commit is contained in:
parent
904b27d18d
commit
0c55fbab45
24 changed files with 66 additions and 0 deletions
|
|
@ -159,6 +159,7 @@ const struct Curl_handler Curl_handler_scp = {
|
|||
scp_disconnect, /* disconnect */
|
||||
ZERO_NULL, /* readwrite */
|
||||
ZERO_NULL, /* connection_check */
|
||||
ZERO_NULL, /* attach connection */
|
||||
PORT_SSH, /* defport */
|
||||
CURLPROTO_SCP, /* protocol */
|
||||
CURLPROTO_SCP, /* family */
|
||||
|
|
@ -185,6 +186,7 @@ const struct Curl_handler Curl_handler_sftp = {
|
|||
sftp_disconnect, /* disconnect */
|
||||
ZERO_NULL, /* readwrite */
|
||||
ZERO_NULL, /* connection_check */
|
||||
ZERO_NULL, /* attach connection */
|
||||
PORT_SSH, /* defport */
|
||||
CURLPROTO_SFTP, /* protocol */
|
||||
CURLPROTO_SFTP, /* family */
|
||||
|
|
|
|||
|
|
@ -121,6 +121,7 @@ static int ssh_getsock(struct Curl_easy *data, struct connectdata *conn,
|
|||
curl_socket_t *sock);
|
||||
static CURLcode ssh_setup_connection(struct Curl_easy *data,
|
||||
struct connectdata *conn);
|
||||
static void ssh_attach(struct Curl_easy *data, struct connectdata *conn);
|
||||
|
||||
/*
|
||||
* SCP protocol handler.
|
||||
|
|
@ -142,6 +143,7 @@ const struct Curl_handler Curl_handler_scp = {
|
|||
scp_disconnect, /* disconnect */
|
||||
ZERO_NULL, /* readwrite */
|
||||
ZERO_NULL, /* connection_check */
|
||||
ssh_attach,
|
||||
PORT_SSH, /* defport */
|
||||
CURLPROTO_SCP, /* protocol */
|
||||
CURLPROTO_SCP, /* family */
|
||||
|
|
@ -170,6 +172,7 @@ const struct Curl_handler Curl_handler_sftp = {
|
|||
sftp_disconnect, /* disconnect */
|
||||
ZERO_NULL, /* readwrite */
|
||||
ZERO_NULL, /* connection_check */
|
||||
ssh_attach,
|
||||
PORT_SSH, /* defport */
|
||||
CURLPROTO_SFTP, /* protocol */
|
||||
CURLPROTO_SFTP, /* family */
|
||||
|
|
@ -3604,4 +3607,21 @@ size_t Curl_ssh_version(char *buffer, size_t buflen)
|
|||
return msnprintf(buffer, buflen, "libssh2/%s", LIBSSH2_VERSION);
|
||||
}
|
||||
|
||||
/* The SSH session is associated with the *CONNECTION* but the callback user
|
||||
* pointer is an easy handle pointer. This function allows us to reassign the
|
||||
* user pointer to the *CURRENT* (new) easy handle.
|
||||
*/
|
||||
static void ssh_attach(struct Curl_easy *data, struct connectdata *conn)
|
||||
{
|
||||
DEBUGASSERT(data);
|
||||
DEBUGASSERT(conn);
|
||||
if(conn->handler->protocol & PROTO_FAMILY_SSH) {
|
||||
struct ssh_conn *sshc = &conn->proto.sshc;
|
||||
if(sshc->ssh_session) {
|
||||
/* only re-attach if the session already exists */
|
||||
void **abstract = libssh2_session_abstract(sshc->ssh_session);
|
||||
*abstract = data;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* USE_LIBSSH2 */
|
||||
|
|
|
|||
|
|
@ -263,9 +263,12 @@ extern const struct Curl_handler Curl_handler_sftp;
|
|||
CURLcode Curl_ssh_init(void);
|
||||
void Curl_ssh_cleanup(void);
|
||||
size_t Curl_ssh_version(char *buffer, size_t buflen);
|
||||
void Curl_ssh_attach(struct Curl_easy *data,
|
||||
struct connectdata *conn);
|
||||
#else
|
||||
/* for non-SSH builds */
|
||||
#define Curl_ssh_cleanup()
|
||||
#define Curl_ssh_attach(x,y)
|
||||
#endif
|
||||
|
||||
#endif /* HEADER_CURL_SSH_H */
|
||||
|
|
|
|||
|
|
@ -91,6 +91,7 @@ const struct Curl_handler Curl_handler_scp = {
|
|||
wscp_disconnect, /* disconnect */
|
||||
ZERO_NULL, /* readwrite */
|
||||
ZERO_NULL, /* connection_check */
|
||||
ZERO_NULL, /* attach connection */
|
||||
PORT_SSH, /* defport */
|
||||
CURLPROTO_SCP, /* protocol */
|
||||
PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION
|
||||
|
|
@ -119,6 +120,7 @@ const struct Curl_handler Curl_handler_sftp = {
|
|||
wsftp_disconnect, /* disconnect */
|
||||
ZERO_NULL, /* readwrite */
|
||||
ZERO_NULL, /* connection_check */
|
||||
ZERO_NULL, /* attach connection */
|
||||
PORT_SSH, /* defport */
|
||||
CURLPROTO_SFTP, /* protocol */
|
||||
CURLPROTO_SFTP, /* family */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue