summaryrefslogtreecommitdiff
path: root/docs/examples/ftpget.c
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2002-01-08 13:05:44 +0000
committerDaniel Stenberg <daniel@haxx.se>2002-01-08 13:05:44 +0000
commit0b1197936c488950041cc54db9db9af1d82ea0b8 (patch)
tree69a8e695e9f04feb1c9d682ac4a2b5dfbf369f67 /docs/examples/ftpget.c
parentb545ac6391e317bfff5b10a5fda1f566c9a56531 (diff)
downloadgnurl-0b1197936c488950041cc54db9db9af1d82ea0b8.tar.gz
gnurl-0b1197936c488950041cc54db9db9af1d82ea0b8.tar.bz2
gnurl-0b1197936c488950041cc54db9db9af1d82ea0b8.zip
I made the write callback create the file the first time it gets called so
that it won't create an empty file if the remote file doesn't exist
Diffstat (limited to 'docs/examples/ftpget.c')
-rw-r--r--docs/examples/ftpget.c61
1 files changed, 50 insertions, 11 deletions
diff --git a/docs/examples/ftpget.c b/docs/examples/ftpget.c
index bdf854521..6d728c6ec 100644
--- a/docs/examples/ftpget.c
+++ b/docs/examples/ftpget.c
@@ -14,31 +14,70 @@
#include <curl/types.h>
#include <curl/easy.h>
-/* to make this work under windows, use the win32-functions from the
- win32socket.c file as well */
+/*
+ * This is an example showing how to get a single file from an FTP server.
+ * It delays the actual destination file creation until the first write
+ * callback so that it won't create an empty file in case the remote file
+ * doesn't exist or something else fails.
+ */
+
+struct FtpFile {
+ char *filename;
+ FILE *stream;
+};
+
+int my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream)
+{
+ struct FtpFile *out=(struct FtpFile *)stream;
+ if(out && !out->stream) {
+ /* open file for writing */
+ out->stream=fopen(out->filename, "wb");
+ if(!out->stream)
+ return -1; /* failure, can't open file to write */
+ }
+ return fwrite(buffer, size, nmemb, out->stream);
+}
+
-int main(int argc, char **argv)
+int main(void)
{
CURL *curl;
CURLcode res;
- FILE *ftpfile;
-
- /* local file name to store the file as */
- ftpfile = fopen("curl.tar.gz", "wb"); /* b is binary for win */
+ struct FtpFile ftpfile={
+ "curl.tar.gz", /* name to store the file as if succesful */
+ NULL
+ };
+ curl_global_init(CURL_GLOBAL_DEFAULT);
+
curl = curl_easy_init();
if(curl) {
- /* Get curl 7.7 from sunet.se's FTP site: */
+ /* Get curl 7.9.2 from sunet.se's FTP site: */
curl_easy_setopt(curl, CURLOPT_URL,
- "ftp://ftp.sunet.se/pub/www/utilities/curl/curl-7.7.tar.gz");
- curl_easy_setopt(curl, CURLOPT_FILE, ftpfile);
+ "ftp://ftp.sunet.se/pub/www/utilities/curl/curl-7.9.2.tar.gz");
+ /* Define our callback to get called when there's data to be written */
+ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
+ /* Set a pointer to our struct to pass to the callback */
+ curl_easy_setopt(curl, CURLOPT_FILE, &ftpfile);
+
+ /* Switch on full protocol/debug output */
+ curl_easy_setopt(curl, CURLOPT_VERBOSE, TRUE);
+
res = curl_easy_perform(curl);
/* always cleanup */
curl_easy_cleanup(curl);
+
+ if(CURLE_OK != res) {
+ /* we failed */
+ fprintf(stderr, "curl told us %d\n", res);
+ }
}
- fclose(ftpfile); /* close the local file */
+ if(ftpfile.stream)
+ fclose(ftpfile.stream); /* close the local file */
+
+ curl_global_cleanup();
return 0;
}