aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/curl/curl.h3
-rw-r--r--lib/ftp.c12
-rw-r--r--lib/url.c10
-rw-r--r--lib/urldata.h3
-rw-r--r--src/main.c13
5 files changed, 35 insertions, 6 deletions
diff --git a/include/curl/curl.h b/include/curl/curl.h
index c4118b6c1..a12a24672 100644
--- a/include/curl/curl.h
+++ b/include/curl/curl.h
@@ -493,6 +493,9 @@ typedef enum {
/* DNS cache timeout */
CINIT(DNS_CACHE_TIMEOUT, LONG, 92),
+
+ /* send linked-list of pre-transfer QUOTE commands (Wesley Laxton)*/
+ CINIT(PREQUOTE, OBJECTPOINT, 93),
CURLOPT_LASTENTRY /* the last unusued */
} CURLoption;
diff --git a/lib/ftp.c b/lib/ftp.c
index 5ec23aafe..92f62638e 100644
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -1618,6 +1618,12 @@ CURLcode ftp_perform(struct connectdata *conn)
if(result)
return result;
+ /* Send any PREQUOTE strings after transfer type is set? (Wesley Laxton)*/
+ if(data->set.prequote) {
+ if ((result = ftp_sendquote(conn, data->set.prequote)) != CURLE_OK)
+ return result;
+ }
+
if(conn->resume_from) {
/* we're about to continue the uploading of a file */
/* 1. get already existing file's size. We use the SIZE
@@ -1803,6 +1809,12 @@ CURLcode ftp_perform(struct connectdata *conn)
if(result)
return result;
+ /* Send any PREQUOTE strings after transfer type is set? (Wesley Laxton)*/
+ if(data->set.prequote) {
+ if ((result = ftp_sendquote(conn, data->set.prequote)) != CURLE_OK)
+ return result;
+ }
+
/* Attempt to get the size, it'll be useful in some cases: for resumed
downloads and when talking to servers that don't give away the size
in the RETR response line. */
diff --git a/lib/url.c b/lib/url.c
index fc2031c94..e88a65e85 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -735,6 +735,12 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...)
*/
data->set.postquote = va_arg(param, struct curl_slist *);
break;
+ case CURLOPT_PREQUOTE:
+ /*
+ * List of RAW FTP commands to use prior to RETR (Wesley Laxton)
+ */
+ data->set.prequote = va_arg(param, struct curl_slist *);
+ break;
case CURLOPT_QUOTE:
/*
* List of RAW FTP commands to use before a transfer
@@ -1983,8 +1989,8 @@ static CURLcode CreateConnection(struct SessionHandle *data,
conn = conn_temp; /* use this connection from now on */
/* we need these pointers if we speak over a proxy */
- conn->hostname = old_conn->gname;
- conn->name = old_conn->name;
+ conn->hostname = conn->gname;
+ conn->name = &conn->gname[old_conn->name - old_conn->gname];
free(conn->path); /* free the previously allocated path pointer */
diff --git a/lib/urldata.h b/lib/urldata.h
index cd667fade..c2778a8e3 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -604,8 +604,9 @@ struct UserDefined {
char *crypto_engine; /* name of the crypto engine to use */
char *cookiejar; /* dump all cookies to this file */
bool crlf; /* convert crlf on ftp upload(?) */
- struct curl_slist *quote; /* before the transfer */
+ struct curl_slist *quote; /* after connection is established */
struct curl_slist *postquote; /* after the transfer */
+ struct curl_slist *prequote; /* before the transfer, after type (Wesley Laxton)*/
struct curl_slist *telnet_options; /* linked list of telnet options */
curl_TimeCond timecondition; /* kind of time/date comparison */
time_t timevalue; /* what time to compare with */
diff --git a/src/main.c b/src/main.c
index caf02e7cc..d43f49bd1 100644
--- a/src/main.c
+++ b/src/main.c
@@ -448,6 +448,7 @@ struct Configurable {
struct curl_slist *quote;
struct curl_slist *postquote;
+ struct curl_slist *prequote;
long ssl_version;
curl_TimeCond timecond;
@@ -1376,12 +1377,18 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
break;
case 'Q':
/* QUOTE command to send to FTP server */
- if(nextarg[0] == '-') {
+ switch(nextarg[0]) {
+ case '-':
/* prefixed with a dash makes it a POST TRANSFER one */
nextarg++;
config->postquote = curl_slist_append(config->postquote, nextarg);
- }
- else {
+ break;
+ case '+':
+ /* prefixed with a plus makes it a just-before-transfer one */
+ nextarg++;
+ config->prequote = curl_slist_append(config->prequote, nextarg);
+ break;
+ default:
config->quote = curl_slist_append(config->quote, nextarg);
}
break;