--- /dev/null
+/* Copyright (C) 2001, 2006, 2008 Free Software Foundation, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "libguile/__scm.h"
+
+#include <windows.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "win32-uname.h"
+
+/*
+ * Get name and information about current kernel.
+ */
+int
+uname (struct utsname *uts)
+{
+ enum { WinNT, Win95, Win98, WinUnknown };
+ OSVERSIONINFO osver;
+ SYSTEM_INFO sysinfo;
+ DWORD sLength;
+ DWORD os = WinUnknown;
+
+ memset (uts, 0, sizeof (*uts));
+
+ osver.dwOSVersionInfoSize = sizeof (osver);
+ GetVersionEx (&osver);
+ GetSystemInfo (&sysinfo);
+
+ switch (osver.dwPlatformId)
+ {
+ case VER_PLATFORM_WIN32_NT: /* NT, Windows 2000 or Windows XP */
+ if (osver.dwMajorVersion == 4)
+ strcpy (uts->sysname, "Windows NT4x"); /* NT4x */
+ else if (osver.dwMajorVersion <= 3)
+ strcpy (uts->sysname, "Windows NT3x"); /* NT3x */
+ else if (osver.dwMajorVersion == 5 && osver.dwMinorVersion < 1)
+ strcpy (uts->sysname, "Windows 2000"); /* 2k */
+ else if (osver.dwMajorVersion >= 5)
+ strcpy (uts->sysname, "Windows XP"); /* XP */
+ os = WinNT;
+ break;
+
+ case VER_PLATFORM_WIN32_WINDOWS: /* Win95, Win98 or WinME */
+ if ((osver.dwMajorVersion > 4) ||
+ ((osver.dwMajorVersion == 4) && (osver.dwMinorVersion > 0)))
+ {
+ if (osver.dwMinorVersion >= 90)
+ strcpy (uts->sysname, "Windows ME"); /* ME */
+ else
+ strcpy (uts->sysname, "Windows 98"); /* 98 */
+ os = Win98;
+ }
+ else
+ {
+ strcpy (uts->sysname, "Windows 95"); /* 95 */
+ os = Win95;
+ }
+ break;
+
+ case VER_PLATFORM_WIN32s: /* Windows 3.x */
+ strcpy (uts->sysname, "Windows");
+ break;
+ }
+
+ sprintf (uts->version, "%ld.%02ld",
+ osver.dwMajorVersion, osver.dwMinorVersion);
+
+ if (osver.szCSDVersion[0] != '\0' &&
+ (strlen (osver.szCSDVersion) + strlen (uts->version) + 1) <
+ sizeof (uts->version))
+ {
+ strcat (uts->version, " ");
+ strcat (uts->version, osver.szCSDVersion);
+ }
+
+ sprintf (uts->release, "build %ld", osver.dwBuildNumber & 0xFFFF);
+
+ switch (sysinfo.wProcessorArchitecture)
+ {
+ case PROCESSOR_ARCHITECTURE_PPC:
+ strcpy (uts->machine, "ppc");
+ break;
+ case PROCESSOR_ARCHITECTURE_ALPHA:
+ strcpy (uts->machine, "alpha");
+ break;
+ case PROCESSOR_ARCHITECTURE_MIPS:
+ strcpy (uts->machine, "mips");
+ break;
+ case PROCESSOR_ARCHITECTURE_INTEL:
+ /*
+ * dwProcessorType is only valid in Win95 and Win98 and WinME
+ * wProcessorLevel is only valid in WinNT
+ */
+ switch (os)
+ {
+ case Win95:
+ case Win98:
+ switch (sysinfo.dwProcessorType)
+ {
+ case PROCESSOR_INTEL_386:
+ case PROCESSOR_INTEL_486:
+ case PROCESSOR_INTEL_PENTIUM:
+ sprintf (uts->machine, "i%ld", sysinfo.dwProcessorType);
+ break;
+ default:
+ strcpy (uts->machine, "i386");
+ break;
+ }
+ break;
+ case WinNT:
+ sprintf (uts->machine, "i%d86", sysinfo.wProcessorLevel);
+ break;
+ default:
+ strcpy (uts->machine, "unknown");
+ break;
+ }
+ break;
+ default:
+ strcpy (uts->machine, "unknown");
+ break;
+ }
+
+ sLength = sizeof (uts->nodename) - 1;
+ GetComputerName (uts->nodename, &sLength);
+ return 0;
+}