Question

I have developed a ‘C’ application on a Linux box using the libcurl example http://curl.askapache.com/c/ftpupload.html I work fine. I have been asked to use SSL for both “data encryption for both the control channel and data channel.” I am not been able to find an example of adding SSL to the example I followed. Here is the core of the FTP program:

// get a FILE * of the same file
hd_src = fopen(local_file, "rb");

// curl init
curl_global_init(CURL_GLOBAL_ALL);

// get a curl handle
curl = curl_easy_init();

if (curl) { // build a list of commands to pass to libcurl
    headerlist = curl_slist_append(headerlist, buf_1);
#ifdef DEBUG
    // we want to use our own read function
    curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
#endif

    // enable uploading
    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);

    // specify target
    curl_easy_setopt(curl, CURLOPT_URL, ftp_url);
    curl_easy_setopt(curl, CURLOPT_USERPWD, user_password);
    curl_easy_setopt(curl, CURLOPT_PORT, 21);

    // pass in that last of FTP commands to run after the transfer
    curl_easy_setopt(curl, CURLOPT_POSTQUOTE, headerlist);

    // now specify which file to upload
    curl_easy_setopt(curl, CURLOPT_READDATA, hd_src);

    // Set the size of the file to upload
    curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t) fsize);

    // Now run off and do what you've been told!
    res = curl_easy_perform(curl);

    // Check for errors
    if (res != CURLE_OK) {
        char *s;
        s = malloc((sizeof(char) * 100) + 1);
        sprintf(s, "curl_easy_perform() failed: %s - Error Number: %d\n",
        curl_easy_strerror(res), res);
        returnResults->error = true;
        returnResults->errorMessage = s;
        return returnResults;
    }

    // clean up the FTP commands list
    curl_slist_free_all(headerlist);

    // always cleanup
    curl_easy_cleanup(curl);
}

fclose(hd_src); // close the local file
curl_global_cleanup();
Était-ce utile?

La solution

There's however an existing example code on the libcurl site showing how you do FTP-SSL to download a file: ftpsget.c - it shows the very little SSL magic you need to add. That magic is the same for uploads:

/* We activate SSL and we require it for both control and data */
curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL);

In fact, you can add this single line into the FTP upload example. and it'll do FTPS uploads for you.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top