diff options
Diffstat (limited to 'lib/ftp.c')
| -rw-r--r-- | lib/ftp.c | 33 | 
1 files changed, 21 insertions, 12 deletions
@@ -1184,7 +1184,6 @@ CURLcode ftp_use_port(struct connectdata *conn)        return result;      if (ftpcode != 200) { -      failf(data, "Server does not grok %s", *modep);        continue;      }      else @@ -1193,6 +1192,7 @@ CURLcode ftp_use_port(struct connectdata *conn)    if (!*modep) {      sclose(portsock); +    failf(data, "PORT command attempts failed");      return CURLE_FTP_PORT_FAILED;    }    /* we set the secondary socket variable to this for now, it @@ -1931,8 +1931,14 @@ CURLcode Curl_ftp_nextconnect(struct connectdata *conn)          return result;      }      else { -      failf(data, "%s", buf+4); -      return CURLE_FTP_COULDNT_RETR_FILE; +      if(dirlist && (ftpcode == 450)) { +        /* simply no matching files */ +        ftp->no_transfer = TRUE; /* don't think we should download anything */ +      } +      else { +        failf(data, "%s", buf+4); +        return CURLE_FTP_COULDNT_RETR_FILE; +      }      }    } @@ -2180,16 +2186,19 @@ CURLcode Curl_ftp(struct connectdata *conn)    if(CURLE_OK == retcode) {      if(connected)        retcode = Curl_ftp_nextconnect(conn); -    else { -      if(ftp->no_transfer) { -        /* no data to transfer */ -        retcode=Curl_Transfer(conn, -1, -1, FALSE, NULL, -1, NULL);         -      } -      else { -        /* since we didn't connect now, we want do_more to get called */ -        conn->bits.do_more = TRUE; -      } + +    if(retcode && (conn->secondarysocket >= 0)) { +      /* Failure detected, close the second socket if it was created already */ +      sclose(conn->secondarysocket); +      conn->secondarysocket = -1;      } + +    if(ftp->no_transfer) +      /* no data to transfer */ +      retcode=Curl_Transfer(conn, -1, -1, FALSE, NULL, -1, NULL);         +    else if(!connected) +      /* since we didn't connect now, we want do_more to get called */ +      conn->bits.do_more = TRUE;    }    return retcode;  | 
