David McCreedy added CURLINFO_FTP_ENTRY_PATH to export the FTP entry path

This commit is contained in:
Daniel Stenberg 2006-03-21 22:30:03 +00:00
parent 83367f67de
commit 598ffeea89
9 changed files with 70 additions and 11 deletions

View file

@ -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;

View file

@ -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))

View file

@ -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;