Blame src/testcurl/curl_version_check.c

Packit 875988
/*
Packit 875988
     This file is part of libmicrohttpd
Packit 875988
     Copyright (C) 2007 Christian Grothoff
Packit 875988
Packit 875988
     libmicrohttpd is free software; you can redistribute it and/or modify
Packit 875988
     it under the terms of the GNU General Public License as published
Packit 875988
     by the Free Software Foundation; either version 2, or (at your
Packit 875988
     option) any later version.
Packit 875988
Packit 875988
     libmicrohttpd is distributed in the hope that it will be useful, but
Packit 875988
     WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 875988
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 875988
     General Public License for more details.
Packit 875988
Packit 875988
     You should have received a copy of the GNU General Public License
Packit 875988
     along with libmicrohttpd; see the file COPYING.  If not, write to the
Packit 875988
     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Packit 875988
     Boston, MA 02110-1301, USA.
Packit 875988
*/
Packit 875988
Packit 875988
/**
Packit 875988
 * @file curl_version_check.c
Packit 875988
 * @brief  verify required cURL version is available to run tests
Packit 875988
 * @author Sagie Amir
Packit 875988
 */
Packit 875988
Packit 875988
#include "MHD_config.h"
Packit 875988
#include "platform.h"
Packit 875988
#include <curl/curl.h>
Packit 875988
Packit 875988
#ifndef WINDOWS
Packit 875988
#include <unistd.h>
Packit 875988
#endif
Packit 875988
Packit 875988
static int
Packit 875988
parse_version_number (const char **s)
Packit 875988
{
Packit 875988
  int i = 0;
Packit 875988
  char num[17];
Packit 875988
Packit 875988
  while (i < 16 && ((**s >= '0') & (**s <= '9')))
Packit 875988
    {
Packit 875988
      num[i] = **s;
Packit 875988
      (*s)++;
Packit 875988
      i++;
Packit 875988
    }
Packit 875988
Packit 875988
  num[i] = '\0';
Packit 875988
Packit 875988
  return atoi (num);
Packit 875988
}
Packit 875988
Packit 875988
const char *
Packit 875988
parse_version_string (const char *s, int *major, int *minor, int *micro)
Packit 875988
{
Packit 875988
  if (!s)
Packit 875988
    return NULL;
Packit 875988
  *major = parse_version_number (&s);
Packit 875988
  if (*s != '.')
Packit 875988
    return NULL;
Packit 875988
  s++;
Packit 875988
  *minor = parse_version_number (&s);
Packit 875988
  if (*s != '.')
Packit 875988
    return NULL;
Packit 875988
  s++;
Packit 875988
  *micro = parse_version_number (&s);
Packit 875988
  return s;
Packit 875988
}
Packit 875988
Packit 875988
#ifdef HTTPS_SUPPORT
Packit 875988
int
Packit 875988
curl_uses_nss_ssl()
Packit 875988
{
Packit 875988
  return (strstr(curl_version(), " NSS/") != NULL) ? 0 : -1;
Packit 875988
}
Packit 875988
#endif /* HTTPS_SUPPORT */
Packit 875988
Packit 875988
/*
Packit 875988
 * check local libcurl version matches required version
Packit 875988
 */
