/*============================================================================
  CMake - Cross Platform Makefile Generator
  Copyright 2000-2015 Kitware, Inc., Insight Software Consortium

  Distributed under the OSI-approved BSD License (the "License");
  see accompanying file Copyright.txt for details.

  This software is distributed WITHOUT ANY WARRANTY; without even the
  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  See the License for more information.
============================================================================*/
#include "cmCurl.h"
#include "cmSystemTools.h"

#define check_curl_result(result, errstr)                               \
  if (result != CURLE_OK && result != CURLE_NOT_BUILT_IN)               \
    {                                                                   \
    e += e.empty()? "" : "\n";                                          \
    e += errstr;                                                        \
    e += ::curl_easy_strerror(result);                                  \
    }

//----------------------------------------------------------------------------
std::string cmCurlSetCAInfo(::CURL *curl, const char* cafile)
{
  std::string e;
  if(cafile && *cafile)
    {
    ::CURLcode res = ::curl_easy_setopt(curl, CURLOPT_CAINFO, cafile);
    check_curl_result(res, "Unable to set TLS/SSL Verify CAINFO: ");
    }
#if !defined(CMAKE_USE_SYSTEM_CURL) && \
    !defined(_WIN32) && !defined(__APPLE__) && \
    !defined(CURL_CA_BUNDLE) && !defined(CURL_CA_PATH)
# define CMAKE_CAFILE_FEDORA "/etc/pki/tls/certs/ca-bundle.crt"
  else if(cmSystemTools::FileExists(CMAKE_CAFILE_FEDORA, true))
    {
    ::CURLcode res =
      ::curl_easy_setopt(curl, CURLOPT_CAINFO, CMAKE_CAFILE_FEDORA);
    check_curl_result(res, "Unable to set TLS/SSL Verify CAINFO: ");
    }
# undef CMAKE_CAFILE_FEDORA
  else
    {
#   define CMAKE_CAFILE_COMMON "/etc/ssl/certs/ca-certificates.crt"
    if(cmSystemTools::FileExists(CMAKE_CAFILE_COMMON, true))
      {
      ::CURLcode res =
        ::curl_easy_setopt(curl, CURLOPT_CAINFO, CMAKE_CAFILE_COMMON);
      check_curl_result(res, "Unable to set TLS/SSL Verify CAINFO: ");
      }
#   undef CMAKE_CAFILE_COMMON
#   define CMAKE_CAPATH_COMMON "/etc/ssl/certs"
    if(cmSystemTools::FileIsDirectory(CMAKE_CAPATH_COMMON))
      {
      ::CURLcode res =
        ::curl_easy_setopt(curl, CURLOPT_CAPATH, CMAKE_CAPATH_COMMON);
      check_curl_result(res, "Unable to set TLS/SSL Verify CAPATH: ");
      }
#   undef CMAKE_CAPATH_COMMON
    }
#endif
  return e;
}
