[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 3/3 v2] Handle Windows CE and rewrite NT version handling.
From: |
Paolo Bonzini |
Subject: |
[PATCH 3/3 v2] Handle Windows CE and rewrite NT version handling. |
Date: |
Fri, 2 Oct 2009 03:00:09 +0200 |
* 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