Ne.app NeANT
The Ne.app NeANT User module of the NeANT distribution.
UNAME.cpp
Go to the documentation of this file.
1// determining OS name and version
2
3
25#include <stdio.h>
26
27#ifndef _WIN32
28# include <sys/utsname.h>
29#else
30# include <windows.h>
31#endif
32
33
34static int print_os_version ();
35
36
37int main ()
38{
39 return print_os_version ();
40}
41
43
44static unsigned length (const char *s)
45{
46 unsigned len = 0;
47
48 while (*s++)
49 ++len;
50
51 return len;
52}
53
54
55static int compare (const char *a, const char *b)
56{
57 for (; *a && *a == *b; ++a, ++b);
58 return *a - *b;
59}
60
61
62static char* capitalize (char *str)
63{
64 static const char upper[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
65 static const char lower[] = "abcdefghijklmnopqrstuvwxyz0123456789";
66
67 for (char *s = str; *s; ++s) {
68 for (unsigned i = 0; ; ++i) {
69
70 if (*s == lower [i]) {
71 *s = upper [i];
72 break;
73 }
74
75 if (*s == upper [i])
76 break;
77
78 if ('\0' == lower [i]) {
79 *s = '_';
80 break;
81 }
82 }
83 }
84
85 return str;
86}
87
88
89
90#define ISDIGIT(x) ((x) >= '0' && (x) <= '9')
91
92
93#ifndef _WIN32
94
95
96static void print_linux_release ()
97{
98 static const char* const files[] = {
99 // Debian
100 "/etc/debian_release", // see also /etc/debian_version?
101 // Fedora
102 "/etc/fedora-release",
103 // Gentoo
104 "/etc/gentoo-release",
105 // Novell SUSE
106 "/etc/SuSE-release",
107 // Red Hat
108 "/etc/redhat-release", // see also /etc/redhat_version?
109 // Slackware
110 "/etc/slackware-release", // see also /etc/slackware-version?
111 // Mandrake
112 "/etc/mandrake-release",
113 // Mandriva
114 "/etc/mandriva-release",
115 // MEPIS Linux
116 "/etc/mepis-release",
117 // Sun JDS
118 "/etc/sun-release",
119 // Solaris/SPARC
120 "/etc/release",
121 // Turbo Linux
122 "/etc/turbolinux-release",
123 // UnitedLinux
124 "/etc/UnitedLinux-release",
125 // Ubuntu
126 "/etc/lsb-release",
127 // Yellow Dog
128 "/etc/yellowdog-release",
129
131 // Last entry must be 0
132 0
133 };
134
135 FILE *fp = 0;
136
137 for (unsigned i = 0; files [i]; ++i) {
138 fp = fopen (files [i], "r");
139 if (fp)
140 break;
141 }
142
143
144 char buffer [1024] = "(unknown release)";
145
146 if (fp) {
147 char *s = fgets (buffer, int (sizeof buffer), fp);
148 if (s)
149 buffer [length (s) - 1] = '\0';
150
151 }
152
153 printf ("#define _RWSTD_LINUX_RELEASE \"%s\"\n", buffer);
154}
155
156
157static int print_os_version ()
158{
159 struct utsname uts;
160
161 if (0 > uname (&uts))
162 return 1;
163
164 printf ("#define _RWSTD_OS_%s\n", capitalize (uts.sysname));
165
166 printf ("#define _RWSTD_OS_SYSNAME \"%s\"\n", uts.sysname);
167 printf ("#define _RWSTD_OS_RELEASE \"%s\"\n", uts.release);
168 printf ("#define _RWSTD_OS_VERSION \"%s\"\n", uts.version);
169
170 const char *s;
171 unsigned long num;
172
173#if !defined (SYS_NMLN)
174# define SYS_NMLN 128
175#endif // SYS_NMLN
176
177 char str [SYS_NMLN * 2];
178
179 for (num = 0; (str [num] = uts.release [num]); ++num);
180 str [num] = '.';
181 for (++num, s = uts.version; (str [num] = *s); ++num, ++s);
182
183 for (s = str; *s && !ISDIGIT (*s); ++s);
184 for (num = 0; ISDIGIT (*s); ++s)
185 num = num * 10 + *s - '0';
186
187 const char *major = "MAJOR";
188 const char *minor = "MINOR";
189
190 if (!compare ("AIX", uts.sysname)) {
191 major = "MINOR";
192 minor = "MAJOR";
193 }
194
195 printf ("#define _RWSTD_OS_%s %lu\n", major, num);
196
197 for ( ; *s && !ISDIGIT (*s); ++s);
198 for (num = 0; ISDIGIT (*s); ++s)
199 num = num * 10 + *s - '0';
200
201 printf ("#define _RWSTD_OS_%s %lu\n", minor, num);
202
203 for (; *s && !ISDIGIT (*s); ++s);
204 for (num = 0; ISDIGIT (*s); ++s)
205 num = num * 10 + *s - '0';
206
207 printf ("#define _RWSTD_OS_MICRO %lu\n", num);
208
209 if (0 == compare ("LINUX", uts.sysname)) {
210
211 // determine Linux distribution
212 print_linux_release ();
213 }
214
215 return 0;
216}
217
218
219#else // if defined (_WIN32)
220
221
222static int print_os_version ()
223{
224 OSVERSIONINFO osinfo;
225 osinfo.dwOSVersionInfoSize = sizeof osinfo;
226
227 const BOOL success = GetVersionEx (&osinfo);
228
229 printf ("#define _RWSTD_OS_WINDOWS\n");
230 printf ("#define _RWSTD_OS_SYSNAME \"WINDOWS\"\n");
231
232 if (!success)
233 return 1;
234
235 printf ("#define _RWSTD_OS_MAJOR %lu\n", osinfo.dwMajorVersion);
236 printf ("#define _RWSTD_OS_MINOR %lu\n", osinfo.dwMinorVersion);
237 printf ("#define _RWSTD_OS_MICRO %lu /* build number */\n",
238 osinfo.dwBuildNumber);
239
240 const char *flavor = 0;
241
242 if (4 == osinfo.dwMajorVersion) {
243 switch (osinfo.dwMinorVersion) {
244 case 0:
245 if (VER_PLATFORM_WIN32_NT == osinfo.dwPlatformId)
246 flavor = "NT";
247 else
248 flavor = "95";
249 break;
250
251 case 10: flavor = "98"; break;
252 case 90: flavor = "ME"; break;
253 }
254 }
255 else if (5 == osinfo.dwMajorVersion) {
256 switch (osinfo.dwMinorVersion) {
257 case 0: flavor = "2000"; break;
258 case 1: flavor = "XP"; break;
259 case 2: flavor = "2003"; break;
260 }
261 }
262
263 if (flavor) {
264 printf ("#define _RWSTD_OS_RELEASE \"Windows %s\"\n", flavor);
265 printf ("#define _RWSTD_OS_WINDOWS_%s\n", flavor);
266 }
267 else {
268 printf ("#define _RWSTD_OS_RELEASE \"\"\n");
269 }
270
271 printf ("#define _RWSTD_OS_VERSION \"%s\"\n", osinfo.szCSDVersion);
272
273 return 0;
274}
275
276#endif // _WIN32
const char lower[]
const char upper[]
#define i
Definition 17.names.cpp:126
#define a
Definition 17.names.cpp:109
#define buffer
Definition 17.names.cpp:453
#define b
Definition 17.names.cpp:110
#define s
#define len
Definition 17.names.cpp:488
#define num
Definition 17.names.cpp:505
IMPORT_C SInt32 printf(const Char *,...)
#define SYS_NMLN
#define ISDIGIT(x)
Definition UNAME.cpp:90
int main()
Definition UNAME.cpp:37
#define FILE
const char * str
Definition exec.cpp:170