summaryrefslogtreecommitdiff
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
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
-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;
}