bug-gnulib
[Top][All Lists]
Advanced

[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





reply via email to

[Prev in Thread] Current Thread [Next in Thread]