I made the write callback create the file the first time it gets called so
authorDaniel Stenberg <daniel@haxx.se>
Tue, 8 Jan 2002 13:05:44 +0000 (13:05 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 8 Jan 2002 13:05:44 +0000 (13:05 +0000)
that it won't create an empty file if the remote file doesn't exist

docs/examples/ftpget.c

index bdf8545..6d728c6 100644 (file)
 #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;
 }