1/*
2 * $Id: b_uname.c,v 1.9 2008/03/13 20:47:06 mbrey Exp $
3 */
4
5#include "bench.h"
6
7#define	UNAMEFILE	"NODENAME"
8
9static int write_info __P((FILE *));
10
11int
12b_uname()
13{
14	FILE *fp;
15	int ret;
16
17	if ((fp = fopen(UNAMEFILE, "w")) == NULL)
18		goto file_err;
19
20	ret = write_info(fp);
21
22	if (fclose(fp) != 0) {
23file_err:	fprintf(stderr,
24		    "%s: %s: %s\n", progname, UNAMEFILE, strerror(errno));
25		return (1);
26	}
27
28	return (ret);
29}
30
31#ifdef DB_WIN32
32static int
33write_info(fp)
34	FILE *fp;
35{
36	OSVERSIONINFO osver;
37	SYSTEM_INFO sysinfo;
38	char *p;
39
40#ifdef DB_WINCE
41	p = "WinCE";
42#else
43	{
44	DWORD len;
45	char buf[1024];
46
47	len = sizeof(buf) - 1;
48	GetComputerName(buf, &len);
49	p = buf;
50	}
51#endif
52	fprintf(fp, "<p>%s, ", p);
53
54	GetSystemInfo(&sysinfo);
55	switch (sysinfo.wProcessorArchitecture) {
56	case PROCESSOR_ARCHITECTURE_ALPHA:
57		p = "alpha";
58		break;
59	case PROCESSOR_ARCHITECTURE_INTEL:
60		p = "x86";
61		break;
62	case PROCESSOR_ARCHITECTURE_MIPS:
63		p = "mips";
64		break;
65	case PROCESSOR_ARCHITECTURE_PPC:
66		p = "ppc";
67		break;
68	default:
69		p = "unknown";
70		break;
71	}
72	fprintf(fp, "%s<br>\n", p);
73	memset(&osver, 0, sizeof(osver));
74	osver.dwOSVersionInfoSize = sizeof(osver);
75	GetVersionEx(&osver);
76	switch (osver.dwPlatformId) {
77	case VER_PLATFORM_WIN32_NT:	/* NT, Windows 2000 or Windows XP */
78		if (osver.dwMajorVersion == 4)
79			p = "Windows NT4x";
80		else if (osver.dwMajorVersion <= 3)
81			p = "Windows NT3x";
82		else if (osver.dwMajorVersion == 5 && osver.dwMinorVersion < 1)
83			p = "Windows 2000";
84		else if (osver.dwMajorVersion >= 5)
85			p = "Windows XP";
86		else
87			p = "unknown";
88		break;
89	case VER_PLATFORM_WIN32_WINDOWS:	/* Win95, Win98 or WinME */
90		if ((osver.dwMajorVersion > 4) ||
91		  ((osver.dwMajorVersion == 4) && (osver.dwMinorVersion > 0))) {
92			if (osver.dwMinorVersion >= 90)
93				p = "Windows ME";
94			else
95				p = "Windows 98";
96		} else
97			p = "Windows 95";
98		break;
99	case VER_PLATFORM_WIN32s:		/* Windows 3.x */
100		p = "Windows";
101		break;
102	default:
103		p = "unknown";
104		break;
105	}
106	fprintf(fp,
107	    "%s, %ld.%02ld", p, osver.dwMajorVersion, osver.dwMinorVersion);
108	return (0);
109}
110
111#elif defined(HAVE_VXWORKS)
112static int
113write_info(fp)
114	FILE *fp;
115{
116	fprintf(fp, "<p>VxWorks");
117	return (0);
118}
119
120#else /* POSIX */
121#include <sys/utsname.h>
122
123static int
124write_info(fp)
125	FILE *fp;
126{
127	struct utsname name;
128
129	if (uname(&name) == 0)
130		fprintf(fp, "<p>%s, %s<br>\n%s, %s, %s</p>\n", name.nodename,
131		    name.machine, name.sysname, name.release, name.version);
132	else {
133		/*
134		 * We've seen random failures on some systems, complain and
135		 * skip the call if it fails.
136		 */
137		fprintf(stderr, "%s: uname: %s\n", progname, strerror(errno));
138
139		fprintf(fp, "<p>POSIX");
140	}
141	return (0);
142}
143#endif
144