aboutsummaryrefslogtreecommitdiff
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
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.
-rw-r--r--CHANGES4
-rw-r--r--lib/transfer.c11
2 files changed, 15 insertions, 0 deletions
diff --git a/CHANGES b/CHANGES
index 97e4d338f..ebb6a2361 100644
--- a/CHANGES
+++ b/CHANGES
@@ -7,6 +7,10 @@
Changelog
Daniel (19 October 2004)
+- 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.
+
- Guillaume Arluison added CURLINFO_NUM_CONNECTS to allow an app to figure
out how many new connects a previous transfer required.
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;
}