1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-22 08:08:50 -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:
Daniel Stenberg 2002-08-01 14:25:12 +00:00
parent fcb1d3521a
commit e7d0af72e3

View File

@ -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);
}
infof(data, "We connect from %s\n", myhost);
if ( h ) { 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 */
}
if ( h || sa_filled_in) {
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;
if(!sa_filled_in) {
memset((char *)&sa, 0, sizeof(sa)); memset((char *)&sa, 0, sizeof(sa));
memcpy((char *)&sa.sin_addr, memcpy((char *)&sa.sin_addr,
h->h_addr, h->h_addr,
h->h_length); h->h_length);
sa.sin_family = AF_INET; sa.sin_family = AF_INET;
sa.sin_addr.s_addr = INADDR_ANY; 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,