aboutsummaryrefslogtreecommitdiff
path: root/lib/transfer.c
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2004-10-19 18:26:35 +0000
committerDaniel Stenberg <daniel@haxx.se>2004-10-19 18:26:35 +0000
commit38b1d9675012815e2c19719ba6ce46c057bb0662 (patch)
treecf65371a236b32a9795ea2fb3c4a704a4c0b1478 /lib/transfer.c
parent2f069ad3e223e65c49c201e13ec70409c4c0ef2c (diff)
Alexander Krasnostavsky made it possible to make FTP 3rd party transfers with
both source and destination being the same host. It can be useful if you want to move a file on a server or similar.
Diffstat (limited to 'lib/transfer.c')
-rw-r--r--lib/transfer.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/lib/transfer.c b/lib/transfer.c
index 935e2cb8e..14512a774 100644
--- a/lib/transfer.c
+++ b/lib/transfer.c
@@ -2189,6 +2189,7 @@ CURLcode Curl_pretransfersec(struct connectdata *conn)
CURLcode status = CURLE_OK;
struct SessionHandle *data = conn->data;
struct connectdata *sec_conn = NULL; /* secondary connection */
+ bool reuse_fresh_tmp = data->set.reuse_fresh;
/* update data with source host options */
char *url = aprintf( "%s://%s/", conn->protostr, data->set.source_host);
@@ -2204,12 +2205,22 @@ CURLcode Curl_pretransfersec(struct connectdata *conn)
data->set.ftpport = data->set.source_port;
data->set.userpwd = data->set.source_userpwd;
+ /* if both remote hosts are the same host - create new connection */
+ if (strequal(conn->host.dispname, data->set.source_host))
+ /* NOTE: this is restored back to the original value after the connect is
+ done */
+ data->set.reuse_fresh = TRUE;
+
/* secondary connection */
status = Curl_connect_host(data, &sec_conn);
if(CURLE_OK == status) {
+ sec_conn->sec_conn = NULL; /* important if re-using existing connection
+ to prevent loop */
sec_conn->data = data;
conn->sec_conn = sec_conn;
}
+ data->set.reuse_fresh = reuse_fresh_tmp;
+
return status;
}