From 2976de480808119dae08fc6f52c8d75ba1aedb1a Mon Sep 17 00:00:00 2001 From: Steve Holme Date: Sun, 22 Apr 2012 18:49:27 +0100 Subject: [PATCH] sspi: Added version information Added version information for Windows SSPI to curl's main version string and removed SSPI from the features string. --- lib/Makefile.m32 | 1 + lib/Makefile.vc6 | 1 + lib/curl_sspi.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++- lib/curl_sspi.h | 3 ++- lib/version.c | 26 ++++++++++++++----- src/Makefile.m32 | 1 + src/tool_getparam.c | 1 - winbuild/MakefileBuild.vc | 2 ++ 8 files changed, 90 insertions(+), 9 deletions(-) diff --git a/lib/Makefile.m32 b/lib/Makefile.m32 index adb5e5f..6f27742 100644 --- a/lib/Makefile.m32 +++ b/lib/Makefile.m32 @@ -169,6 +169,7 @@ endif endif ifdef SSPI CFLAGS += -DUSE_WINDOWS_SSPI + DLL_LIBS += -lversion endif ifdef SPNEGO CFLAGS += -DHAVE_SPNEGO diff --git a/lib/Makefile.vc6 b/lib/Makefile.vc6 index e69f31a..b6b4d68 100644 --- a/lib/Makefile.vc6 +++ b/lib/Makefile.vc6 @@ -123,6 +123,7 @@ CFGSET = FALSE !IFDEF WINDOWS_SSPI CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include +WINLIBS = $(WINLIBS) version.lib !ENDIF !IFDEF USE_IPV6 diff --git a/lib/curl_sspi.c b/lib/curl_sspi.c index b985dbc..e065f86 100644 --- a/lib/curl_sspi.c +++ b/lib/curl_sspi.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2009, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -101,6 +101,68 @@ Curl_sspi_global_init(void) return CURLE_OK; } +/* + * Curl_sspi_version() + * + * This function returns the SSPI library version information. + */ +CURLcode Curl_sspi_version(int *major, int *minor, int *build, int *special) +{ + CURLcode result = CURLE_OK; + VS_FIXEDFILEINFO *version_info = NULL; + LPTSTR version = NULL; + LPTSTR path = NULL; + LPVOID data = NULL; + DWORD size, handle; + + if(!s_hSecDll) + return CURLE_FAILED_INIT; + + path = malloc(MAX_PATH); + if(!path) + return CURLE_OUT_OF_MEMORY; + + if(GetModuleFileName(s_hSecDll, path, MAX_PATH)) { + size = GetFileVersionInfoSize(path, &handle); + if(size) { + data = malloc(size); + if(data) { + if(GetFileVersionInfo(path, handle, size, data)) { + if(!VerQueryValue(data, "\\", &version_info, &handle)) + result = CURLE_OUT_OF_MEMORY; + } + else + result = CURLE_OUT_OF_MEMORY; + } + else + result = CURLE_OUT_OF_MEMORY; + } + else + result = CURLE_OUT_OF_MEMORY; + } + else + result = CURLE_OUT_OF_MEMORY; + + /* Set the out parameters */ + if(!result) { + if(major) + *major = (version_info->dwProductVersionMS >> 16) & 0xffff; + + if(minor) + *minor = (version_info->dwProductVersionMS >> 0) & 0xffff; + + if(build) + *build = (version_info->dwProductVersionLS >> 16) & 0xffff; + + if(special) + *special = (version_info->dwProductVersionLS >> 0) & 0xffff; + } + + Curl_safefree(data); + Curl_safefree(path); + + return result; +} /* * Curl_sspi_global_cleanup() diff --git a/lib/curl_sspi.h b/lib/curl_sspi.h index c0e4f36..80e0b67 100644 --- a/lib/curl_sspi.h +++ b/lib/curl_sspi.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2010, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -62,6 +62,7 @@ #endif CURLcode Curl_sspi_global_init(void); +CURLcode Curl_sspi_version(int *major, int *minor, int *build, int *special); void Curl_sspi_global_cleanup(void); /* Forward-declaration of global variables defined in curl_sspi.c */ diff --git a/lib/version.c b/lib/version.c index c56ad39..38da9f1 100644 --- a/lib/version.c +++ b/lib/version.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -64,10 +64,16 @@ char *curl_version(void) { static char version[200]; - char *ptr=version; + char *ptr = version; size_t len; size_t left = sizeof(version); - strcpy(ptr, LIBCURL_NAME "/" LIBCURL_VERSION ); +#ifdef USE_WINDOWS_SSPI + int sspi_major = 0; + int sspi_minor = 0; + int sspi_build = 0; +#endif; + + strcpy(ptr, LIBCURL_NAME "/" LIBCURL_VERSION); len = strlen(ptr); left -= len; ptr += len; @@ -82,6 +88,17 @@ char *curl_version(void) } } +#ifdef USE_WINDOWS_SSPI + if(CURLE_OK == Curl_sspi_version(&sspi_major, &sspi_minor, &sspi_build, + NULL)) + len = snprintf(ptr, left, " sspi/%d.%d.%d", sspi_major, sspi_minor, + sspi_build); + else + len = snprintf(ptr, left, " sspi/unknown"); + + left -= len; + ptr += len; +#endif #ifdef HAVE_LIBZ len = snprintf(ptr, left, " zlib/%s", zlibVersion()); left -= len; @@ -243,9 +260,6 @@ static curl_version_info_data version_info = { #if defined(USE_NTLM) && defined(NTLM_WB_ENABLED) | CURL_VERSION_NTLM_WB #endif -#ifdef USE_WINDOWS_SSPI - | CURL_VERSION_SSPI -#endif #ifdef HAVE_LIBZ | CURL_VERSION_LIBZ #endif diff --git a/src/Makefile.m32 b/src/Makefile.m32 index 17c6116..69732e3 100644 --- a/src/Makefile.m32 +++ b/src/Makefile.m32 @@ -168,6 +168,7 @@ endif endif ifdef SSPI CFLAGS += -DUSE_WINDOWS_SSPI + curl_LDADD += -lversion endif ifdef SPNEGO CFLAGS += -DHAVE_SPNEGO diff --git a/src/tool_getparam.c b/src/tool_getparam.c index 5a24cc8..0245eda 100644 --- a/src/tool_getparam.c +++ b/src/tool_getparam.c @@ -275,7 +275,6 @@ static const struct feat feats[] = { {"NTLM_WB", CURL_VERSION_NTLM_WB}, {"SPNEGO", CURL_VERSION_SPNEGO}, {"SSL", CURL_VERSION_SSL}, - {"SSPI", CURL_VERSION_SSPI}, {"krb4", CURL_VERSION_KERBEROS4}, {"libz", CURL_VERSION_LIBZ}, {"CharConv", CURL_VERSION_CONV}, diff --git a/winbuild/MakefileBuild.vc b/winbuild/MakefileBuild.vc index 238b3ea..1a7850a 100644 --- a/winbuild/MakefileBuild.vc +++ b/winbuild/MakefileBuild.vc @@ -145,6 +145,7 @@ USE_SSPI=yes !IF "$(USE_SSPI)"=="yes" CFLAGS_SSPI = /DUSE_WINDOWS_SSPI +LFLAGS_SSPI = version.lib USE_SSPI=true !ENDIF @@ -283,6 +284,7 @@ CONFIG_NAME_LIB = $(CONFIG_NAME_LIB)-ipv6 !IF "$(USE_SSPI)"=="true" CFLAGS = $(CFLAGS) $(CFLAGS_SSPI) +LFLAGS = $(LFLAGS) $(LFLAGS_SSPI) CONFIG_NAME_LIB = $(CONFIG_NAME_LIB)-sspi !ENDIF -- 2.7.4