* lib/uname.c: Handle Windows CE and its processor types. Remove code for processors never supported by Windows 95/98/ME. Rewrite conversion of NT version numbers to product names. --- Same idea as 4/5 from the previous series. 5/5 is dropped.
ChangeLog | 7 +++ lib/uname.c | 162 ++++++++++++++++++++++++++++++++++++----------------------- 2 files changed, 106 insertions(+), 63 deletions(-) diff --git a/lib/uname.c b/lib/uname.c index ed747e1..81ce6a9 100644 --- a/lib/uname.c +++ b/lib/uname.c @@ -26,10 +26,37 @@ #include <unistd.h> #include <windows.h> -/* Mingw headers don't have latest processor codes. */ -#ifndef PROCESSOR_AMD_X8664 -# define PROCESSOR_AMD_X8664 8664 +/* Some headers lack some codes. */ +#ifndef VER_PLATFORM_WIN32_WINDOWS +# define VER_PLATFORM_WIN32_WINDOWS 1 #endif +#ifndef VER_PLATFORM_WIN32_CE +# define VER_PLATFORM_WIN32_CE 3 +#endif + +struct windows_version { + int major; + int minor; + int server_offset; + const char *name; +}; + +#define WIN_VER(major, minor, name) \ + { major, minor, 0, name } + +#define WIN_VER2(major, minor, workstation, server) \ + { major, minor, sizeof workstation, workstation "\0" server } + +struct windows_version versions[] = { + WIN_VER2 (3, -1, "Windows NT Workstation", "Windows NT Server"), + WIN_VER2 (4, -1, "Windows NT Workstation", "Windows NT Server"), + WIN_VER (5, 0, "Windows 2000"), + WIN_VER (5, 1, "Windows XP"), + WIN_VER (5, 2, "Windows Server 2003"), + WIN_VER2 (6, 0, "Windows Vista", "Windows Server 2008"), + WIN_VER2 (6, 1, "Windows 7", "Windows Server 2008 R2"), + WIN_VER2 (-1, -1, "Windows", "Windows Server") +}; int uname (struct utsname *buf) @@ -61,6 +88,11 @@ uname (struct utsname *buf) /* Windows NT or newer. */ super_version = "NT"; } + else if (version.dwPlatformId == VER_PLATFORM_WIN32_CE) + { + /* Windows CE. */ + super_version = "CE"; + } else if (version.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { /* Windows 95/98/ME. */ @@ -102,52 +134,49 @@ 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 (version.dwPlatformId == VER_PLATFORM_WIN32_NT) + switch (version.dwPlatformId) { - /* 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; + case VER_PLATFORM_WIN32_NT: + { + const struct windows_version *v; + const char *base; + int i; + + for (i = 0; i < sizeof (versions) / sizeof (versions[0]); i++) + { + v = &versions[i]; + if ((v->major == version.dwMajorVersion || v->major == -1) + && (v->minor == version.dwMinorVersion || v->minor == -1)) + 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 - { + + if (version.wProductType != VER_NT_WORKSTATION) + base = v->name + v->server_offset; + else + base = v->name; + + if (v->major == -1 || v->minor == -1) + sprintf (buf->release, "%s %u.%u", + base, + (unsigned int) version.dwMajorVersion, + (unsigned int) version.dwMinorVersion); + else + strcpy (buf->release, base); + break; + } + + case VER_PLATFORM_WIN32_WINDOWS: /* Windows 95/98/ME. */ sprintf (buf->release, "Windows %s", super_version); + break; + + case VER_PLATFORM_WIN32_CE: + default: + sprintf (buf->release, "Windows %s %u.%u", + super_version, + (unsigned int) version.dwMajorVersion, + (unsigned int) version.dwMinorVersion); + break; } strcpy (buf->version, version.szCSDVersion); @@ -164,8 +193,21 @@ uname (struct utsname *buf) /* Windows NT or newer. */ switch (info.wProcessorArchitecture) { - case PROCESSOR_ARCHITECTURE_AMD64: - strcpy (buf->machine, "x86_64"); + case PROCESSOR_ARCHITECTURE_MIPS: + strcpy (buf->machine, "MIPS"); + break; + case PROCESSOR_ARCHITECTURE_ALPHA: + case PROCESSOR_ARCHITECTURE_ALPHA64: + strcpy (buf->machine, "Alpha"); + break; + case PROCESSOR_ARCHITECTURE_PPC: + strcpy (buf->machine, "PowerPC"); + break; + case PROCESSOR_ARCHITECTURE_SHX: + strcpy (buf->machine, "SH"); + break; + case PROCESSOR_ARCHITECTURE_ARM: + strcpy (buf->machine, "ARM"); break; case PROCESSOR_ARCHITECTURE_IA64: strcpy (buf->machine, "ia64"); @@ -176,6 +218,12 @@ uname (struct utsname *buf) buf->machine[1] = '0' + (info.wProcessorLevel <= 6 ? info.wProcessorLevel : 6); break; + case PROCESSOR_ARCHITECTURE_AMD64: + strcpy (buf->machine, "x86_64"); + break; + case PROCESSOR_ARCHITECTURE_IA32_ON_WIN64: + strcpy (buf->machine, "i686"); + break; default: strcpy (buf->machine, "unknown"); break; @@ -184,22 +232,10 @@ uname (struct utsname *buf) else { /* Windows 95/98/ME. */ - switch (info.dwProcessorType) - { - case PROCESSOR_AMD_X8664: - strcpy (buf->machine, "x86_64"); - break; - case PROCESSOR_INTEL_IA64: - strcpy (buf->machine, "ia64"); - break; - default: - if (info.dwProcessorType % 100 == 86) - sprintf (buf->machine, "i%u", - (unsigned int) info.dwProcessorType); - else - strcpy (buf->machine, "unknown"); - break; - } + if (info.dwProcessorType % 100 == 86) + sprintf (buf->machine, "i%u", (unsigned int) info.dwProcessorType); + else + strcpy (buf->machine, "unknown"); } } -- 1.6.2.5