ftp wildcard: a new option CURLOPT_FNMATCH_DATA
authorKamil Dudka <kdudka@redhat.com>
Sun, 16 May 2010 00:49:08 +0000 (02:49 +0200)
committerKamil Dudka <kdudka@redhat.com>
Sun, 16 May 2010 00:52:33 +0000 (02:52 +0200)
CHANGES
RELEASE-NOTES
docs/libcurl/curl_easy_setopt.3
docs/libcurl/symbols-in-versions
include/curl/curl.h
lib/curl_fnmatch.c
lib/curl_fnmatch.h
lib/ftplistparser.c
lib/url.c
lib/urldata.h
tests/libtest/lib577.c

diff --git a/CHANGES b/CHANGES
index d895ebe..115e33c 100644 (file)
--- 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
index 37348f9..b739979 100644 (file)
@@ -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
index 7fa4f72..a26898f 100644 (file)
@@ -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
index a9bebe2..b33619e 100644 (file)
@@ -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
index a2e26ba..83ba078 100644 (file)
@@ -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;
 
index 9628844..91485a5 100644 (file)
@@ -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;
   }
index 3ffbc45..6335d03 100644 (file)
@@ -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 */
index faf314f..ff7045b 100644 (file)
@@ -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, " -> "))) {
index cc73750..3197630 100644 (file)
--- 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 */
index 2c1b2fc..9db0640 100644 (file)
@@ -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 {
index ac995c3..fdab361 100644 (file)
@@ -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);