diff -ruNX exclude2nd curl-7.15.4-20060410/lib/getinfo.c ftpc/opensource/curl/lib/getinfo.c --- curl-7.15.4-20060410/lib/getinfo.c 2006-03-21 22:00:21.000000000 -0500 +++ ftpc/opensource/curl/lib/getinfo.c 2006-04-25 13:33:20.000000000 -0400 @@ -76,6 +76,7 @@ char **param_charp=NULL; struct curl_slist **param_slistp=NULL; va_start(arg, info); + char buf; switch(info&CURLINFO_TYPEMASK) { default: @@ -198,9 +199,23 @@ case CURLINFO_LASTSOCKET: if((data->state.lastconnect != -1) && (data->state.connects[data->state.lastconnect] != NULL)) + { *param_longp = data->state.connects[data->state.lastconnect]-> sock[FIRSTSOCKET]; - else + /* 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_FTPS|PROT_SSL)) { + /* use the SSL context */ + if (Curl_ssl_check_cxn(data) == 0) + *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; default: diff -ruNX exclude2nd curl-7.15.4-20060410/lib/sslgen.c ftpc/opensource/curl/lib/sslgen.c --- curl-7.15.4-20060410/lib/sslgen.c 2006-03-21 22:00:21.000000000 -0500 +++ ftpc/opensource/curl/lib/sslgen.c 2006-04-25 14:11:33.714102000 -0400 @@ -554,3 +554,23 @@ #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 SessionHandle *data) +{ + if (!data->state.connects[data->state.lastconnect]->ssl[FIRSTSOCKET].use) { + return -1; /* not using SSL, treat as unknown */ + } +#ifdef USE_SSLEAY + return Curl_ossl_check_cxn(data); +#else + return -1; /* connection status unknown */ +#endif /* USE_SSLEAY */ +} diff -ruNX exclude2nd curl-7.15.4-20060410/lib/sslgen.h ftpc/opensource/curl/lib/sslgen.h --- curl-7.15.4-20060410/lib/sslgen.h 2006-03-21 22:00:21.000000000 -0500 +++ ftpc/opensource/curl/lib/sslgen.h 2006-04-25 13:33:55.000000000 -0400 @@ -67,6 +67,8 @@ size_t Curl_ssl_version(char *buffer, size_t size); +int Curl_ssl_check_cxn(struct SessionHandle *data); + #if !defined(USE_SSL) && !defined(SSLGEN_C) /* set up blank macros for none-SSL builds */ #define Curl_ssl_close_all(x) diff -ruNX exclude2nd curl-7.15.4-20060410/lib/ssluse.c ftpc/opensource/curl/lib/ssluse.c --- curl-7.15.4-20060410/lib/ssluse.c 2006-04-07 22:00:21.000000000 -0400 +++ ftpc/opensource/curl/lib/ssluse.c 2006-04-25 14:07:49.000000000 -0400 @@ -584,6 +584,30 @@ #endif } +/* + * This function uses SSL_peek 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_ossl_check_cxn(struct SessionHandle *data) +{ + int rc; + char buf; + + rc = SSL_peek(data->state.connects[data->state.lastconnect]-> + ssl[FIRSTSOCKET].handle, (void*)&buf, 1); + if (rc > 0) + return 1; /* connection still in place */ + + if (rc == 0) + return 0; /* connection has been closed */ + + return -1; /* connection status unknown */ +} + #endif /* USE_SSLEAY */ /* Selects an OpenSSL crypto engine diff -ruNX exclude2nd curl-7.15.4-20060410/lib/ssluse.h ftpc/opensource/curl/lib/ssluse.h --- curl-7.15.4-20060410/lib/ssluse.h 2006-03-21 22:00:21.000000000 -0500 +++ ftpc/opensource/curl/lib/ssluse.h 2006-04-25 13:36:09.000000000 -0400 @@ -64,4 +64,6 @@ size_t Curl_ossl_version(char *buffer, size_t size); +int Curl_ossl_check_cxn(struct SessionHandle *data); + #endif