1--- 2c: Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al. 3SPDX-License-Identifier: curl 4Title: CURLOPT_CHUNK_BGN_FUNCTION 5Section: 3 6Source: libcurl 7See-also: 8 - CURLOPT_CHUNK_END_FUNCTION (3) 9 - CURLOPT_WILDCARDMATCH (3) 10Protocol: 11 - FTP 12Added-in: 7.21.0 13--- 14 15# NAME 16 17CURLOPT_CHUNK_BGN_FUNCTION - callback before a transfer with FTP wildcard match 18 19# SYNOPSIS 20 21~~~c 22#include <curl/curl.h> 23 24struct curl_fileinfo { 25 char *filename; 26 curlfiletype filetype; 27 time_t time; /* always zero */ 28 unsigned int perm; 29 int uid; 30 int gid; 31 curl_off_t size; 32 long int hardlinks; 33 34 struct { 35 /* If some of these fields is not NULL, it is a pointer to b_data. */ 36 char *time; 37 char *perm; 38 char *user; 39 char *group; 40 char *target; /* pointer to the target filename of a symlink */ 41 } strings; 42 43 unsigned int flags; 44 45 /* used internally */ 46 char *b_data; 47 size_t b_size; 48 size_t b_used; 49}; 50 51long chunk_bgn_callback(const void *transfer_info, void *ptr, 52 int remains); 53 54CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CHUNK_BGN_FUNCTION, 55 chunk_bgn_callback); 56~~~ 57 58# DESCRIPTION 59 60Pass a pointer to your callback function, which should match the prototype 61shown above. 62 63This callback function gets called by libcurl before a part of the stream is 64going to be transferred (if the transfer supports chunks). 65 66The *transfer_info* pointer points to a **curl_fileinfo** struct with 67details about the file that is about to get transferred. 68 69This callback makes sense only when using the CURLOPT_WILDCARDMATCH(3) 70option for now. 71 72The target of transfer_info parameter is a "feature depended" structure. For 73the FTP wildcard download, the target is **curl_fileinfo** structure (see 74*curl/curl.h*). The parameter *ptr* is a pointer given by 75CURLOPT_CHUNK_DATA(3). The parameter remains contains number of chunks 76remaining per the transfer. If the feature is not available, the parameter has 77zero value. 78 79Return *CURL_CHUNK_BGN_FUNC_OK* if everything is fine, 80*CURL_CHUNK_BGN_FUNC_SKIP* if you want to skip the concrete chunk or 81*CURL_CHUNK_BGN_FUNC_FAIL* to tell libcurl to stop if some error occurred. 82 83# DEFAULT 84 85NULL 86 87# %PROTOCOLS% 88 89# EXAMPLE 90 91~~~c 92#include <stdio.h> 93 94struct callback_data { 95 FILE *output; 96}; 97 98static long file_is_coming(struct curl_fileinfo *finfo, 99 void *ptr, 100 int remains) 101{ 102 struct callback_data *data = ptr; 103 printf("%3d %40s %10luB ", remains, finfo->filename, 104 (unsigned long)finfo->size); 105 106 switch(finfo->filetype) { 107 case CURLFILETYPE_DIRECTORY: 108 printf(" DIR\n"); 109 break; 110 case CURLFILETYPE_FILE: 111 printf("FILE "); 112 break; 113 default: 114 printf("OTHER\n"); 115 break; 116 } 117 118 if(finfo->filetype == CURLFILETYPE_FILE) { 119 /* do not transfer files >= 50B */ 120 if(finfo->size > 50) { 121 printf("SKIPPED\n"); 122 return CURL_CHUNK_BGN_FUNC_SKIP; 123 } 124 125 data->output = fopen(finfo->filename, "wb"); 126 if(!data->output) { 127 return CURL_CHUNK_BGN_FUNC_FAIL; 128 } 129 } 130 131 return CURL_CHUNK_BGN_FUNC_OK; 132} 133 134int main() 135{ 136 /* data for callback */ 137 struct callback_data callback_info; 138 139 CURL *curl = curl_easy_init(); 140 141 /* callback is called before download of concrete file started */ 142 curl_easy_setopt(curl, CURLOPT_CHUNK_BGN_FUNCTION, file_is_coming); 143 curl_easy_setopt(curl, CURLOPT_CHUNK_DATA, &callback_info); 144} 145~~~ 146 147# %AVAILABILITY% 148 149# RETURN VALUE 150 151Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. 152