diff options
Diffstat (limited to 'docs')
| -rw-r--r-- | docs/examples/Makefile.inc | 20 | ||||
| -rw-r--r-- | docs/examples/ftp-wildcard.c | 136 | 
2 files changed, 144 insertions, 12 deletions
diff --git a/docs/examples/Makefile.inc b/docs/examples/Makefile.inc index c104368e9..78d312665 100644 --- a/docs/examples/Makefile.inc +++ b/docs/examples/Makefile.inc @@ -1,16 +1,12 @@  # These are all libcurl example programs to be test compiled -check_PROGRAMS = 10-at-a-time anyauthput cookie_interface \ -  debug fileupload fopen ftpget ftpgetresp ftpupload \ -  getinfo getinmemory http-post httpput \ -  https multi-app multi-debugcallback multi-double \ -  multi-post multi-single persistant post-callback \ -  postit2 sepheaders simple simplepost simplessl \ -  sendrecv httpcustomheader certinfo chkspeed ftpgetinfo +check_PROGRAMS = 10-at-a-time anyauthput cookie_interface debug fileupload \ +  fopen ftpget ftpgetresp ftpupload getinfo getinmemory http-post httpput  \ +  https multi-app multi-debugcallback multi-double multi-post multi-single \ +  persistant post-callback postit2 sepheaders simple simplepost simplessl  \ +  sendrecv httpcustomheader certinfo chkspeed ftpgetinfo ftp-wildcard  # These examples require external dependencies that may not be commonly  # available on POSIX systems, so don't bother attempting to compile them here. -COMPLICATED_EXAMPLES = \ - curlgtk.c curlx.c htmltitle.cc cacertinmem.c ftpuploadresume.c \ - ghiper.c hiperfifo.c htmltidy.c multithread.c \ - opensslthreadlock.c sampleconv.c synctime.c threaded-ssl.c evhiperfifo.c - +COMPLICATED_EXAMPLES = curlgtk.c curlx.c htmltitle.cc cacertinmem.c	   \ +  ftpuploadresume.c ghiper.c hiperfifo.c htmltidy.c multithread.c	   \ +  opensslthreadlock.c sampleconv.c synctime.c threaded-ssl.c evhiperfifo.c diff --git a/docs/examples/ftp-wildcard.c b/docs/examples/ftp-wildcard.c new file mode 100644 index 000000000..732515c7a --- /dev/null +++ b/docs/examples/ftp-wildcard.c @@ -0,0 +1,136 @@ +/***************************************************************************** + *                                  _   _ ____  _ + *  Project                     ___| | | |  _ \| | + *                             / __| | | | |_) | | + *                            | (__| |_| |  _ <| |___ + *                             \___|\___/|_| \_\_____| + * + */ + +#include <curl/curl.h> +#include <stdio.h> + +struct callback_data { +  FILE *output; +}; + +static long file_is_comming(struct curl_fileinfo *finfo, +                            struct callback_data *data, +                            int remains); + +static long file_is_downloaded(struct callback_data *data); + +static size_t write_it(char *buff, size_t size, size_t nmemb, +                       struct callback_data *data); + +int main(int argc, char **argv) +{ +  int rc = CURLE_OK; + +  /* curl easy handle */ +  CURL *handle; + +  /* help data */ +  struct callback_data data = { 0 }; + +  /* global initialization */ +  rc = curl_global_init(CURL_GLOBAL_ALL); +  if(rc) +    return rc; + +  /* initialization of easy handle */ +  handle = curl_easy_init(); +  if(!handle) { +    curl_global_cleanup(); +    return CURLE_OUT_OF_MEMORY; +  } + +  /* turn on wildcard matching */ +  curl_easy_setopt(handle, CURLOPT_WILDCARDMATCH, 1L); + +  /* callback is called before download of concrete file started */ +  curl_easy_setopt(handle, CURLOPT_CHUNK_BGN_FUNCTION, file_is_comming); + +  /* callback is called after data from the file have been transferred */ +  curl_easy_setopt(handle, CURLOPT_CHUNK_END_FUNCTION, file_is_downloaded); + +  /* this callback will write contents into files */ +  curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, write_it); + +  /* put transfer data into callbacks */ +  curl_easy_setopt(handle, CURLOPT_CHUNK_DATA, &data); +  curl_easy_setopt(handle, CURLOPT_WRITEDATA, &data); + +  /* curl_easy_setopt(handle, CURLOPT_VERBOSE, 1L); */ + +  /* set an URL containing wildcard pattern (only in the last part) */ +  if(argc == 2) +    curl_easy_setopt(handle, CURLOPT_URL, argv[1]); +  else +    curl_easy_setopt(handle, CURLOPT_URL, +      "ftp://curltest.howto.cz:123456@curltest.howto.cz/test/*"); + +  /* and start transfer! */ +  rc = curl_easy_perform(handle); + +  curl_easy_cleanup(handle); +  curl_global_cleanup(); +  return rc; +} + +static long file_is_comming(struct curl_fileinfo *finfo, +                            struct callback_data *data, +                            int remains) +{ +  printf("%3d %40s %10luB ", remains, finfo->filename, +         (unsigned long)finfo->size); + +  switch(finfo->filetype) { +  case CURLFILETYPE_DIRECTORY: +    printf(" DIR\n"); +    break; +  case CURLFILETYPE_FILE: +    printf("FILE "); +    break; +  default: +    printf("OTHER\n"); +    break; +  } + +  if(finfo->filetype == CURLFILETYPE_FILE) { +    /* do not transfer files >= 50B */ +    if(finfo->size > 50) { +      printf("SKIPPED\n"); +      return CURL_CHUNK_BGN_FUNC_SKIP; +    } + +    data->output = fopen(finfo->filename, "w"); +    if(!data->output) { +      return CURL_CHUNK_BGN_FUNC_FAIL; +    } +  } + +  return CURL_CHUNK_BGN_FUNC_OK; +} + +static long file_is_downloaded(struct callback_data *data) +{ +  if(data->output) { +    printf("DOWNLOADED\n"); +    fclose(data->output); +    data->output = 0x0; +  } +  return CURL_CHUNK_END_FUNC_OK; +} + +static size_t write_it(char *buff, size_t size, size_t nmemb, +                       struct callback_data *data) +{ +  size_t written = 0; +  if(data->output) +    written = fwrite(buff, size, nmemb, data->output); +  else +    /* listing output */ +    written = fwrite(buff, size, nmemb, stdout); +  return written; +}  | 
