title: Authenticating libcurl FTP download in C++
body: <p>I am trying to upload a file using libcurl but it appears that it is not authenticating the connection to my server. I have tried using the <code>ftp://username:password@example.com/</code> but to no avail. This is my code:</p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;string.h&gt;
  #include &lt;curl/curl.h&gt;
  #include &lt;sys/types.h&gt;
  #include &lt;sys/stat.h&gt;
  #include &lt;fcntl.h&gt;
  #include &lt;errno.h&gt;
  #ifdef WIN32
  #include &lt;io.h&gt;
  #else
  #include &lt;unistd.h&gt;
  #endif
  #define LOCAL_FILE      "C:/myfile.txt"
  #define UPLOAD_FILE_AS  "file.txt"
  #define REMOTE_URL      "ftp://example.com/"  UPLOAD_FILE_AS
  #define RENAME_FILE_TO  "file.txt"
  static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
  {
      curl_off_t nread;
      size_t retcode = fread(ptr, size, nmemb, (FILE *) stream);
      nread = (curl_off_t) retcode;
      fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T " bytes from filen", nread);
      return retcode;
  }
  
  int main(void)
  {
      CURL *curl;
      CURLcode res;
      FILE *hd_src;
      struct stat file_info;
      curl_off_t fsize;
      struct curl_slist *headerlist = NULL;
      static const char buf_1[] = "RNFR " UPLOAD_FILE_AS;
      static const char buf_2[] = "RNTO " RENAME_FILE_TO;
  
      if (stat(LOCAL_FILE, &amp;file_info)) {
      printf("Couldnt open '%s': %sn", LOCAL_FILE, strerror(errno));
      return 1;
      }
      fsize = (curl_off_t) file_info.st_size;
      printf("Local file size: %" CURL_FORMAT_CURL_OFF_T " bytes.n", fsize);
      hd_src = fopen(LOCAL_FILE, "rb");
      curl_global_init(CURL_GLOBAL_ALL);
      curl = curl_easy_init();
      if (curl) {
      headerlist = curl_slist_append(headerlist, buf_1);
      headerlist = curl_slist_append(headerlist, buf_2);
      curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
      curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
      curl_easy_setopt(curl, CURLOPT_URL, REMOTE_URL);
      curl_easy_setopt(curl, CURLOPT_POSTQUOTE, headerlist);
      curl_easy_setopt(curl, CURLOPT_READDATA, hd_src);
      curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t) fsize);
  
      res = curl_easy_perform(curl);
  
      curl_slist_free_all(headerlist);
  
      /* always cleanup */
      curl_easy_cleanup(curl);
      }
      fclose(hd_src);     /* close the local file */
  
      curl_global_cleanup();
      return 0;
  }
  </code></pre>