Commit c7d2e4c1 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

- Extended and fixed the change I did on Dec 11 for the the progress

   meter/callback during FTP command/response sequences. It turned out it was
   really lame before and now the progress meter SHOULD get called at least
   once per second.
parent cbd52784
Loading
Loading
Loading
Loading
+7 −0
Original line number Original line Diff line number Diff line
@@ -7,6 +7,13 @@
                                  Changelog
                                  Changelog





Daniel Stenberg (26 Nov 2009)
 - Extended and fixed the change I did on Dec 11 for the the progress
   meter/callback during FTP command/response sequences. It turned out it was
   really lame before and now the progress meter SHOULD get called at least
   once per second.

Daniel Stenberg (23 Nov 2009)
Daniel Stenberg (23 Nov 2009)
- Bjorn Augustsson reported a bug which made curl not report any problems even
- Bjorn Augustsson reported a bug which made curl not report any problems even
  though it failed to write a very small download to disk (done in a single
  though it failed to write a very small download to disk (done in a single
+54 −50
Original line number Original line Diff line number Diff line
@@ -309,34 +309,38 @@ static CURLcode AllowServerConnect(struct connectdata *conn)
{
{
  struct SessionHandle *data = conn->data;
  struct SessionHandle *data = conn->data;
  curl_socket_t sock = conn->sock[SECONDARYSOCKET];
  curl_socket_t sock = conn->sock[SECONDARYSOCKET];
  long timeout_ms = Curl_timeleft(conn, NULL, TRUE);
  long timeout_ms;
  long interval_ms;
  curl_socket_t s = CURL_SOCKET_BAD;
#ifdef ENABLE_IPV6
  struct Curl_sockaddr_storage add;
#else
  struct sockaddr_in add;
#endif
  curl_socklen_t size = (curl_socklen_t) sizeof(add);

  for(;;) {
    timeout_ms = Curl_timeleft(conn, NULL, TRUE);


  if(timeout_ms < 0) {
    if(timeout_ms <= 0) {
      /* if a timeout was already reached, bail out */
      /* if a timeout was already reached, bail out */
    failf(data, "Timed out before server could connect to us");
      failf(data, "Timeout while waiting for server connect");
      return CURLE_OPERATION_TIMEDOUT;
      return CURLE_OPERATION_TIMEDOUT;
    }
    }


  switch (Curl_socket_ready(sock, CURL_SOCKET_BAD, (int)timeout_ms)) {
    interval_ms = 1000;  /* use 1 second timeout intervals */
    if(timeout_ms < interval_ms)
      interval_ms = timeout_ms;

    switch (Curl_socket_ready(sock, CURL_SOCKET_BAD, (int)interval_ms)) {
    case -1: /* error */
    case -1: /* error */
      /* let's die here */
      /* let's die here */
      failf(data, "Error while waiting for server connect");
      failf(data, "Error while waiting for server connect");
      return CURLE_FTP_PORT_FAILED;
      return CURLE_FTP_PORT_FAILED;
    case 0:  /* timeout */
    case 0:  /* timeout */
    /* let's die here */
      break; /* loop */
    failf(data, "Timeout while waiting for server connect");
    return CURLE_FTP_PORT_FAILED;
    default:
    default:
      /* we have received data here */
      /* we have received data here */
    {
      curl_socket_t s = CURL_SOCKET_BAD;
#ifdef ENABLE_IPV6
      struct Curl_sockaddr_storage add;
#else
      struct sockaddr_in add;
#endif
      curl_socklen_t size = (curl_socklen_t) sizeof(add);

      if(0 == getsockname(sock, (struct sockaddr *) &add, &size)) {
      if(0 == getsockname(sock, (struct sockaddr *) &add, &size)) {
        size = sizeof(add);
        size = sizeof(add);


@@ -345,7 +349,6 @@ static CURLcode AllowServerConnect(struct connectdata *conn)
      sclose(sock); /* close the first socket */
      sclose(sock); /* close the first socket */


      if(CURL_SOCKET_BAD == s) {
      if(CURL_SOCKET_BAD == s) {
        /* DIE! */
        failf(data, "Error accept()ing server connect");
        failf(data, "Error accept()ing server connect");
        return CURLE_FTP_PORT_FAILED;
        return CURLE_FTP_PORT_FAILED;
      }
      }
@@ -353,11 +356,10 @@ static CURLcode AllowServerConnect(struct connectdata *conn)


      conn->sock[SECONDARYSOCKET] = s;
      conn->sock[SECONDARYSOCKET] = s;
      curlx_nonblock(s, TRUE); /* enable non-blocking */
      curlx_nonblock(s, TRUE); /* enable non-blocking */
    }
    break;
  }

      return CURLE_OK;
      return CURLE_OK;
    } /* switch() */
  }
  /* never reaches this point */
}
}


/* initialize stuff to prepare for reading a fresh new response */
/* initialize stuff to prepare for reading a fresh new response */
@@ -664,7 +666,7 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */
      return CURLE_OPERATION_TIMEDOUT; /* already too little time */
      return CURLE_OPERATION_TIMEDOUT; /* already too little time */
    }
    }


    interval_ms = 1 * 1000;  /* use 1 second timeout intervals */
    interval_ms = 1000;  /* use 1 second timeout intervals */
    if(timeout < interval_ms)
    if(timeout < interval_ms)
      interval_ms = timeout;
      interval_ms = timeout;


@@ -3047,6 +3049,7 @@ static CURLcode ftp_easy_statemach(struct connectdata *conn)
  CURLcode result = CURLE_OK;
  CURLcode result = CURLE_OK;


  while(ftpc->state != FTP_STOP) {
  while(ftpc->state != FTP_STOP) {
    long interval_ms;
    long timeout_ms = ftp_state_timeout(conn);
    long timeout_ms = ftp_state_timeout(conn);


    if(timeout_ms <=0 ) {
    if(timeout_ms <=0 ) {
@@ -3054,30 +3057,31 @@ static CURLcode ftp_easy_statemach(struct connectdata *conn)
      return CURLE_OPERATION_TIMEDOUT; /* already too little time */
      return CURLE_OPERATION_TIMEDOUT; /* already too little time */
    }
    }


    interval_ms = 1000;  /* use 1 second timeout intervals */
    if(timeout_ms < interval_ms)
      interval_ms = timeout_ms;

    rc = Curl_socket_ready(ftpc->sendleft?CURL_SOCKET_BAD:sock, /* reading */
    rc = Curl_socket_ready(ftpc->sendleft?CURL_SOCKET_BAD:sock, /* reading */
                           ftpc->sendleft?sock:CURL_SOCKET_BAD, /* writing */
                           ftpc->sendleft?sock:CURL_SOCKET_BAD, /* writing */
                           (int)timeout_ms);
                           (int)interval_ms);


    if(rc == -1) {
    if(Curl_pgrsUpdate(conn))
      failf(data, "select/poll error");
      return CURLE_OUT_OF_MEMORY;
    }
    else if(rc == 0) {
      result = CURLE_OPERATION_TIMEDOUT;
      break;
    }
    else {
      result = ftp_statemach_act(conn);
      if(result)
        break;
      else if(Curl_pgrsUpdate(conn))
      result = CURLE_ABORTED_BY_CALLBACK;
      result = CURLE_ABORTED_BY_CALLBACK;
    else
    else
      result = Curl_speedcheck(data, Curl_tvnow());
      result = Curl_speedcheck(data, Curl_tvnow());


    if(result)
    if(result)
      break;
      break;

    if(rc == -1) {
      failf(data, "select/poll error");
      result = CURLE_OUT_OF_MEMORY;
    }
    }
    else if(rc)
      result = ftp_statemach_act(conn);

    if(result)
      break;
  }
  }


  return result;
  return result;