aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2012-02-08 16:12:35 +0000
committerRon Yorston <rmy@pobox.com>2012-02-09 11:52:53 +0000
commit6e29c121e0afdcfceb1418c2faa6ed070a358f71 (patch)
treeec27cd8779dfc323d1ae0583b89710af47d83a0f
parente8ee6096339c6226ee776a945a271a023b8fe0f8 (diff)
downloadbusybox-w32-6e29c121e0afdcfceb1418c2faa6ed070a358f71.tar.gz
busybox-w32-6e29c121e0afdcfceb1418c2faa6ed070a358f71.tar.bz2
busybox-w32-6e29c121e0afdcfceb1418c2faa6ed070a358f71.zip
Implementation of uname for WIN32
-rw-r--r--coreutils/uname.c8
-rw-r--r--win32/Kbuild1
-rw-r--r--win32/sys/utsname.h66
-rw-r--r--win32/uname.c50
4 files changed, 125 insertions, 0 deletions
diff --git a/coreutils/uname.c b/coreutils/uname.c
index d1c50e222..c259b1771 100644
--- a/coreutils/uname.c
+++ b/coreutils/uname.c
@@ -56,7 +56,11 @@ typedef struct {
56 struct utsname name; 56 struct utsname name;
57 char processor[sizeof(((struct utsname*)NULL)->machine)]; 57 char processor[sizeof(((struct utsname*)NULL)->machine)];
58 char platform[sizeof(((struct utsname*)NULL)->machine)]; 58 char platform[sizeof(((struct utsname*)NULL)->machine)];
59#if ENABLE_PLATFORM_MINGW32
60 char os[sizeof("MS/Windows")];
61#else
59 char os[sizeof("GNU/Linux")]; 62 char os[sizeof("GNU/Linux")];
63#endif
60} uname_info_t; 64} uname_info_t;
61 65
62static const char options[] ALIGN1 = "snrvmpioa"; 66static const char options[] ALIGN1 = "snrvmpioa";
@@ -123,7 +127,11 @@ int uname_main(int argc UNUSED_PARAM, char **argv)
123#endif 127#endif
124 strcpy(uname_info.processor, unknown_str); 128 strcpy(uname_info.processor, unknown_str);
125 strcpy(uname_info.platform, unknown_str); 129 strcpy(uname_info.platform, unknown_str);
130#if ENABLE_PLATFORM_MINGW32
131 strcpy(uname_info.os, "MS/Windows");
132#else
126 strcpy(uname_info.os, "GNU/Linux"); 133 strcpy(uname_info.os, "GNU/Linux");
134#endif
127#if 0 135#if 0
128 /* Fedora does something like this */ 136 /* Fedora does something like this */
129 strcpy(uname_info.processor, uname_info.name.machine); 137 strcpy(uname_info.processor, uname_info.name.machine);
diff --git a/win32/Kbuild b/win32/Kbuild
index bc005c23a..ef3af7458 100644
--- a/win32/Kbuild
+++ b/win32/Kbuild
@@ -11,4 +11,5 @@ lib-$(CONFIG_PLATFORM_MINGW32) += process.o
11lib-$(CONFIG_PLATFORM_MINGW32) += regex.o 11lib-$(CONFIG_PLATFORM_MINGW32) += regex.o
12lib-$(CONFIG_WIN32_NET) += net.o 12lib-$(CONFIG_WIN32_NET) += net.o
13lib-$(CONFIG_PLATFORM_MINGW32) += termios.o 13lib-$(CONFIG_PLATFORM_MINGW32) += termios.o
14lib-$(CONFIG_PLATFORM_MINGW32) += uname.o
14lib-$(CONFIG_PLATFORM_MINGW32) += winansi.o 15lib-$(CONFIG_PLATFORM_MINGW32) += winansi.o
diff --git a/win32/sys/utsname.h b/win32/sys/utsname.h
new file mode 100644
index 000000000..6f12efd58
--- /dev/null
+++ b/win32/sys/utsname.h
@@ -0,0 +1,66 @@
1/* Copyright (C) 1991,92,94,96,97,99,2002 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
3
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
8
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
15 License along with the GNU C Library; if not, write to the Free
16 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17 02111-1307 USA. */
18
19/*
20 * POSIX Standard: 4.4 System Identification <sys/utsname.h>
21 */
22
23#ifndef _SYS_UTSNAME_H
24#define _SYS_UTSNAME_H 1
25
26#define _UTSNAME_LENGTH 65
27
28#ifndef _UTSNAME_SYSNAME_LENGTH
29# define _UTSNAME_SYSNAME_LENGTH _UTSNAME_LENGTH
30#endif
31#ifndef _UTSNAME_NODENAME_LENGTH
32# define _UTSNAME_NODENAME_LENGTH _UTSNAME_LENGTH
33#endif
34#ifndef _UTSNAME_RELEASE_LENGTH
35# define _UTSNAME_RELEASE_LENGTH _UTSNAME_LENGTH
36#endif
37#ifndef _UTSNAME_VERSION_LENGTH
38# define _UTSNAME_VERSION_LENGTH _UTSNAME_LENGTH
39#endif
40#ifndef _UTSNAME_MACHINE_LENGTH
41# define _UTSNAME_MACHINE_LENGTH _UTSNAME_LENGTH
42#endif
43
44/* Structure describing the system and machine. */
45struct utsname
46 {
47 /* Name of the implementation of the operating system. */
48 char sysname[_UTSNAME_SYSNAME_LENGTH];
49
50 /* Name of this node on the network. */
51 char nodename[_UTSNAME_NODENAME_LENGTH];
52
53 /* Current release level of this implementation. */
54 char release[_UTSNAME_RELEASE_LENGTH];
55 /* Current version level of this release. */
56 char version[_UTSNAME_VERSION_LENGTH];
57
58 /* Name of the hardware type the system is running on. */
59 char machine[_UTSNAME_MACHINE_LENGTH];
60 };
61
62/* Put information about the system in NAME. */
63extern int uname (struct utsname *__name);
64
65
66#endif /* sys/utsname.h */
diff --git a/win32/uname.c b/win32/uname.c
new file mode 100644
index 000000000..1c73d073e
--- /dev/null
+++ b/win32/uname.c
@@ -0,0 +1,50 @@
1#include "libbb.h"
2/* After libbb.h, since it needs sys/types.h on some systems */
3#include <sys/utsname.h>
4
5int uname(struct utsname *name)
6{
7 const char *unk = "unknown";
8 OSVERSIONINFOEX os_info;
9 SYSTEM_INFO sys_info;
10 DWORD len;
11
12 strcpy(name->sysname, "Windows_NT");
13
14 len = sizeof(name->nodename) - 1;
15 if ( !GetComputerName(name->nodename, &len) ) {
16 strcpy(name->nodename, unk);
17 }
18
19 memset(&os_info, 0, sizeof(OSVERSIONINFOEX));
20 os_info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
21
22 strcpy(name->release, unk);
23 strcpy(name->version, unk);
24 if (GetVersionEx(&os_info)) {
25 sprintf(name->release, "%d.%d", os_info.dwMajorVersion,
26 os_info.dwMinorVersion);
27 sprintf(name->version, "%d", os_info.dwBuildNumber);
28 }
29
30 strcpy(name->machine, unk);
31 GetSystemInfo(&sys_info);
32 switch (sys_info.wProcessorArchitecture) {
33 case PROCESSOR_ARCHITECTURE_AMD64:
34 strcpy(name->machine, "x86_64");
35 break;
36 case PROCESSOR_ARCHITECTURE_IA64:
37 strcpy(name->machine, "ia64");
38 break;
39 case PROCESSOR_ARCHITECTURE_INTEL:
40 if (sys_info.wProcessorLevel < 6) {
41 strcpy(name->machine, "i386");
42 }
43 else {
44 strcpy(name->machine, "i686");
45 }
46 break;
47 }
48
49 return 0;
50}