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 Diff line number Diff line
@@ -7,6 +7,13 @@
                                  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)
- 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
+54 −50
Original line number Diff line number Diff line
@@ -309,34 +309,38 @@ static CURLcode AllowServerConnect(struct connectdata *conn)
{
  struct SessionHandle *data = conn->data;
  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 */
    failf(data, "Timed out before server could connect to us");
      failf(data, "Timeout while waiting for server connect");
      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 */
      /* let's die here */
      failf(data, "Error while waiting for server connect");
      return CURLE_FTP_PORT_FAILED;
    case 0:  /* timeout */
    /* let's die here */
    failf(data, "Timeout while waiting for server connect");
    return CURLE_FTP_PORT_FAILED;
      break; /* loop */
    default:
      /* 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)) {
        size = sizeof(add);

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

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

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

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

/* 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 */
    }

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

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

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

    if(timeout_ms <=0 ) {
@@ -3054,30 +3057,31 @@ static CURLcode ftp_easy_statemach(struct connectdata *conn)
      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 */
                           ftpc->sendleft?sock:CURL_SOCKET_BAD, /* writing */
                           (int)timeout_ms);
                           (int)interval_ms);

    if(rc == -1) {
      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))
    if(Curl_pgrsUpdate(conn))
      result = CURLE_ABORTED_BY_CALLBACK;
    else
      result = Curl_speedcheck(data, Curl_tvnow());

    if(result)
      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;