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

David McCreedy provided a fix for CURLINFO_LASTSOCKET that does extended

checks on the to-be-returned socket to make sure it truly seems to be alive
and well. For SSL connection it (only) uses OpenSSL functions.
parent 97553437
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -6,6 +6,11 @@

                                  Changelog

Daniel (11 May 2006)
- David McCreedy provided a fix for CURLINFO_LASTSOCKET that does extended
  checks on the to-be-returned socket to make sure it truly seems to be alive
  and well. For SSL connection it (only) uses OpenSSL functions.

Daniel (10 May 2006)
- Fixed DICT in two aspects:

+1 −0
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@ Curl and libcurl 7.15.4

This release includes the following changes:

 o CURLINFO_LASTSOCKET returned sockets are now checked more before returned
 o curl-config got a --checkfor option to compare version numbers
 o line end conversions for FTP ASCII transfers
 o curl_multi_socket() API added (still mostly untested)
+17 −1
Original line number Diff line number Diff line
@@ -75,6 +75,8 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
  double *param_doublep=NULL;
  char **param_charp=NULL;
  struct curl_slist **param_slistp=NULL;
  char buf;

  va_start(arg, info);

  switch(info&CURLINFO_TYPEMASK) {
@@ -197,9 +199,23 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
    break;
  case CURLINFO_LASTSOCKET:
    if((data->state.lastconnect != -1) &&
       (data->state.connects[data->state.lastconnect] != NULL))
       (data->state.connects[data->state.lastconnect] != NULL)) {
      *param_longp = data->state.connects[data->state.lastconnect]->
        sock[FIRSTSOCKET];
      /* we have a socket connected, let's determine if the server shut down */
      /* determine if ssl */
      if(data->state.connects[data->state.lastconnect]->protocol & PROT_SSL) {
        /* use the SSL context */
        if (!Curl_ssl_check_cxn(data->state.connects[data->state.lastconnect]))
          *param_longp = -1;   /* FIN received */
      }
      else {
        /* use the socket */
        if(recv((int)data->state.connects[data->state.lastconnect]->
                sock[FIRSTSOCKET], (void*)&buf, 1, MSG_PEEK) == 0)
          *param_longp = -1;   /* FIN received */
      }
    }
    else
      *param_longp = -1;
    break;
+18 −0
Original line number Diff line number Diff line
@@ -554,3 +554,21 @@ size_t Curl_ssl_version(char *buffer, size_t size)
#endif /* USE_SSLEAY */
}


/*
 * This function tries to determine connection status.
 *
 * Return codes:
 *     1 means the connection is still in place
 *     0 means the connection has been closed
 *    -1 means the connection status is unknown
 */
int Curl_ssl_check_cxn(struct connectdata *conn)
{
#ifdef USE_SSLEAY
  return Curl_ossl_check_cxn(conn);
#else
  /* TODO: we lack implementation of this for GnuTLS */
  return -1; /* connection status unknown */
#endif /* USE_SSLEAY */
}
+2 −0
Original line number Diff line number Diff line
@@ -67,6 +67,8 @@ struct curl_slist *Curl_ssl_engines_list(struct SessionHandle *data);

size_t Curl_ssl_version(char *buffer, size_t size);

int Curl_ssl_check_cxn(struct connectdata *conn);

#if !defined(USE_SSL) && !defined(SSLGEN_C)
/* set up blank macros for none-SSL builds */
#define Curl_ssl_close_all(x)
Loading