summaryrefslogtreecommitdiffstats
path: root/win/uname.c
diff options
context:
space:
mode:
Diffstat (limited to 'win/uname.c')
-rw-r--r--win/uname.c263
1 files changed, 263 insertions, 0 deletions
diff --git a/win/uname.c b/win/uname.c
new file mode 100644
index 000000000..a6b8d7fd5
--- /dev/null
+++ b/win/uname.c
@@ -0,0 +1,263 @@
+/*
+ This file is part of the KDE libraries
+ Copyright (C) 2003-2007 Jaroslaw Staniek <js@iidea.pl>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <windows.h>
+
+#include <sys/utsname.h>
+#include <stdio.h>
+
+typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
+
+#ifndef SM_SERVERR2
+# define SM_SERVERR2 89
+#endif
+
+int kde_gethostname(char *__name, size_t __len);
+
+/**
+ MS Windows implementation of uname().
+
+ E.g. on Windows 2000
+ <code>
+ utsname n;
+ printf("%s, %s, %s, %s, %s\n", n.sysname, n.release, n.version, n.machine, n.nodename);
+ </code>
+ it will print something like:
+ <code>
+ Microsoft Windows, 5.0 (2000 Professional), Dec 16 2004, i686, MYHOSTNAME
+ </code>
+
+ Note that utsname.version is just a compile time of kdewin32 library (__DATE__).
+*/
+KDEWIN32_EXPORT int uname(struct utsname *name)
+{
+ OSVERSIONINFOEX versioninfo;
+ SYSTEM_INFO sysinfo;
+ PGNSI pGNSI;
+ unsigned int proctype;
+ char valid_processor_level;
+ char *ostype = 0;
+ char *osproduct = 0;
+ char tmpnodename[MAX_COMPUTERNAME_LENGTH+2];
+ size_t tmpnodenamelen = MAX_COMPUTERNAME_LENGTH+1;
+ BOOL osVersionInfoEx;
+
+ if (!name)
+ return -1;
+
+ ZeroMemory(&sysinfo, sizeof(SYSTEM_INFO));
+ ZeroMemory(&versioninfo, sizeof(OSVERSIONINFOEX));
+
+ /* Try calling GetVersionEx using the OSVERSIONINFOEX,
+ if that fails, try using the OSVERSIONINFO. */
+ versioninfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
+ if ( !(osVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &versioninfo)) ) {
+ versioninfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
+ if (! GetVersionEx ( (OSVERSIONINFO *) &versioninfo) )
+ return -1;
+ }
+
+ valid_processor_level = versioninfo.dwPlatformId == VER_PLATFORM_WIN32_NT
+ || (versioninfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS && versioninfo.dwMinorVersion >= 10 /*>= win98*/);
+
+ /* Use GetNativeSystemInfo if supported or GetSystemInfo otherwise */
+ pGNSI = (PGNSI) GetProcAddress(
+ GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo");
+ if (NULL != pGNSI)
+ pGNSI(&sysinfo);
+ else
+ GetSystemInfo(&sysinfo);
+
+ /* CPU type */
+ switch (sysinfo.wProcessorArchitecture) {
+ case PROCESSOR_ARCHITECTURE_INTEL:
+ if (valid_processor_level) {
+ if (sysinfo.wProcessorLevel<3)
+ proctype = 3;
+ else if (sysinfo.wProcessorLevel > 9) /*Pentium 4?*/
+ proctype = 6;
+ else /*typical*/
+ proctype = sysinfo.wProcessorLevel;
+ }
+ else {
+ if (sysinfo.dwProcessorType == PROCESSOR_INTEL_386
+ || sysinfo.dwProcessorType == PROCESSOR_INTEL_486)
+ proctype = sysinfo.dwProcessorType / 100;
+ else
+ proctype = PROCESSOR_INTEL_PENTIUM / 100;
+ }
+ sprintf (name->machine, "i%d86", proctype);
+ break;
+ case PROCESSOR_ARCHITECTURE_ALPHA:
+ strcpy (name->machine, "alpha");
+ break;
+ case PROCESSOR_ARCHITECTURE_MIPS:
+ strcpy (name->machine, "mips");
+ break;
+ default:
+ strcpy (name->machine, "unknown");
+ break;
+ }
+
+ strncpy(name->sysname, "Microsoft Windows", 19);
+
+ /* OS Type */
+ switch (versioninfo.dwPlatformId) {
+ case VER_PLATFORM_WIN32_NT:
+ switch (versioninfo.dwMajorVersion) {
+ case 3:
+ case 4:
+ ostype = "NT";
+ break;
+ case 5:
+ switch (versioninfo.dwMinorVersion) {
+ case 0:
+ ostype = "2000";
+ break;
+ case 1:
+ ostype = "XP";
+ break;
+ case 2:
+ if( GetSystemMetrics(SM_SERVERR2) )
+ ostype = "Server 2003 \"R2\"";
+ else if( versioninfo.wProductType == VER_NT_WORKSTATION
+ && sysinfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
+ ostype = "XP Professional x64 Edition";
+ else
+ ostype = "Server 2003";
+ break;
+ }
+ break;
+ case 6:
+ switch (versioninfo.dwMinorVersion) {
+ case 0:
+ switch (versioninfo.wProductType) {
+ case VER_NT_WORKSTATION:
+ ostype = "Vista";
+ break;
+ default:
+ ostype = "Server \"Longhorn\"";
+ break;
+ }
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+ case VER_PLATFORM_WIN32_WINDOWS:
+ switch (versioninfo.dwMinorVersion) {
+ case 0:
+ ostype = "95";
+ break;
+ case 10:
+ ostype = "98";
+ break;
+ case 90:
+ ostype = "Me";
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+
+ /* Test for specific product on Windows NT 4.0 SP6 and later */
+ if (osVersionInfoEx) {
+ /* Workstation type */
+ if ( versioninfo.wProductType == VER_NT_WORKSTATION
+ && sysinfo.wProcessorArchitecture!=PROCESSOR_ARCHITECTURE_AMD64)
+ {
+ if( versioninfo.dwMajorVersion == 4 )
+ osproduct = "Workstation 4.0";
+ else if( versioninfo.wSuiteMask & VER_SUITE_PERSONAL )
+ osproduct = "Home Edition";
+ else
+ osproduct = "Professional";
+ }
+ /* Server type */
+ else if ( versioninfo.wProductType == VER_NT_SERVER
+ || versioninfo.wProductType == VER_NT_DOMAIN_CONTROLLER )
+ {
+ if (versioninfo.dwMajorVersion == 5 && versioninfo.dwMinorVersion == 2) {
+ if ( sysinfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 ) {
+ if( versioninfo.wSuiteMask & VER_SUITE_DATACENTER )
+ osproduct = "Datacenter Edition for Itanium-based Systems";
+ else if( versioninfo.wSuiteMask & VER_SUITE_ENTERPRISE )
+ osproduct = "Enterprise Edition for Itanium-based Systems";
+ }
+ else if ( sysinfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ) {
+ if ( versioninfo.wSuiteMask & VER_SUITE_DATACENTER )
+ osproduct = "Datacenter x64 Edition";
+ else if ( versioninfo.wSuiteMask & VER_SUITE_ENTERPRISE )
+ osproduct = "Enterprise x64 Edition";
+ else
+ osproduct = "Standard x64 Edition";
+ }
+ else {
+ if ( versioninfo.wSuiteMask & VER_SUITE_DATACENTER )
+ osproduct = "Datacenter Edition";
+ else if ( versioninfo.wSuiteMask & VER_SUITE_ENTERPRISE )
+ osproduct = "Enterprise Edition";
+ else if ( versioninfo.wSuiteMask & VER_SUITE_BLADE )
+ osproduct = "Web Edition";
+ else
+ osproduct = "Standard Edition";
+ }
+ }
+ else if ( versioninfo.dwMajorVersion == 5 && versioninfo.dwMinorVersion == 0) {
+ if ( versioninfo.wSuiteMask & VER_SUITE_DATACENTER )
+ osproduct = "Datacenter Server";
+ else if ( versioninfo.wSuiteMask & VER_SUITE_ENTERPRISE )
+ osproduct = "Advanced Server";
+ else
+ osproduct = "Server";
+ }
+ else { /* NT 4.0 */
+ if ( versioninfo.wSuiteMask & VER_SUITE_ENTERPRISE )
+ osproduct = "Server 4.0, Enterprise Edition";
+ else
+ osproduct = "Server 4.0";
+ }
+ } /* \server type */
+ } /* \product */
+
+ if (0==kde_gethostname(tmpnodename, tmpnodenamelen))
+ strncpy(name->nodename, tmpnodename, 19);
+ else
+ name->nodename[0]=0;
+
+ strncpy(name->version, __DATE__, 19); /** @todo ok? */
+
+ if (osproduct)
+ sprintf(name->release, "%d.%d (%s %s)", versioninfo.dwMajorVersion,
+ versioninfo.dwMinorVersion, ostype, osproduct);
+ else if (ostype)
+ sprintf(name->release, "%d.%d (%s)", versioninfo.dwMajorVersion,
+ versioninfo.dwMinorVersion, ostype);
+ else
+ sprintf(name->release, "%d.%d", versioninfo.dwMajorVersion,
+ versioninfo.dwMinorVersion);
+
+ return 0;
+}