From 2ffe834bffa893efcd8942736ab14e311a0087b3 Mon Sep 17 00:00:00 2001 From: Kamil Dudka Date: Sun, 16 May 2010 02:49:08 +0200 Subject: [PATCH] ftp wildcard: a new option CURLOPT_FNMATCH_DATA --- CHANGES | 4 ++++ RELEASE-NOTES | 2 +- docs/libcurl/curl_easy_setopt.3 | 9 ++++++--- docs/libcurl/symbols-in-versions | 1 + include/curl/curl.h | 6 +++++- lib/curl_fnmatch.c | 4 +++- lib/curl_fnmatch.h | 2 +- lib/ftplistparser.c | 2 +- lib/url.c | 4 +++- lib/urldata.h | 1 + tests/libtest/lib577.c | 2 +- 11 files changed, 27 insertions(+), 10 deletions(-) diff --git a/CHANGES b/CHANGES index d895ebeb6..115e33cf8 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,10 @@ Changelog +Kamil Dudka (16 May 2010) +- Pavel Raiskup introduced a new option CURLOPT_FNMATCH_DATA in order to pass + a custom data pointer to the callback specified by CURLOPT_FNMATCH_FUNCTION. + Daniel Stenberg (14 May 2010) - John-Mark Bell filed bug #3000052 that identified a problem (with an associated patch) with the OpenSSL handshake state machine when the multi diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 37348f91f..b73997900 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -2,7 +2,7 @@ Curl and libcurl 7.21.0 Public curl releases: 116 Command line options: 138 - curl_easy_setopt() options: 179 + curl_easy_setopt() options: 180 Public functions in libcurl: 58 Known libcurl bindings: 39 Contributors: 794 diff --git a/docs/libcurl/curl_easy_setopt.3 b/docs/libcurl/curl_easy_setopt.3 index 7fa4f7271..a26898f1e 100644 --- a/docs/libcurl/curl_easy_setopt.3 +++ b/docs/libcurl/curl_easy_setopt.3 @@ -507,13 +507,16 @@ Pass a pointer that will be untouched by libcurl and passed as the ptr argument to the \fICURL_CHUNK_BGN_FUNTION\fP and \fICURL_CHUNK_END_FUNTION\fP. (This was added in 7.21.0) .IP CURLOPT_FNMATCH_FUNCTION -Function pointer that should match \fBint function(const char *pattern, const -char *string)\fP prototype (see \fIcurl/curl.h\fP). It is used internally for -the wildcard matching feature. +Function pointer that should match \fBint function(void *ptr, const char +*pattern, const char *string)\fP prototype (see \fIcurl/curl.h\fP). It is used +internally for the wildcard matching feature. Return \fICURL_FNMATCHFUNC_MATCH\fP if pattern matches the string, \fICURL_FNMATCHFUNC_NOMATCH\fP if not or \fICURL_FNMATCHFUNC_FAIL\fP if an error occurred. (This was added in 7.21.0) +.IP CURLOPT_FNMATCH_DATA +Pass a pointer that will be untouched by libcurl and passed as the ptr argument +to the \fICURL_FNMATCH_FUNCTION\fP. (This was added in 7.21.0) .SH ERROR OPTIONS .IP CURLOPT_ERRORBUFFER Pass a char * to a buffer that the libcurl may store human readable error diff --git a/docs/libcurl/symbols-in-versions b/docs/libcurl/symbols-in-versions index a9bebe229..b33619ee0 100644 --- a/docs/libcurl/symbols-in-versions +++ b/docs/libcurl/symbols-in-versions @@ -220,6 +220,7 @@ CURLOPT_FAILONERROR 7.1 CURLOPT_FILE 7.1 7.9.7 CURLOPT_FILETIME 7.5 CURLOPT_FLAGS 7.1 - 7.9.2 +CURLOPT_FNMATCH_DATA 7.21.0 CURLOPT_FNMATCH_FUNCTION 7.21.0 CURLOPT_FOLLOWLOCATION 7.1 CURLOPT_FORBID_REUSE 7.7 diff --git a/include/curl/curl.h b/include/curl/curl.h index a2e26bad0..83ba078cb 100644 --- a/include/curl/curl.h +++ b/include/curl/curl.h @@ -285,7 +285,8 @@ typedef long (*curl_chunk_end_callback)(void *ptr); /* callback type for wildcard downloading pattern matching. If the string matches the pattern, return CURL_FNMATCHFUNC_MATCH value, etc. */ -typedef int (*curl_fnmatch_callback)(const char *pattern, +typedef int (*curl_fnmatch_callback)(void *ptr, + const char *pattern, const char *string); /* These are the return codes for the seek callbacks */ @@ -1431,6 +1432,9 @@ typedef enum { /* Let the application define custom chunk data pointer */ CINIT(CHUNK_DATA, OBJECTPOINT, 201), + /* FNMATCH_FUNCTION user pointer */ + CINIT(FNMATCH_DATA, OBJECTPOINT, 202), + CURLOPT_LASTENTRY /* the last unused */ } CURLoption; diff --git a/lib/curl_fnmatch.c b/lib/curl_fnmatch.c index 9628844ad..91485a52d 100644 --- a/lib/curl_fnmatch.c +++ b/lib/curl_fnmatch.c @@ -401,8 +401,10 @@ static int loop(const unsigned char *pattern, const unsigned char *string) } } -int Curl_fnmatch(const char *pattern, const char *string) +int Curl_fnmatch(void *ptr, const char *pattern, const char *string) { + (void)ptr; /* the argument is specified by the curl_fnmatch_callback + prototype, but not used by Curl_fnmatch() */ if(!pattern || !string) { return CURL_FNMATCH_FAIL; } diff --git a/lib/curl_fnmatch.h b/lib/curl_fnmatch.h index 3ffbc4575..6335d0312 100644 --- a/lib/curl_fnmatch.h +++ b/lib/curl_fnmatch.h @@ -39,6 +39,6 @@ * keywords: alnum, digit, xdigit, alpha, print, blank, lower, graph, space * and upper (use as "[[:alnum:]]") */ -int Curl_fnmatch(const char *pattern, const char *string); +int Curl_fnmatch(void *ptr, const char *pattern, const char *string); #endif /* HEADER_CURL_FNMATCH_H */ diff --git a/lib/ftplistparser.c b/lib/ftplistparser.c index faf314fe2..ff7045b1e 100644 --- a/lib/ftplistparser.c +++ b/lib/ftplistparser.c @@ -330,7 +330,7 @@ static CURLcode ftp_pl_insert_finfo(struct connectdata *conn, compare = Curl_fnmatch; /* filter pattern-corresponding filenames */ - if(compare(wc->pattern, finfo->filename) == 0) { + if(compare(conn->data->set.fnmatch_data, wc->pattern, finfo->filename) == 0) { /* discard symlink which is containing multiple " -> " */ if((finfo->filetype == CURLFILETYPE_SYMLINK) && (strstr(finfo->strings.target, " -> "))) { diff --git a/lib/url.c b/lib/url.c index cc73750e0..31976300c 100644 --- a/lib/url.c +++ b/lib/url.c @@ -2478,7 +2478,9 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, case CURLOPT_CHUNK_DATA: data->wildcard.customptr = va_arg(param, void *); break; - + case CURLOPT_FNMATCH_DATA: + data->set.fnmatch_data = va_arg(param, void *); + break; default: /* unknown tag and its companion, just ignore: */ result = CURLE_FAILED_INIT; /* correct this */ diff --git a/lib/urldata.h b/lib/urldata.h index 2c1b2fc4a..9db06405e 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -1424,6 +1424,7 @@ struct UserDefined { stopped */ curl_fnmatch_callback fnmatch; /* callback to decide which file corresponds to pattern (e.g. if WILDCARDMATCH is on) */ + void *fnmatch_data; }; struct Names { diff --git a/tests/libtest/lib577.c b/tests/libtest/lib577.c index ac995c3fc..fdab361e2 100644 --- a/tests/libtest/lib577.c +++ b/tests/libtest/lib577.c @@ -231,7 +231,7 @@ int test(char *URL) printf("===========================\n"); for(i = 0; i < testnum; i++) { - rc = Curl_fnmatch(tests[i].pattern, tests[i].string); + rc = Curl_fnmatch(NULL, tests[i].pattern, tests[i].string); if(rc != tests[i].result) { printf("Curl_fnmatch(\"%s\", \"%s\") should return %d (returns %d)\n", tests[i].pattern, tests[i].string, tests[i].result, rc);