]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
[v9_10] more windows VS14 compatibility work
authorEvan Hunt <each@isc.org>
Tue, 20 Jan 2015 23:46:00 +0000 (15:46 -0800)
committerEvan Hunt <each@isc.org>
Tue, 20 Jan 2015 23:46:00 +0000 (15:46 -0800)
(completes change #3987)

bin/named/win32/os.c
lib/isc/win32/include/isc/win32os.h
lib/isc/win32/libisc.def.in
lib/isc/win32/socket.c
lib/isc/win32/win32os.c

index a38df60d156457777ee95adf085d2c329a6a38ae..240c4d188c3f87e102fceed1d8ae759da311c47d 100644 (file)
@@ -80,9 +80,10 @@ ns_paths_init(void) {
 static void
 version_check(const char *progname) {
 
-       if(isc_win32os_majorversion() < 5)
+       if ((isc_win32os_versioncheck(4, 0, 0, 0) >= 0) &&
+           (isc_win32os_versioncheck(5, 0, 0, 0) < 0))
                return; /* No problem with Version 4.0 */
-       if(isc_win32os_versioncheck(5, 0, 2, 0) < 0)
+       if (isc_win32os_versioncheck(5, 0, 2, 0) < 0)
                if (ntservice_isservice())
                        NTReportError(progname, version_error);
                else
index bd40393619138f36cf6e1d90a208d0c2f22e24f3..34978fd4149d0f34dfe4f0885357163317bdfa7b 100644 (file)
@@ -29,30 +29,6 @@ ISC_LANG_BEGINDECLS
  * be determined.
  */
 
-unsigned int
-isc_win32os_majorversion(void);
-/*
- * Major Version of the O/S.
- */
-
-unsigned int
-isc_win32os_minorversion(void);
-/*
- * Minor Version of the O/S.
- */
-
-unsigned int
-isc_win32os_servicepackmajor(void);
-/*
- * Major Version of the Service Pack for O/S.
- */
-
-unsigned int
-isc_win32os_servicepackminor(void);
-/*
- * Minor Version of the Service Pack for O/S.
- */
-
 int
 isc_win32os_versioncheck(unsigned int major, unsigned int minor,
                     unsigned int updatemajor, unsigned int updateminor);
index 49a8e6aca51006e4325d9efa2231fe3aa9da5614..7f72aed8f8797b338edc2f8c8fbde2eac91e5c03 100644 (file)
@@ -729,10 +729,6 @@ isc_timermgr_destroy
 isc_timermgr_poke
 isc_tm_timegm
 isc_tm_strptime
-isc_win32os_majorversion
-isc_win32os_minorversion
-isc_win32os_servicepackmajor
-isc_win32os_servicepackminor
 isc_win32os_versioncheck
 openlog
 @IF PKCS11
index e50c0a060771fbfec17afd5ad1b44ba42689419c..1e078fb67a5f1c7c9012359ce15692bb09fa7090 100644 (file)
@@ -927,7 +927,7 @@ connection_reset_fix(SOCKET fd) {
        BOOL  bNewBehavior = FALSE;
        DWORD status;
 
-       if (isc_win32os_majorversion() < 5)
+       if (isc_win32os_versioncheck(5, 0, 0, 0) < 0)
                return (ISC_R_SUCCESS); /*  NT 4.0 has no problem */
 
        /* disable bad behavior using IOCTL: SIO_UDP_CONNRESET */
index 74c6ea418611112c9d14e345bf752e2f7c15bc78..c02dfc6016aa02a998f65c88b7346b5e950479ca 100644 (file)
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: win32os.c,v 1.5 2007/06/19 23:47:19 tbox Exp $ */
-
 #include <windows.h>
 
+#ifndef TESTVERSION
 #include <isc/win32os.h>
+#else
+#include <stdio.h>
+#endif
 
-static BOOL bInit = FALSE;
-static OSVERSIONINFOEX osVer;
-
-static void
-initialize_action(void) {
-       BOOL bSuccess;
+int
+isc_win32os_versioncheck(unsigned int major, unsigned int minor,
+                        unsigned int spmajor, unsigned int spminor)
+{
+       OSVERSIONINFOEX osVer;
+       DWORD typeMask;
+       ULONGLONG conditionMask;
 
-       if (bInit)
-               return;
-       /*
-        * NOTE: VC++ 6.0 gets this function declaration wrong
-        * so we compensate by casting the argument
-        * NOTE: GetVersionEx() deprecated in Windows 8.1
-        */
+       memset(&osVer, 0, sizeof(OSVERSIONINFOEX));
        osVer.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
-       bSuccess = GetVersionEx((OSVERSIONINFO *) &osVer);
-
-       /*
-        * Versions of NT before NT4.0 SP6 did not return the
-        * extra info that the EX structure provides and returns
-        * a failure so we need to retry with the old structure.
-        */
-       if(!bSuccess) {
-               osVer.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
-               (void)GetVersionEx((OSVERSIONINFO *) &osVer);
-       }
-       bInit = TRUE;
-}
+       typeMask = 0;
+       conditionMask = 0;
 
-unsigned int
-isc_win32os_majorversion(void) {
-       initialize_action();
-       return ((unsigned int)osVer.dwMajorVersion);
-}
-
-unsigned int
-isc_win32os_minorversion(void) {
-       initialize_action();
-       return ((unsigned int)osVer.dwMinorVersion);
-}
-
-unsigned int
-isc_win32os_servicepackmajor(void) {
-       initialize_action();
-       return ((unsigned int)osVer.wServicePackMajor);
-}
+       /* Optimistic: likely greater */
+       osVer.dwMajorVersion = major;
+       typeMask |= VER_MAJORVERSION;
+       conditionMask = VerSetConditionMask(conditionMask,
+                                           VER_MAJORVERSION,
+                                           VER_GREATER);
+       osVer.dwMinorVersion = minor;
+       typeMask |= VER_MINORVERSION;
+       conditionMask = VerSetConditionMask(conditionMask,
+                                           VER_MINORVERSION,
+                                           VER_GREATER);
+       osVer.wServicePackMajor = spmajor;
+       typeMask |= VER_SERVICEPACKMAJOR;
+       conditionMask = VerSetConditionMask(conditionMask,
+                                           VER_SERVICEPACKMAJOR,
+                                           VER_GREATER);
+       osVer.wServicePackMinor = spminor;
+       typeMask |= VER_SERVICEPACKMINOR;
+       conditionMask = VerSetConditionMask(conditionMask,
+                                           VER_SERVICEPACKMINOR,
+                                           VER_GREATER);
+       if (VerifyVersionInfo(&osVer, typeMask, conditionMask))
+               return (1);
 
-unsigned int
-isc_win32os_servicepackminor(void) {
-       initialize_action();
-       return ((unsigned int)osVer.wServicePackMinor);
+       /* Failed: retry with equal */
+       conditionMask = 0;
+       conditionMask = VerSetConditionMask(conditionMask,
+                                           VER_MAJORVERSION,
+                                           VER_EQUAL);
+       conditionMask = VerSetConditionMask(conditionMask,
+                                           VER_MINORVERSION,
+                                           VER_EQUAL);
+       conditionMask = VerSetConditionMask(conditionMask,
+                                           VER_SERVICEPACKMAJOR,
+                                           VER_EQUAL);
+       conditionMask = VerSetConditionMask(conditionMask,
+                                           VER_SERVICEPACKMINOR,
+                                           VER_EQUAL);
+       if (VerifyVersionInfo(&osVer, typeMask, conditionMask))
+               return (0);
+       else
+               return (-1);
 }
 
+#ifdef TESTVERSION
 int
-isc_win32os_versioncheck(unsigned int major, unsigned int minor,
-                    unsigned int spmajor, unsigned int spminor) {
+main(int argc, char **argv) {
+       unsigned int major = 0;
+       unsigned int minor = 0;
+       unsigned int spmajor = 0;
+       unsigned int spminor = 0;
+       int ret;
 
-       initialize_action();
+       if (argc > 1) {
+               --argc;
+               ++argv;
+               major = (unsigned int) atoi(argv[0]);
+       }
+       if (argc > 1) {
+               --argc;
+               ++argv;
+               minor = (unsigned int) atoi(argv[0]);
+       }
+       if (argc > 1) {
+               --argc;
+               ++argv;
+               spmajor = (unsigned int) atoi(argv[0]);
+       }
+       if (argc > 1) {
+               --argc;
+               ++argv;
+               spminor = (unsigned int) atoi(argv[0]);
+       }
 
-       if (major < isc_win32os_majorversion())
-               return (1);
-       if (major > isc_win32os_majorversion())
-               return (-1);
-       if (minor < isc_win32os_minorversion())
-               return (1);
-       if (minor > isc_win32os_minorversion())
-               return (-1);
-       if (spmajor < isc_win32os_servicepackmajor())
-               return (1);
-       if (spmajor > isc_win32os_servicepackmajor())
-               return (-1);
-       if (spminor < isc_win32os_servicepackminor())
-               return (1);
-       if (spminor > isc_win32os_servicepackminor())
-               return (-1);
+       ret = isc_win32os_versioncheck(major, minor, spmajor, spminor);
 
-       /* Exact */
-       return (0);
+       printf("%s major %u minor %u SP major %u SP minor %u\n",
+              ret > 0 ? "greater" : (ret == 0 ? "equal" : "less"),
+              major, minor, spmajor, spminor);
+       return (ret);
 }
+#endif