aboutsummaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorGunter Knauf <gk@gknw.de>2008-02-20 12:33:45 +0000
committerGunter Knauf <gk@gknw.de>2008-02-20 12:33:45 +0000
commitd208e56b1665ac17a96dae21885f56ee7b7f5227 (patch)
tree033bce3f594db4b6bcd2c89b348033f017741a5e /docs
parente6170eb20df55bc0b60dce4beec72ac44806b3e3 (diff)
added read callback function in order to prevent crashs on Win32 when linked against DLL:
Diffstat (limited to 'docs')
-rw-r--r--docs/examples/ftpupload.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/docs/examples/ftpupload.c b/docs/examples/ftpupload.c
index f4d3384ea..db209a78d 100644
--- a/docs/examples/ftpupload.c
+++ b/docs/examples/ftpupload.c
@@ -32,6 +32,22 @@
#define REMOTE_URL "ftp://localhost/" UPLOAD_FILE_AS
#define RENAME_FILE_TO "renamed-and-fine.txt"
+/* NOTE: if you want this example to work on Windows with libcurl as a
+ DLL, you MUST also provide a read callback with
+ CURLOPT_READFUNCTION. Failing to do so will give you a crash since a
+ DLL may not use the variable's memory when passed in to it from an app
+ like this. */
+static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
+{
+ /* in real-world cases, this would probably get this data differently
+ as this fread() stuff is exactly what the library already would do
+ by default internally */
+ size_t retcode = fread(ptr, size, nmemb, stream);
+
+ fprintf(stderr, "*** We read %d bytes from file\n", retcode);
+ return retcode;
+}
+
int main(int argc, char **argv)
{
CURL *curl;
@@ -63,6 +79,9 @@ int main(int argc, char **argv)
headerlist = curl_slist_append(headerlist, buf_1);
headerlist = curl_slist_append(headerlist, buf_2);
+ /* we want to use our own read function */
+ curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
+
/* enable uploading */
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1) ;
@@ -75,12 +94,6 @@ int main(int argc, char **argv)
/* now specify which file to upload */
curl_easy_setopt(curl, CURLOPT_READDATA, hd_src);
- /* NOTE: if you want this example to work on Windows with libcurl as a
- DLL, you MUST also provide a read callback with
- CURLOPT_READFUNCTION. Failing to do so will give you a crash since a
- DLL may not use the variable's memory when passed in to it from an app
- like this. */
-
/* Set the size of the file to upload (optional). If you give a *_LARGE
option you MUST make sure that the type of the passed-in argument is a
curl_off_t. If you use CURLOPT_INFILESIZE (without _LARGE) you must