]> granicus.if.org Git - curl/commitdiff
Alexander Krasnostavsky made it possible to make FTP 3rd party transfers with
authorDaniel Stenberg <daniel@haxx.se>
Tue, 19 Oct 2004 18:26:35 +0000 (18:26 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 19 Oct 2004 18:26:35 +0000 (18:26 +0000)
both source and destination being the same host. It can be useful if you want
to move a file on a server or similar.

CHANGES
lib/transfer.c

diff --git a/CHANGES b/CHANGES
index 97e4d338f67014759599e9f2bb9c18bb62de6c0f..ebb6a23617621dc5470369ff2629ae2205168b5e 100644 (file)
--- 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.
 
index 935e2cb8ec707d42ec57bee0efc0c075fb05d3ee..14512a774fd0cfa0f9dad9dae88b77ff1e4f9662 100644 (file)
@@ -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;
 }