1*6236dae4SAndroid Build Coastguard Worker--- 2*6236dae4SAndroid Build Coastguard Workerc: Copyright (C) Daniel Stenberg, <[email protected]>, et al. 3*6236dae4SAndroid Build Coastguard WorkerSPDX-License-Identifier: curl 4*6236dae4SAndroid Build Coastguard WorkerTitle: CURLOPT_READFUNCTION 5*6236dae4SAndroid Build Coastguard WorkerSection: 3 6*6236dae4SAndroid Build Coastguard WorkerSource: libcurl 7*6236dae4SAndroid Build Coastguard WorkerSee-also: 8*6236dae4SAndroid Build Coastguard Worker - CURLOPT_POST (3) 9*6236dae4SAndroid Build Coastguard Worker - CURLOPT_READDATA (3) 10*6236dae4SAndroid Build Coastguard Worker - CURLOPT_SEEKFUNCTION (3) 11*6236dae4SAndroid Build Coastguard Worker - CURLOPT_UPLOAD (3) 12*6236dae4SAndroid Build Coastguard Worker - CURLOPT_UPLOAD_BUFFERSIZE (3) 13*6236dae4SAndroid Build Coastguard Worker - CURLOPT_WRITEFUNCTION (3) 14*6236dae4SAndroid Build Coastguard WorkerProtocol: 15*6236dae4SAndroid Build Coastguard Worker - All 16*6236dae4SAndroid Build Coastguard WorkerAdded-in: 7.1 17*6236dae4SAndroid Build Coastguard Worker--- 18*6236dae4SAndroid Build Coastguard Worker 19*6236dae4SAndroid Build Coastguard Worker# NAME 20*6236dae4SAndroid Build Coastguard Worker 21*6236dae4SAndroid Build Coastguard WorkerCURLOPT_READFUNCTION - read callback for data uploads 22*6236dae4SAndroid Build Coastguard Worker 23*6236dae4SAndroid Build Coastguard Worker# SYNOPSIS 24*6236dae4SAndroid Build Coastguard Worker 25*6236dae4SAndroid Build Coastguard Worker~~~c 26*6236dae4SAndroid Build Coastguard Worker#include <curl/curl.h> 27*6236dae4SAndroid Build Coastguard Worker 28*6236dae4SAndroid Build Coastguard Workersize_t read_callback(char *buffer, size_t size, size_t nitems, void *userdata); 29*6236dae4SAndroid Build Coastguard Worker 30*6236dae4SAndroid Build Coastguard WorkerCURLcode curl_easy_setopt(CURL *handle, CURLOPT_READFUNCTION, read_callback); 31*6236dae4SAndroid Build Coastguard Worker~~~ 32*6236dae4SAndroid Build Coastguard Worker 33*6236dae4SAndroid Build Coastguard Worker# DESCRIPTION 34*6236dae4SAndroid Build Coastguard Worker 35*6236dae4SAndroid Build Coastguard WorkerPass a pointer to your callback function, as the prototype shows above. 36*6236dae4SAndroid Build Coastguard Worker 37*6236dae4SAndroid Build Coastguard WorkerThis callback function gets called by libcurl as soon as it needs to read data 38*6236dae4SAndroid Build Coastguard Workerin order to send it to the peer - like if you ask it to upload or post data to 39*6236dae4SAndroid Build Coastguard Workerthe server. The data area pointed at by the pointer *buffer* should be 40*6236dae4SAndroid Build Coastguard Workerfilled up with at most *size* multiplied with *nitems* number of bytes 41*6236dae4SAndroid Build Coastguard Workerby your function. *size* is always 1. 42*6236dae4SAndroid Build Coastguard Worker 43*6236dae4SAndroid Build Coastguard WorkerSet the *userdata* argument with the CURLOPT_READDATA(3) option. 44*6236dae4SAndroid Build Coastguard Worker 45*6236dae4SAndroid Build Coastguard WorkerYour function must return the actual number of bytes that it stored in the 46*6236dae4SAndroid Build Coastguard Workerdata area pointed at by the pointer *buffer*. Returning 0 signals 47*6236dae4SAndroid Build Coastguard Workerend-of-file to the library and causes it to stop the current transfer. 48*6236dae4SAndroid Build Coastguard Worker 49*6236dae4SAndroid Build Coastguard WorkerIf you stop the current transfer by returning 0 "pre-maturely" (i.e before the 50*6236dae4SAndroid Build Coastguard Workerserver expected it, like when you have said you would upload N bytes and you 51*6236dae4SAndroid Build Coastguard Workerupload less than N bytes), you may experience that the server "hangs" waiting 52*6236dae4SAndroid Build Coastguard Workerfor the rest of the data that is not sent. 53*6236dae4SAndroid Build Coastguard Worker 54*6236dae4SAndroid Build Coastguard WorkerThe read callback may return *CURL_READFUNC_ABORT* to stop the current 55*6236dae4SAndroid Build Coastguard Workeroperation immediately, resulting in a *CURLE_ABORTED_BY_CALLBACK* error 56*6236dae4SAndroid Build Coastguard Workercode from the transfer. 57*6236dae4SAndroid Build Coastguard Worker 58*6236dae4SAndroid Build Coastguard WorkerThe callback can return *CURL_READFUNC_PAUSE* to cause reading from this 59*6236dae4SAndroid Build Coastguard Workerconnection to pause. See curl_easy_pause(3) for further details. 60*6236dae4SAndroid Build Coastguard Worker 61*6236dae4SAndroid Build Coastguard Worker**Bugs**: when doing TFTP uploads, you must return the exact amount of data 62*6236dae4SAndroid Build Coastguard Workerthat the callback wants, or it is considered the final packet by the server 63*6236dae4SAndroid Build Coastguard Workerend and the transfer ends there. 64*6236dae4SAndroid Build Coastguard Worker 65*6236dae4SAndroid Build Coastguard WorkerIf you set this callback pointer to NULL, or do not set it at all, the default 66*6236dae4SAndroid Build Coastguard Workerinternal read function is used. It is doing an fread() on the FILE * userdata 67*6236dae4SAndroid Build Coastguard Workerset with CURLOPT_READDATA(3). 68*6236dae4SAndroid Build Coastguard Worker 69*6236dae4SAndroid Build Coastguard WorkerYou can set the total size of the data you are sending by using 70*6236dae4SAndroid Build Coastguard WorkerCURLOPT_INFILESIZE_LARGE(3) or CURLOPT_POSTFIELDSIZE_LARGE(3), 71*6236dae4SAndroid Build Coastguard Workerdepending on the type of transfer. For some transfer types it may be required 72*6236dae4SAndroid Build Coastguard Workerand it allows for better error checking. 73*6236dae4SAndroid Build Coastguard Worker 74*6236dae4SAndroid Build Coastguard Worker# DEFAULT 75*6236dae4SAndroid Build Coastguard Worker 76*6236dae4SAndroid Build Coastguard Workerfread(3) 77*6236dae4SAndroid Build Coastguard Worker 78*6236dae4SAndroid Build Coastguard Worker# %PROTOCOLS% 79*6236dae4SAndroid Build Coastguard Worker 80*6236dae4SAndroid Build Coastguard Worker# EXAMPLE 81*6236dae4SAndroid Build Coastguard Worker 82*6236dae4SAndroid Build Coastguard Worker~~~c 83*6236dae4SAndroid Build Coastguard Workersize_t read_callback(char *ptr, size_t size, size_t nmemb, void *userdata) 84*6236dae4SAndroid Build Coastguard Worker{ 85*6236dae4SAndroid Build Coastguard Worker FILE *readhere = (FILE *)userdata; 86*6236dae4SAndroid Build Coastguard Worker curl_off_t nread; 87*6236dae4SAndroid Build Coastguard Worker 88*6236dae4SAndroid Build Coastguard Worker /* copy as much data as possible into the 'ptr' buffer, but no more than 89*6236dae4SAndroid Build Coastguard Worker 'size' * 'nmemb' bytes. */ 90*6236dae4SAndroid Build Coastguard Worker size_t retcode = fread(ptr, size, nmemb, readhere); 91*6236dae4SAndroid Build Coastguard Worker 92*6236dae4SAndroid Build Coastguard Worker nread = (curl_off_t)retcode; 93*6236dae4SAndroid Build Coastguard Worker 94*6236dae4SAndroid Build Coastguard Worker fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T 95*6236dae4SAndroid Build Coastguard Worker " bytes from file\n", nread); 96*6236dae4SAndroid Build Coastguard Worker return retcode; 97*6236dae4SAndroid Build Coastguard Worker} 98*6236dae4SAndroid Build Coastguard Worker 99*6236dae4SAndroid Build Coastguard Workerint main(int argc, char **argv) 100*6236dae4SAndroid Build Coastguard Worker{ 101*6236dae4SAndroid Build Coastguard Worker FILE *file = fopen(argv[1], "rb"); 102*6236dae4SAndroid Build Coastguard Worker CURLcode result; 103*6236dae4SAndroid Build Coastguard Worker 104*6236dae4SAndroid Build Coastguard Worker CURL *curl = curl_easy_init(); 105*6236dae4SAndroid Build Coastguard Worker if(curl) { 106*6236dae4SAndroid Build Coastguard Worker /* set callback to use */ 107*6236dae4SAndroid Build Coastguard Worker curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback); 108*6236dae4SAndroid Build Coastguard Worker 109*6236dae4SAndroid Build Coastguard Worker /* pass in suitable argument to callback */ 110*6236dae4SAndroid Build Coastguard Worker curl_easy_setopt(curl, CURLOPT_READDATA, (void *)file); 111*6236dae4SAndroid Build Coastguard Worker 112*6236dae4SAndroid Build Coastguard Worker result = curl_easy_perform(curl); 113*6236dae4SAndroid Build Coastguard Worker } 114*6236dae4SAndroid Build Coastguard Worker} 115*6236dae4SAndroid Build Coastguard Worker~~~ 116*6236dae4SAndroid Build Coastguard Worker 117*6236dae4SAndroid Build Coastguard Worker# HISTORY 118*6236dae4SAndroid Build Coastguard Worker 119*6236dae4SAndroid Build Coastguard WorkerCURL_READFUNC_PAUSE return code was added in 7.18.0 and CURL_READFUNC_ABORT 120*6236dae4SAndroid Build Coastguard Workerwas added in 7.12.1. 121*6236dae4SAndroid Build Coastguard Worker 122*6236dae4SAndroid Build Coastguard Worker# %AVAILABILITY% 123*6236dae4SAndroid Build Coastguard Worker 124*6236dae4SAndroid Build Coastguard Worker# RETURN VALUE 125*6236dae4SAndroid Build Coastguard Worker 126*6236dae4SAndroid Build Coastguard WorkerThis returns CURLE_OK. 127