|
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 |
}
|