Packit 875988
int
Packit 875988
curl_check_version (const char *req_version)
Packit 875988
{
Packit 875988
  const char *ver;
Packit 875988
  const char *curl_ver;
Packit 875988
#ifdef HTTPS_SUPPORT
Packit 875988
  const char *ssl_ver;
Packit 875988
  const char *req_ssl_ver;
Packit 875988
#endif /* HTTPS_SUPPORT */
Packit 875988
Packit 875988
  int loc_major, loc_minor, loc_micro;
Packit 875988
  int rq_major, rq_minor, rq_micro;
Packit 875988
Packit 875988
  ver = curl_version ();
Packit 875988
#ifdef HAVE_MESSAGES
Packit 875988
  fprintf (stderr, "curl version: %s\n", ver);
Packit 875988
#endif
Packit 875988
  /*
Packit 875988
   * this call relies on the cURL string to be of the exact following format :
Packit 875988
   * 'libcurl/7.16.4 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/0.6.5' OR
Packit 875988
   * 'libcurl/7.18.2 GnuTLS/2.4.0 zlib/1.2.3.3 libidn/0.6.5'
Packit 875988
   */
Packit 875988
  curl_ver = strchr (ver, '/');
Packit 875988
  if (curl_ver == NULL)
Packit 875988
    return -1;
Packit 875988
  curl_ver++;
Packit 875988
  /* Parse version numbers */
Packit 875988
  if ( (NULL == parse_version_string (req_version, &rq_major, &rq_minor, &rq_micro)) ||
Packit 875988
       (NULL == parse_version_string (curl_ver, &loc_major, &loc_minor, &loc_micro)) )
Packit 875988
    return -1;
Packit 875988
Packit 875988
  /* Compare version numbers.  */
Packit 875988
  if ((loc_major > rq_major
Packit 875988
       || (loc_major == rq_major && loc_minor > rq_minor)
Packit 875988
       || (loc_major == rq_major && loc_minor == rq_minor
Packit 875988
           && loc_micro > rq_micro) || (loc_major == rq_major
Packit 875988
                                        && loc_minor == rq_minor
Packit 875988
                                        && loc_micro == rq_micro)) == 0)
Packit 875988
    {
Packit 875988
      fprintf (stderr,
Packit 875988
               "Error: running curl test depends on local libcurl version > %s\n",
Packit 875988
               req_version);
Packit 875988
      return -1;
Packit 875988
    }
Packit 875988
Packit 875988
  /*
Packit 875988
   * enforce required gnutls/openssl version.
Packit 875988
   * TODO use curl version string to assert use of gnutls
Packit 875988
   */
Packit 875988
#ifdef HTTPS_SUPPORT
Packit 875988
  ssl_ver = strchr (curl_ver, ' ');
Packit 875988
  if (ssl_ver == NULL)
Packit 875988
    return -1;
Packit 875988
  ssl_ver++;
Packit 875988
  if (strncmp ("GnuTLS", ssl_ver, strlen ("GNUtls")) == 0)
Packit 875988
    {
Packit 875988
      ssl_ver = strchr (ssl_ver, '/');
Packit 875988
      req_ssl_ver = MHD_REQ_CURL_GNUTLS_VERSION;
Packit 875988
    }
Packit 875988
  else if (strncmp ("OpenSSL", ssl_ver, strlen ("OpenSSL")) == 0)
Packit 875988
    {
Packit 875988
      ssl_ver = strchr (ssl_ver, '/');
Packit 875988
      req_ssl_ver = MHD_REQ_CURL_OPENSSL_VERSION;
Packit 875988
    }
Packit 875988
  else if (strncmp ("NSS", ssl_ver, strlen ("NSS")) == 0)
Packit 875988
    {
Packit 875988
      ssl_ver = strchr (ssl_ver, '/');
Packit 875988
      req_ssl_ver = MHD_REQ_CURL_NSS_VERSION;
Packit 875988
    }
Packit 875988
  else
Packit 875988
    {
Packit 875988
      fprintf (stderr, "Error: unrecognized curl ssl library\n");
Packit 875988
      return -1;
Packit 875988
    }
Packit 875988
  if (ssl_ver == NULL)
Packit 875988
    return -1;
Packit 875988
  ssl_ver++;
Packit 875988
  if ( (NULL == parse_version_string (req_ssl_ver, &rq_major, &rq_minor, &rq_micro)) ||
Packit 875988
       (NULL == parse_version_string (ssl_ver, &loc_major, &loc_minor, &loc_micro)) )
Packit 875988
    return -1;
Packit 875988
Packit 875988
  if ((loc_major > rq_major
Packit 875988
       || (loc_major == rq_major && loc_minor > rq_minor)
Packit 875988
       || (loc_major == rq_major && loc_minor == rq_minor
Packit 875988
           && loc_micro > rq_micro) || (loc_major == rq_major
Packit 875988
                                        && loc_minor == rq_minor
Packit 875988
                                        && loc_micro == rq_micro)) == 0)
Packit 875988
    {
Packit 875988
      fprintf (stderr,
Packit 875988
               "Error: running curl test depends on local libcurl SSL version > %s\n",
Packit 875988
               req_ssl_ver);
Packit 875988
      return -1;
Packit 875988
    }
Packit 875988
#endif /* HTTPS_SUPPORT */
Packit 875988
  return 0;
Packit 875988
}