aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2001-11-28 23:20:14 +0000
committerDaniel Stenberg <daniel@haxx.se>2001-11-28 23:20:14 +0000
commit332eb7651a651ef03dc15197a8d11baa54873f8d (patch)
treefaf3c17b2eb30b5cc2df46e4f8d9b88a625a2002
parentcfdcf5c93325b55cd223484b65b73b20a296a6e9 (diff)
CURLOPT_FTP_USE_EPSV can now be set to FALSE to prevent libcurl from
attempting to use EPSV before the standard PASV.
-rw-r--r--lib/ftp.c14
-rw-r--r--lib/url.c6
-rw-r--r--lib/urldata.h1
3 files changed, 18 insertions, 3 deletions
diff --git a/lib/ftp.c b/lib/ftp.c
index 216313797..c84c056a5 100644
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -812,7 +812,7 @@ ftp_pasv_verbose(struct connectdata *conn,
#ifdef HAVE_INET_NTOA_R
char ntoa_buf[64];
#endif
- char hostent_buf[8192];
+ char hostent_buf[9000];
#if defined(HAVE_INET_ADDR)
in_addr_t address;
@@ -824,12 +824,19 @@ ftp_pasv_verbose(struct connectdata *conn,
# ifdef HAVE_GETHOSTBYADDR_R
# ifdef HAVE_GETHOSTBYADDR_R_5
- /* AIX, Digital Unix style:
+ /* AIX, Digital Unix (OSF1, Tru64) style:
extern int gethostbyaddr_r(char *addr, size_t len, int type,
struct hostent *htent, struct hostent_data *ht_data); */
/* Fred Noz helped me try this out, now it at least compiles! */
+ /* Bjorn Reese (November 28 2001):
+ The Tru64 man page on gethostbyaddr_r() says that
+ the hostent struct must be filled with zeroes before the call to
+ gethostbyaddr_r(). */
+
+ memset(hostent_buf, 0, sizeof(struct hostent));
+
if(gethostbyaddr_r((char *) &address,
sizeof(address), AF_INET,
(struct hostent *)hostent_buf,
@@ -1297,7 +1304,8 @@ CURLcode ftp_use_pasv(struct connectdata *conn)
char newhost[48];
char *newhostp=NULL;
- for (modeoff = 0; mode[modeoff]; modeoff++) {
+ for (modeoff = (data->set.ftp_use_epsv?0:1);
+ mode[modeoff]; modeoff++) {
result = Curl_ftpsendf(conn, mode[modeoff]);
if(result)
return result;
diff --git a/lib/url.c b/lib/url.c
index 1b836c45b..c1a58be61 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -245,6 +245,7 @@ CURLcode Curl_open(struct SessionHandle **curl)
data->state.current_speed = -1; /* init to negative == impossible */
data->set.httpreq = HTTPREQ_GET; /* Default HTTP request */
+ data->set.ftp_use_epsv = TRUE; /* FTP defaults to EPSV operations */
/* make libcurl quiet by default: */
data->set.hide_progress = TRUE; /* CURLOPT_NOPROGRESS changes these */
@@ -523,6 +524,11 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...)
data->set.ftpport = va_arg(param, char *);
data->set.ftp_use_port = data->set.ftpport?1:0;
break;
+
+ case CURLOPT_FTP_USE_EPSV:
+ data->set.ftp_use_epsv = va_arg(param, long)?TRUE:FALSE;
+ break;
+
case CURLOPT_HTTPHEADER:
/*
* Set a list with HTTP headers to use (or replace internals with)
diff --git a/lib/urldata.h b/lib/urldata.h
index 29de65037..78eddf419 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -567,6 +567,7 @@ struct UserDefined {
bool reuse_forbid; /* forbidden to be reused, close after use */
bool reuse_fresh; /* do not re-use an existing connection */
bool expect100header; /* TRUE if we added Expect: 100-continue */
+ bool ftp_use_epsv; /* if EPSV is to be attempted or not */
};
/*