From 80b004a57d6fe8ce2d2fceb29b6eb4a7101da958 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Thu, 28 Feb 2002 23:31:23 +0000 Subject: [PATCH] Wesley Laxton's CURLOPT_PREQUOTE work --- include/curl/curl.h | 3 +++ lib/ftp.c | 12 ++++++++++++ lib/url.c | 10 ++++++++-- lib/urldata.h | 3 ++- src/main.c | 13 ++++++++++--- 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;