Mercurial > hg > rc1
comparison vendor/pear/pear-core-minimal/src/OS/Guess.php @ 0:1e000243b222
vanilla 1.3.3 distro, I hope
author | Charlie Root |
---|---|
date | Thu, 04 Jan 2018 15:50:29 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:1e000243b222 |
---|---|
1 <?php | |
2 /** | |
3 * The OS_Guess class | |
4 * | |
5 * PHP versions 4 and 5 | |
6 * | |
7 * @category pear | |
8 * @package PEAR | |
9 * @author Stig Bakken <ssb@php.net> | |
10 * @author Gregory Beaver <cellog@php.net> | |
11 * @copyright 1997-2009 The Authors | |
12 * @license http://opensource.org/licenses/bsd-license.php New BSD License | |
13 * @link http://pear.php.net/package/PEAR | |
14 * @since File available since PEAR 0.1 | |
15 */ | |
16 | |
17 // {{{ uname examples | |
18 | |
19 // php_uname() without args returns the same as 'uname -a', or a PHP-custom | |
20 // string for Windows. | |
21 // PHP versions prior to 4.3 return the uname of the host where PHP was built, | |
22 // as of 4.3 it returns the uname of the host running the PHP code. | |
23 // | |
24 // PC RedHat Linux 7.1: | |
25 // Linux host.example.com 2.4.2-2 #1 Sun Apr 8 20:41:30 EDT 2001 i686 unknown | |
26 // | |
27 // PC Debian Potato: | |
28 // Linux host 2.4.17 #2 SMP Tue Feb 12 15:10:04 CET 2002 i686 unknown | |
29 // | |
30 // PC FreeBSD 3.3: | |
31 // FreeBSD host.example.com 3.3-STABLE FreeBSD 3.3-STABLE #0: Mon Feb 21 00:42:31 CET 2000 root@example.com:/usr/src/sys/compile/CONFIG i386 | |
32 // | |
33 // PC FreeBSD 4.3: | |
34 // FreeBSD host.example.com 4.3-RELEASE FreeBSD 4.3-RELEASE #1: Mon Jun 25 11:19:43 EDT 2001 root@example.com:/usr/src/sys/compile/CONFIG i386 | |
35 // | |
36 // PC FreeBSD 4.5: | |
37 // FreeBSD host.example.com 4.5-STABLE FreeBSD 4.5-STABLE #0: Wed Feb 6 23:59:23 CET 2002 root@example.com:/usr/src/sys/compile/CONFIG i386 | |
38 // | |
39 // PC FreeBSD 4.5 w/uname from GNU shellutils: | |
40 // FreeBSD host.example.com 4.5-STABLE FreeBSD 4.5-STABLE #0: Wed Feb i386 unknown | |
41 // | |
42 // HP 9000/712 HP-UX 10: | |
43 // HP-UX iq B.10.10 A 9000/712 2008429113 two-user license | |
44 // | |
45 // HP 9000/712 HP-UX 10 w/uname from GNU shellutils: | |
46 // HP-UX host B.10.10 A 9000/712 unknown | |
47 // | |
48 // IBM RS6000/550 AIX 4.3: | |
49 // AIX host 3 4 000003531C00 | |
50 // | |
51 // AIX 4.3 w/uname from GNU shellutils: | |
52 // AIX host 3 4 000003531C00 unknown | |
53 // | |
54 // SGI Onyx IRIX 6.5 w/uname from GNU shellutils: | |
55 // IRIX64 host 6.5 01091820 IP19 mips | |
56 // | |
57 // SGI Onyx IRIX 6.5: | |
58 // IRIX64 host 6.5 01091820 IP19 | |
59 // | |
60 // SparcStation 20 Solaris 8 w/uname from GNU shellutils: | |
61 // SunOS host.example.com 5.8 Generic_108528-12 sun4m sparc | |
62 // | |
63 // SparcStation 20 Solaris 8: | |
64 // SunOS host.example.com 5.8 Generic_108528-12 sun4m sparc SUNW,SPARCstation-20 | |
65 // | |
66 // Mac OS X (Darwin) | |
67 // Darwin home-eden.local 7.5.0 Darwin Kernel Version 7.5.0: Thu Aug 5 19:26:16 PDT 2004; root:xnu/xnu-517.7.21.obj~3/RELEASE_PPC Power Macintosh | |
68 // | |
69 // Mac OS X early versions | |
70 // | |
71 | |
72 // }}} | |
73 | |
74 /* TODO: | |
75 * - define endianness, to allow matchSignature("bigend") etc. | |
76 */ | |
77 | |
78 /** | |
79 * Retrieves information about the current operating system | |
80 * | |
81 * This class uses php_uname() to grok information about the current OS | |
82 * | |
83 * @category pear | |
84 * @package PEAR | |
85 * @author Stig Bakken <ssb@php.net> | |
86 * @author Gregory Beaver <cellog@php.net> | |
87 * @copyright 1997-2009 The Authors | |
88 * @license http://opensource.org/licenses/bsd-license.php New BSD License | |
89 * @version Release: @package_version@ | |
90 * @link http://pear.php.net/package/PEAR | |
91 * @since Class available since Release 0.1 | |
92 */ | |
93 class OS_Guess | |
94 { | |
95 var $sysname; | |
96 var $nodename; | |
97 var $cpu; | |
98 var $release; | |
99 var $extra; | |
100 | |
101 function __construct($uname = null) | |
102 { | |
103 list($this->sysname, | |
104 $this->release, | |
105 $this->cpu, | |
106 $this->extra, | |
107 $this->nodename) = $this->parseSignature($uname); | |
108 } | |
109 | |
110 function parseSignature($uname = null) | |
111 { | |
112 static $sysmap = array( | |
113 'HP-UX' => 'hpux', | |
114 'IRIX64' => 'irix', | |
115 ); | |
116 static $cpumap = array( | |
117 'i586' => 'i386', | |
118 'i686' => 'i386', | |
119 'ppc' => 'powerpc', | |
120 ); | |
121 if ($uname === null) { | |
122 $uname = php_uname(); | |
123 } | |
124 $parts = preg_split('/\s+/', trim($uname)); | |
125 $n = count($parts); | |
126 | |
127 $release = $machine = $cpu = ''; | |
128 $sysname = $parts[0]; | |
129 $nodename = $parts[1]; | |
130 $cpu = $parts[$n-1]; | |
131 $extra = ''; | |
132 if ($cpu == 'unknown') { | |
133 $cpu = $parts[$n - 2]; | |
134 } | |
135 | |
136 switch ($sysname) { | |
137 case 'AIX' : | |
138 $release = "$parts[3].$parts[2]"; | |
139 break; | |
140 case 'Windows' : | |
141 switch ($parts[1]) { | |
142 case '95/98': | |
143 $release = '9x'; | |
144 break; | |
145 default: | |
146 $release = $parts[1]; | |
147 break; | |
148 } | |
149 $cpu = 'i386'; | |
150 break; | |
151 case 'Linux' : | |
152 $extra = $this->_detectGlibcVersion(); | |
153 // use only the first two digits from the kernel version | |
154 $release = preg_replace('/^([0-9]+\.[0-9]+).*/', '\1', $parts[2]); | |
155 break; | |
156 case 'Mac' : | |
157 $sysname = 'darwin'; | |
158 $nodename = $parts[2]; | |
159 $release = $parts[3]; | |
160 if ($cpu == 'Macintosh') { | |
161 if ($parts[$n - 2] == 'Power') { | |
162 $cpu = 'powerpc'; | |
163 } | |
164 } | |
165 break; | |
166 case 'Darwin' : | |
167 if ($cpu == 'Macintosh') { | |
168 if ($parts[$n - 2] == 'Power') { | |
169 $cpu = 'powerpc'; | |
170 } | |
171 } | |
172 $release = preg_replace('/^([0-9]+\.[0-9]+).*/', '\1', $parts[2]); | |
173 break; | |
174 default: | |
175 $release = preg_replace('/-.*/', '', $parts[2]); | |
176 break; | |
177 } | |
178 | |
179 if (isset($sysmap[$sysname])) { | |
180 $sysname = $sysmap[$sysname]; | |
181 } else { | |
182 $sysname = strtolower($sysname); | |
183 } | |
184 if (isset($cpumap[$cpu])) { | |
185 $cpu = $cpumap[$cpu]; | |
186 } | |
187 return array($sysname, $release, $cpu, $extra, $nodename); | |
188 } | |
189 | |
190 function _detectGlibcVersion() | |
191 { | |
192 static $glibc = false; | |
193 if ($glibc !== false) { | |
194 return $glibc; // no need to run this multiple times | |
195 } | |
196 $major = $minor = 0; | |
197 include_once "System.php"; | |
198 // Use glibc's <features.h> header file to | |
199 // get major and minor version number: | |
200 if (@file_exists('/usr/include/features.h') && | |
201 @is_readable('/usr/include/features.h')) { | |
202 if (!@file_exists('/usr/bin/cpp') || !@is_executable('/usr/bin/cpp')) { | |
203 $features_file = fopen('/usr/include/features.h', 'rb'); | |
204 while (!feof($features_file)) { | |
205 $line = fgets($features_file, 8192); | |
206 if (!$line || (strpos($line, '#define') === false)) { | |
207 continue; | |
208 } | |
209 if (strpos($line, '__GLIBC__')) { | |
210 // major version number #define __GLIBC__ version | |
211 $line = preg_split('/\s+/', $line); | |
212 $glibc_major = trim($line[2]); | |
213 if (isset($glibc_minor)) { | |
214 break; | |
215 } | |
216 continue; | |
217 } | |
218 | |
219 if (strpos($line, '__GLIBC_MINOR__')) { | |
220 // got the minor version number | |
221 // #define __GLIBC_MINOR__ version | |
222 $line = preg_split('/\s+/', $line); | |
223 $glibc_minor = trim($line[2]); | |
224 if (isset($glibc_major)) { | |
225 break; | |
226 } | |
227 continue; | |
228 } | |
229 } | |
230 fclose($features_file); | |
231 if (!isset($glibc_major) || !isset($glibc_minor)) { | |
232 return $glibc = ''; | |
233 } | |
234 return $glibc = 'glibc' . trim($glibc_major) . "." . trim($glibc_minor) ; | |
235 } // no cpp | |
236 | |
237 $tmpfile = System::mktemp("glibctest"); | |
238 $fp = fopen($tmpfile, "w"); | |
239 fwrite($fp, "#include <features.h>\n__GLIBC__ __GLIBC_MINOR__\n"); | |
240 fclose($fp); | |
241 $cpp = popen("/usr/bin/cpp $tmpfile", "r"); | |
242 while ($line = fgets($cpp, 1024)) { | |
243 if ($line{0} == '#' || trim($line) == '') { | |
244 continue; | |
245 } | |
246 | |
247 if (list($major, $minor) = explode(' ', trim($line))) { | |
248 break; | |
249 } | |
250 } | |
251 pclose($cpp); | |
252 unlink($tmpfile); | |
253 } // features.h | |
254 | |
255 if (!($major && $minor) && @is_link('/lib/libc.so.6')) { | |
256 // Let's try reading the libc.so.6 symlink | |
257 if (preg_match('/^libc-(.*)\.so$/', basename(readlink('/lib/libc.so.6')), $matches)) { | |
258 list($major, $minor) = explode('.', $matches[1]); | |
259 } | |
260 } | |
261 | |
262 if (!($major && $minor)) { | |
263 return $glibc = ''; | |
264 } | |
265 | |
266 return $glibc = "glibc{$major}.{$minor}"; | |
267 } | |
268 | |
269 function getSignature() | |
270 { | |
271 if (empty($this->extra)) { | |
272 return "{$this->sysname}-{$this->release}-{$this->cpu}"; | |
273 } | |
274 return "{$this->sysname}-{$this->release}-{$this->cpu}-{$this->extra}"; | |
275 } | |
276 | |
277 function getSysname() | |
278 { | |
279 return $this->sysname; | |
280 } | |
281 | |
282 function getNodename() | |
283 { | |
284 return $this->nodename; | |
285 } | |
286 | |
287 function getCpu() | |
288 { | |
289 return $this->cpu; | |
290 } | |
291 | |
292 function getRelease() | |
293 { | |
294 return $this->release; | |
295 } | |
296 | |
297 function getExtra() | |
298 { | |
299 return $this->extra; | |
300 } | |
301 | |
302 function matchSignature($match) | |
303 { | |
304 $fragments = is_array($match) ? $match : explode('-', $match); | |
305 $n = count($fragments); | |
306 $matches = 0; | |
307 if ($n > 0) { | |
308 $matches += $this->_matchFragment($fragments[0], $this->sysname); | |
309 } | |
310 if ($n > 1) { | |
311 $matches += $this->_matchFragment($fragments[1], $this->release); | |
312 } | |
313 if ($n > 2) { | |
314 $matches += $this->_matchFragment($fragments[2], $this->cpu); | |
315 } | |
316 if ($n > 3) { | |
317 $matches += $this->_matchFragment($fragments[3], $this->extra); | |
318 } | |
319 return ($matches == $n); | |
320 } | |
321 | |
322 function _matchFragment($fragment, $value) | |
323 { | |
324 if (strcspn($fragment, '*?') < strlen($fragment)) { | |
325 $reg = '/^' . str_replace(array('*', '?', '/'), array('.*', '.', '\\/'), $fragment) . '\\z/'; | |
326 return preg_match($reg, $value); | |
327 } | |
328 return ($fragment == '*' || !strcasecmp($fragment, $value)); | |
329 } | |
330 | |
331 } | |
332 /* | |
333 * Local Variables: | |
334 * indent-tabs-mode: nil | |
335 * c-basic-offset: 4 | |
336 * End: | |
337 */ |