mirror of
https://github.com/moparisthebest/curl
synced 2024-12-21 23:58:49 -05:00
Changed the PORT command to pick a better default IP address if "-" is used.
It now uses the local IP adress of the control connection.
This commit is contained in:
parent
fcb1d3521a
commit
e7d0af72e3
40
lib/ftp.c
40
lib/ftp.c
@ -1209,6 +1209,7 @@ CURLcode ftp_use_port(struct connectdata *conn)
|
|||||||
char *hostdataptr=NULL;
|
char *hostdataptr=NULL;
|
||||||
unsigned short porttouse;
|
unsigned short porttouse;
|
||||||
char myhost[256] = "";
|
char myhost[256] = "";
|
||||||
|
bool sa_filled_in = FALSE;
|
||||||
|
|
||||||
if(data->set.ftpport) {
|
if(data->set.ftpport) {
|
||||||
if(Curl_if2ip(data->set.ftpport, myhost, sizeof(myhost))) {
|
if(Curl_if2ip(data->set.ftpport, myhost, sizeof(myhost))) {
|
||||||
@ -1223,12 +1224,20 @@ CURLcode ftp_use_port(struct connectdata *conn)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(! *myhost) {
|
if(! *myhost) {
|
||||||
char *tmp_host = getmyhost(myhost, sizeof(myhost));
|
/* pick a suitable default here */
|
||||||
h=Curl_resolv(data, tmp_host, 0);
|
|
||||||
|
socklen_t sslen;
|
||||||
|
|
||||||
|
sslen = sizeof(sa);
|
||||||
|
if (getsockname(conn->firstsocket, &sa, &sslen) < 0) {
|
||||||
|
failf(data, "getsockname() failed");
|
||||||
|
return CURLE_FTP_PORT_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
sa_filled_in = TRUE; /* the sa struct is filled in */
|
||||||
}
|
}
|
||||||
infof(data, "We connect from %s\n", myhost);
|
|
||||||
|
if ( h || sa_filled_in) {
|
||||||
if ( h ) {
|
|
||||||
if( (portsock = socket(AF_INET, SOCK_STREAM, 0)) >= 0 ) {
|
if( (portsock = socket(AF_INET, SOCK_STREAM, 0)) >= 0 ) {
|
||||||
int size;
|
int size;
|
||||||
|
|
||||||
@ -1237,12 +1246,15 @@ CURLcode ftp_use_port(struct connectdata *conn)
|
|||||||
we fail before the true secondary stuff is made */
|
we fail before the true secondary stuff is made */
|
||||||
conn->secondarysocket = portsock;
|
conn->secondarysocket = portsock;
|
||||||
|
|
||||||
memset((char *)&sa, 0, sizeof(sa));
|
if(!sa_filled_in) {
|
||||||
memcpy((char *)&sa.sin_addr,
|
memset((char *)&sa, 0, sizeof(sa));
|
||||||
h->h_addr,
|
memcpy((char *)&sa.sin_addr,
|
||||||
h->h_length);
|
h->h_addr,
|
||||||
sa.sin_family = AF_INET;
|
h->h_length);
|
||||||
sa.sin_addr.s_addr = INADDR_ANY;
|
sa.sin_family = AF_INET;
|
||||||
|
sa.sin_addr.s_addr = INADDR_ANY;
|
||||||
|
}
|
||||||
|
|
||||||
sa.sin_port = 0;
|
sa.sin_port = 0;
|
||||||
size = sizeof(sa);
|
size = sizeof(sa);
|
||||||
|
|
||||||
@ -1286,7 +1298,8 @@ CURLcode ftp_use_port(struct connectdata *conn)
|
|||||||
#endif
|
#endif
|
||||||
struct in_addr in;
|
struct in_addr in;
|
||||||
unsigned short ip[5];
|
unsigned short ip[5];
|
||||||
(void) memcpy(&in.s_addr, *h->h_addr_list, sizeof (in.s_addr));
|
(void) memcpy(&in.s_addr,
|
||||||
|
h?*h->h_addr_list:&sa.sin_addr.s_addr, sizeof (in.s_addr));
|
||||||
#ifdef HAVE_INET_NTOA_R
|
#ifdef HAVE_INET_NTOA_R
|
||||||
/* ignore the return code from inet_ntoa_r() as it is int or
|
/* ignore the return code from inet_ntoa_r() as it is int or
|
||||||
char * depending on system */
|
char * depending on system */
|
||||||
@ -1297,6 +1310,9 @@ CURLcode ftp_use_port(struct connectdata *conn)
|
|||||||
sscanf( inet_ntoa(in), "%hu.%hu.%hu.%hu",
|
sscanf( inet_ntoa(in), "%hu.%hu.%hu.%hu",
|
||||||
&ip[0], &ip[1], &ip[2], &ip[3]);
|
&ip[0], &ip[1], &ip[2], &ip[3]);
|
||||||
#endif
|
#endif
|
||||||
|
infof(data, "Telling server to connect to %d.%d.%d.%d:%d\n",
|
||||||
|
ip[0], ip[1], ip[2], ip[3], porttouse);
|
||||||
|
|
||||||
result=Curl_ftpsendf(conn, "PORT %d,%d,%d,%d,%d,%d",
|
result=Curl_ftpsendf(conn, "PORT %d,%d,%d,%d,%d,%d",
|
||||||
ip[0], ip[1], ip[2], ip[3],
|
ip[0], ip[1], ip[2], ip[3],
|
||||||
porttouse >> 8,
|
porttouse >> 8,
|
||||||
|
Loading…
Reference in New Issue
Block a user