This is actually a better way to organize the checks: first try to get extended information, else fall back to OSVERSIONINFOA.
Given this, I can assert that Windows can provide version information and proceed with the big reindentation. * lib/uname.c: Check for OSVERSIONINFOEXA and fall back to OSVERSIONINFOA. After that, assume version info is available (big reindentation). --- ChangeLog | 7 +++ lib/uname.c | 161 +++++++++++++++++++++++++++-------------------------------- 2 files changed, 81 insertions(+), 87 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1ab1255..e0819f3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2009-10-01 Paolo Bonzini <[email protected]> + Assume GetVersionEx info is available, try to use only one call. + * lib/uname.c: Check for OSVERSIONINFOEXA and fall back to + OSVERSIONINFOA. After that, assume version info is available + (big reindentation). + +2009-10-01 Paolo Bonzini <[email protected]> + Use only one OSVERSIONINFOEXA struct, use ANSI version. * lib/uname.c: Use GetVersionExA, move API calls to the beginning. diff --git a/lib/uname.c b/lib/uname.c index d92e972..52519a6 100644 --- a/lib/uname.c +++ b/lib/uname.c @@ -24,6 +24,7 @@ #include <stdio.h> #include <unistd.h> +#include <assert.h> #include <windows.h> #include <assert.h> @@ -45,40 +46,39 @@ uname (struct utsname *buf) /* Determine major-major Windows version. OSVERSIONINFOEXA starts with the same fields as OSVERSIONINFOA, request those first. */ - version.dwOSVersionInfoSize = sizeof (OSVERSIONINFOA); + version.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEXA); have_version = GetVersionExA ((OSVERSIONINFOA *) &version); - if (have_version) + if (!have_version) { - if (version.dwPlatformId == VER_PLATFORM_WIN32_NT) - { - /* Windows NT or newer. */ - super_version = "NT"; + memset (&version, 0, sizeof (version)); + version.dwOSVersionInfoSize = sizeof (OSVERSIONINFOA); + have_version = GetVersionExA ((OSVERSIONINFOA *) &version); + assert (have_version); + } - version.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEXA); - have_version = GetVersionExA ((OSVERSIONINFOA *) &version); - assert (have_version); - } - else if (version.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) + if (version.dwPlatformId == VER_PLATFORM_WIN32_NT) + { + /* Windows NT or newer. */ + super_version = "NT"; + } + else if (version.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) + { + /* Windows 95/98/ME. */ + switch (version.dwMinorVersion) { - /* Windows 95/98/ME. */ - switch (version.dwMinorVersion) - { - case 0: - super_version = "95"; - break; - case 10: - super_version = "98"; - break; - case 90: - super_version = "ME"; - break; - default: - super_version = ""; - break; - } - } - else - super_version = ""; + case 0: + super_version = "95"; + break; + case 10: + super_version = "98"; + break; + case 90: + super_version = "ME"; + break; + default: + super_version = ""; + break; + } } else super_version = ""; @@ -90,17 +90,11 @@ uname (struct utsname *buf) For example, $ ./uname.exe -s => MINGW32_NT-5.1 */ - if (have_version) - sprintf (buf->sysname, "MINGW32_%s-%u.%u", super_version, - (unsigned int) version.dwMajorVersion, - (unsigned int) version.dwMinorVersion); - else - strcpy (buf->sysname, "MINGW32"); + sprintf (buf->sysname, "MINGW32_%s-%u.%u", super_version, + (unsigned int) version.dwMajorVersion, + (unsigned int) version.dwMinorVersion); #else - if (have_version) - sprintf (buf->sysname, "Windows%s", super_version); - else - strcpy (buf->sysname, "Windows"); + sprintf (buf->sysname, "Windows%s", super_version); #endif /* Fill in release, version. */ @@ -108,63 +102,56 @@ uname (struct utsname *buf) $ ./uname.exe -r => 1.0.11(0.46/3/2) $ ./uname.exe -v => 2008-08-25 23:40 There is no point in imitating this behaviour. */ - if (have_version) + if (version.dwPlatformId == VER_PLATFORM_WIN32_NT) { - if (version.dwPlatformId == VER_PLATFORM_WIN32_NT) + /* Windows NT or newer. */ + if (version.dwMajorVersion <= 4) + sprintf (buf->release, "Windows NT %u.%u", + (unsigned int) version.dwMajorVersion, + (unsigned int) version.dwMinorVersion); + else if (version.dwMajorVersion == 5) + switch (version.dwMinorVersion) + { + case 0: + strcpy (buf->release, "Windows 2000"); + break; + case 1: + strcpy (buf->release, "Windows XP"); + break; + case 2: + strcpy (buf->release, "Windows Server 2003"); + break; + default: + strcpy (buf->release, "Windows"); + break; + } + else if (version.dwMajorVersion == 6) { - /* Windows NT or newer. */ - if (version.dwMajorVersion <= 4) - sprintf (buf->release, "Windows NT %u.%u", - (unsigned int) version.dwMajorVersion, - (unsigned int) version.dwMinorVersion); - else if (version.dwMajorVersion == 5) - switch (version.dwMinorVersion) - { - case 0: - strcpy (buf->release, "Windows 2000"); - break; + if (version.wProductType != VER_NT_WORKSTATION) + strcpy (buf->release, "Windows Server 2008"); + else + switch (version.dwMinorVersion) + { + case 0: + strcpy (buf->release, "Windows Vista"); + break; case 1: - strcpy (buf->release, "Windows XP"); - break; - case 2: - strcpy (buf->release, "Windows Server 2003"); - break; - default: - strcpy (buf->release, "Windows"); - break; + default: /* versions not yet known */ + strcpy (buf->release, "Windows 7"); + break; } - else if (version.dwMajorVersion == 6) - { - if (version.wProductType != VER_NT_WORKSTATION) - strcpy (buf->release, "Windows Server 2008"); - else - switch (version.dwMinorVersion) - { - case 0: - strcpy (buf->release, "Windows Vista"); - break; - case 1: - default: /* versions not yet known */ - strcpy (buf->release, "Windows 7"); - break; - } - } - else - strcpy (buf->release, "Windows"); } else - { - /* Windows 95/98/ME. */ - sprintf (buf->release, "Windows %s", super_version); - } - strcpy (buf->version, version.szCSDVersion); + strcpy (buf->release, "Windows"); } else { - strcpy (buf->release, "Windows"); - strcpy (buf->version, ""); + /* Windows 95/98/ME. */ + sprintf (buf->release, "Windows %s", super_version); } + strcpy (buf->version, version.szCSDVersion); + /* Fill in machine. */ { SYSTEM_INFO info; @@ -172,7 +159,7 @@ uname (struct utsname *buf) GetSystemInfo (&info); /* Check for Windows NT, since the info.wProcessorLevel is garbage on Windows 95. */ - if (have_version && version.dwPlatformId == VER_PLATFORM_WIN32_NT) + if (version.dwPlatformId == VER_PLATFORM_WIN32_NT) { /* Windows NT or newer. */ switch (info.wProcessorArchitecture) -- 1.6.2.5
