diff --git a/CHANGES b/CHANGES index 9fa1ff566..da333ea35 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,8 @@ Changelog Daniel (21 March 2006) +- David McCreedy added CURLINFO_FTP_ENTRY_PATH. + - Xavier Bouchoux made the SSL connection non-blocking for the multi interface (when using OpenSSL). diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 780643ec3..91ee4e229 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -11,6 +11,7 @@ Curl and libcurl 7.15.4 This release includes the following changes: + o added CURLINFO_FTP_ENTRY_PATH o less blocking for the multi interface during SSL connect negotiation This release includes the following bugfixes: diff --git a/docs/curl.1 b/docs/curl.1 index a6745f55a..a9b77af77 100644 --- a/docs/curl.1 +++ b/docs/curl.1 @@ -21,7 +21,7 @@ .\" * $Id$ .\" ************************************************************************** .\" -.TH curl 1 "21 Feb 2006" "Curl 7.15.2" "Curl Manual" +.TH curl 1 "21 Mar 2006" "Curl 7.15.4" "Curl Manual" .SH NAME curl \- transfer a URL .SH SYNOPSIS @@ -1131,6 +1131,10 @@ Number of new connects made in the recent transfer. (Added in 7.12.3) .TP .B num_redirects Number of redirects that were followed in the request. (Added in 7.12.3) +.TP +.B ftp_entry_path +The initial path libcurl ended up in when logging on to the remote FTP +server. (Added in 7.15.4) .RE If this option is used several times, the last one will be used. diff --git a/docs/libcurl/curl_easy_getinfo.3 b/docs/libcurl/curl_easy_getinfo.3 index d16f6c6e9..f1d74b698 100644 --- a/docs/libcurl/curl_easy_getinfo.3 +++ b/docs/libcurl/curl_easy_getinfo.3 @@ -1,8 +1,27 @@ -.\" You can view this file with: -.\" nroff -man [file] -.\" $Id$ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2006, Daniel Stenberg, , et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at http://curl.haxx.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" * $Id$ +.\" ************************************************************************** .\" -.TH curl_easy_getinfo 3 "6 Oct 2005" "libcurl 7.12.3" "libcurl Manual" +.TH curl_easy_getinfo 3 "21 Mar 2006" "libcurl 7.15.4" "libcurl Manual" .SH NAME curl_easy_getinfo - extract information from a curl handle .SH SYNOPSIS @@ -148,6 +167,11 @@ working with the socket, you must call curl_easy_cleanup() as usual and let libcurl close the socket and cleanup other resources associated with the handle. This is typically used in combination with \fICURLOPT_CONNECT_ONLY\fP. (Added in 7.15.2) +.IP CURLINFO_FTP_ENTRY_PATH +Pass a pointer to a 'char *' to receive a pointer to a string holding the path +of the entry path. That is the initial path libcurl ended up in when logging +on to the remote FTP server. This stores a NULL as pointer if something is +wrong. (Added in 7.15.4) .SH TIMES .NF An overview of the six time values available from curl_easy_getinfo() diff --git a/include/curl/curl.h b/include/curl/curl.h index d531ba637..b4043a2c4 100644 --- a/include/curl/curl.h +++ b/include/curl/curl.h @@ -1292,9 +1292,10 @@ typedef enum { CURLINFO_SSL_ENGINES = CURLINFO_SLIST + 27, CURLINFO_COOKIELIST = CURLINFO_SLIST + 28, CURLINFO_LASTSOCKET = CURLINFO_LONG + 29, + CURLINFO_FTP_ENTRY_PATH = CURLINFO_STRING + 30, /* Fill in new entries below here! */ - CURLINFO_LASTONE = 29 + CURLINFO_LASTONE = 30 } CURLINFO; /* CURLINFO_RESPONSE_CODE is the new name for the option previously known as diff --git a/lib/ftp.c b/lib/ftp.c index 86d37eafc..2c6fc7981 100644 --- a/lib/ftp.c +++ b/lib/ftp.c @@ -2530,6 +2530,8 @@ static CURLcode ftp_statemach_act(struct connectdata *conn) } ftp->entrypath =dir; /* remember this */ infof(data, "Entry path is '%s'\n", ftp->entrypath); + /* also save it where getinfo can access it: */ + data->state.most_recent_ftp_entrypath = ftp->entrypath; } else { /* couldn't get the path */ @@ -3423,8 +3425,12 @@ CURLcode Curl_ftp_disconnect(struct connectdata *conn) if(ftp) { (void)ftp_quit(conn); /* ignore errors on the QUIT */ - if(ftp->entrypath) + if(ftp->entrypath) { + struct SessionHandle *data = conn->data; + data->state.most_recent_ftp_entrypath = NULL; free(ftp->entrypath); + ftp->entrypath = NULL; + } if(ftp->cache) { free(ftp->cache); ftp->cache = NULL; diff --git a/lib/getinfo.c b/lib/getinfo.c index 2a4c3aac4..c7b4cfa4a 100644 --- a/lib/getinfo.c +++ b/lib/getinfo.c @@ -187,6 +187,14 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...) case CURLINFO_COOKIELIST: *param_slistp = Curl_cookie_list(data); break; + case CURLINFO_FTP_ENTRY_PATH: + /* Return the entrypath string from the most recent connection. + This pointer was copied from the connectdata structure by FTP. + The actual string may be free()ed by subsequent libcurl calls so + it must be copied to a safer area before the next libcurl call. + Callers must never free it themselves. */ + *param_charp = data->state.most_recent_ftp_entrypath; + break; case CURLINFO_LASTSOCKET: if((data->state.lastconnect != -1) && (data->state.connects[data->state.lastconnect] != NULL)) diff --git a/lib/urldata.h b/lib/urldata.h index 1418f3e92..fb7382ad8 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -833,7 +833,7 @@ typedef enum { /* * Values that are generated, temporary or calculated internally for a - * "session handle" must be defined within the 'struct urlstate'. This struct + * "session handle" must be defined within the 'struct UrlState'. This struct * will be used within the SessionHandle struct. When the 'SessionHandle' * struct is cloned, this data MUST NOT be copied. * @@ -921,6 +921,10 @@ struct UrlState { #if defined(USE_SSLEAY) && defined(HAVE_OPENSSL_ENGINE_H) ENGINE *engine; #endif /* USE_SSLEAY */ + + /* a place to store the most recenlty set FTP entrypath */ + char *most_recent_ftp_entrypath; + }; @@ -950,7 +954,7 @@ struct DynamicStatic { * This 'UserDefined' struct must only contain data that is set once to go * for many (perhaps) independent connections. Values that are generated or * calculated internally for the "session handle" MUST be defined within the - * 'struct urlstate' instead. The only exceptions MUST note the changes in + * 'struct UrlState' instead. The only exceptions MUST note the changes in * the 'DynamicStatic' struct. */ @@ -964,7 +968,7 @@ struct UserDefined { this. */ void *out; /* the fetched file goes here */ void *in; /* the uploaded file is read from here */ - void *writeheader; /* write the header to this is non-NULL */ + void *writeheader; /* write the header to this if non-NULL */ char *set_url; /* what original URL to work on */ char *set_proxy; /* proxy to use */ long use_port; /* which port to use (when not using default) */ @@ -1111,7 +1115,7 @@ struct UserDefined { * From now on, the 'SessionHandle' must only contain data that is set once to * go for many (perhaps) independent connections. Values that are generated or * calculated internally for the "session handle" must be defined within the - * 'struct urlstate' instead. */ + * 'struct UrlState' instead. */ struct SessionHandle { struct curl_hash *hostcache; diff --git a/src/writeout.c b/src/writeout.c index b28928d2c..9d299f830 100644 --- a/src/writeout.c +++ b/src/writeout.c @@ -60,6 +60,7 @@ typedef enum { VAR_NUM_CONNECTS, VAR_REDIRECT_TIME, VAR_REDIRECT_COUNT, + VAR_FTP_ENTRY_PATH, VAR_NUM_OF_VARS /* must be the last */ } replaceid; @@ -88,6 +89,7 @@ static const struct variable replacements[]={ {"num_connects", VAR_NUM_CONNECTS}, {"time_redirect", VAR_REDIRECT_TIME}, {"num_redirects", VAR_REDIRECT_COUNT}, + {"ftp_entry_path", VAR_FTP_ENTRY_PATH}, {NULL, VAR_NONE} }; @@ -213,6 +215,13 @@ void ourWriteOut(CURL *curl, char *writeinfo) curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &stringp)) && stringp) fputs(stringp, stream); + break; + case VAR_FTP_ENTRY_PATH: + if((CURLE_OK == + curl_easy_getinfo(curl, CURLINFO_FTP_ENTRY_PATH, &stringp)) + && stringp) + fputs(stringp, stream); + break; default: break; }