diff --git a/lib/ftp.c b/lib/ftp.c index 51ea99948..106b97201 100644 --- a/lib/ftp.c +++ b/lib/ftp.c @@ -872,33 +872,21 @@ static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks, return GETSOCK_BLANK; /* When in DO_MORE state, we could be either waiting for us to connect to a - remote site, or we could wait for that site to connect to us. Or just - handle ordinary commands. + * remote site, or we could wait for that site to connect to us. Or just + * handle ordinary commands. + */ - When waiting for a connect (in PORT mode), we can be in FTP_STOP state - (or we're in FTP_STOR when we do an upload) and then we wait for the - secondary socket to become writeable. If we're in STOR or STOP in passive - mode, we already have the seconnd connection done. + if(FTP_STOP == ftpc->state) { + /* if stopped and still in this state, then we're also waiting for a + connect on the secondary connection */ + socks[0] = conn->sock[FIRSTSOCKET]; + socks[1] = conn->sock[SECONDARYSOCKET]; - If we're in another state, we're still handling commands on the control - (primary) connection. - */ - - switch(ftpc->state) { - case FTP_STOP: - case FTP_STOR: - break; - default: + return GETSOCK_READSOCK(FIRSTSOCKET) | + GETSOCK_WRITESOCK(SECONDARYSOCKET); + } + else return Curl_pp_getsock(&conn->proto.ftpc.pp, socks, numsocks); - } - - socks[0] = conn->sock[SECONDARYSOCKET]; - if(ftpc->wait_data_conn || !conn->data->set.ftp_use_port) { - socks[1] = conn->sock[FIRSTSOCKET]; - return GETSOCK_READSOCK(0) | GETSOCK_READSOCK(1); - } - - return GETSOCK_READSOCK(0); } /* This is called after the FTP_QUOTE state is passed. @@ -2427,6 +2415,8 @@ static CURLcode ftp_state_stor_resp(struct connectdata *conn, if(data->set.ftp_use_port) { bool connected; + state(conn, FTP_STOP); /* no longer in STOR state */ + result = AllowServerConnect(conn, &connected); if(result) return result;