xref: /PHP-7.0/ext/standard/info.c (revision f81b7df6)
1 /*
2    +----------------------------------------------------------------------+
3    | PHP Version 7                                                        |
4    +----------------------------------------------------------------------+
5    | Copyright (c) 1997-2017 The PHP Group                                |
6    +----------------------------------------------------------------------+
7    | This source file is subject to version 3.01 of the PHP license,      |
8    | that is bundled with this package in the file LICENSE, and is        |
9    | available through the world-wide-web at the following url:           |
10    | http://www.php.net/license/3_01.txt                                  |
11    | If you did not receive a copy of the PHP license and are unable to   |
12    | obtain it through the world-wide-web, please send a note to          |
13    | license@php.net so we can mail you a copy immediately.               |
14    +----------------------------------------------------------------------+
15    | Authors: Rasmus Lerdorf <rasmus@php.net>                             |
16    |          Zeev Suraski <zeev@zend.com>                                |
17    |          Colin Viebrock <colin@viebrock.ca>                          |
18    +----------------------------------------------------------------------+
19 */
20 
21 /* $Id$ */
22 
23 #include "php.h"
24 #include "php_ini.h"
25 #include "php_globals.h"
26 #include "ext/standard/head.h"
27 #include "ext/standard/html.h"
28 #include "info.h"
29 #include "credits.h"
30 #include "css.h"
31 #include "SAPI.h"
32 #include <time.h>
33 #include "php_main.h"
34 #include "zend_globals.h"		/* needs ELS */
35 #include "zend_extensions.h"
36 #include "zend_highlight.h"
37 #ifdef HAVE_SYS_UTSNAME_H
38 #include <sys/utsname.h>
39 #endif
40 #include "url.h"
41 #include "php_string.h"
42 
43 #ifdef PHP_WIN32
44 typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
45 typedef BOOL (WINAPI *PGPI)(DWORD, DWORD, DWORD, DWORD, PDWORD);
46 # include "winver.h"
47 
48 #endif
49 
50 #define SECTION(name)	if (!sapi_module.phpinfo_as_text) { \
51 							php_info_print("<h2>" name "</h2>\n"); \
52 						} else { \
53 							php_info_print_table_start(); \
54 							php_info_print_table_header(1, name); \
55 							php_info_print_table_end(); \
56 						} \
57 
58 PHPAPI extern char *php_ini_opened_path;
59 PHPAPI extern char *php_ini_scanned_path;
60 PHPAPI extern char *php_ini_scanned_files;
61 
php_info_print_html_esc(const char * str,size_t len)62 static int php_info_print_html_esc(const char *str, size_t len) /* {{{ */
63 {
64 	size_t written;
65 	zend_string *new_str;
66 
67 	new_str = php_escape_html_entities((unsigned char *) str, len, 0, ENT_QUOTES, "utf-8");
68 	written = php_output_write(ZSTR_VAL(new_str), ZSTR_LEN(new_str));
69 	zend_string_free(new_str);
70 	return written;
71 }
72 /* }}} */
73 
php_info_printf(const char * fmt,...)74 static int php_info_printf(const char *fmt, ...) /* {{{ */
75 {
76 	char *buf;
77 	size_t len, written;
78 	va_list argv;
79 
80 	va_start(argv, fmt);
81 	len = vspprintf(&buf, 0, fmt, argv);
82 	va_end(argv);
83 
84 	written = php_output_write(buf, len);
85 	efree(buf);
86 	return written;
87 }
88 /* }}} */
89 
php_info_print(const char * str)90 static int php_info_print(const char *str) /* {{{ */
91 {
92 	return php_output_write(str, strlen(str));
93 }
94 /* }}} */
95 
php_info_print_stream_hash(const char * name,HashTable * ht)96 static void php_info_print_stream_hash(const char *name, HashTable *ht) /* {{{ */
97 {
98 	zend_string *key;
99 
100 	if (ht) {
101 		if (zend_hash_num_elements(ht)) {
102 			int first = 1;
103 
104 			if (!sapi_module.phpinfo_as_text) {
105 				php_info_printf("<tr><td class=\"e\">Registered %s</td><td class=\"v\">", name);
106 			} else {
107 				php_info_printf("\nRegistered %s => ", name);
108 			}
109 
110 			ZEND_HASH_FOREACH_STR_KEY(ht, key) {
111 				if (key) {
112 					if (first) {
113 						first = 0;
114 					} else {
115 						php_info_print(", ");
116 					}
117 					if (!sapi_module.phpinfo_as_text) {
118 						php_info_print_html_esc(ZSTR_VAL(key), ZSTR_LEN(key));
119 					} else {
120 						php_info_print(ZSTR_VAL(key));
121 					}
122 				}
123 			} ZEND_HASH_FOREACH_END();
124 
125 			if (!sapi_module.phpinfo_as_text) {
126 				php_info_print("</td></tr>\n");
127 			}
128 		} else {
129 			char reg_name[128];
130 			snprintf(reg_name, sizeof(reg_name), "Registered %s", name);
131 			php_info_print_table_row(2, reg_name, "none registered");
132 		}
133 	} else {
134 		php_info_print_table_row(2, name, "disabled");
135 	}
136 }
137 /* }}} */
138 
php_info_print_module(zend_module_entry * zend_module)139 PHPAPI void php_info_print_module(zend_module_entry *zend_module) /* {{{ */
140 {
141 	if (zend_module->info_func || zend_module->version) {
142 		if (!sapi_module.phpinfo_as_text) {
143 			zend_string *url_name = php_url_encode(zend_module->name, strlen(zend_module->name));
144 
145 			php_strtolower(ZSTR_VAL(url_name), ZSTR_LEN(url_name));
146 			php_info_printf("<h2><a name=\"module_%s\">%s</a></h2>\n", ZSTR_VAL(url_name), zend_module->name);
147 
148 			efree(url_name);
149 		} else {
150 			php_info_print_table_start();
151 			php_info_print_table_header(1, zend_module->name);
152 			php_info_print_table_end();
153 		}
154 		if (zend_module->info_func) {
155 			zend_module->info_func(zend_module);
156 		} else {
157 			php_info_print_table_start();
158 			php_info_print_table_row(2, "Version", zend_module->version);
159 			php_info_print_table_end();
160 			DISPLAY_INI_ENTRIES();
161 		}
162 	} else {
163 		if (!sapi_module.phpinfo_as_text) {
164 			php_info_printf("<tr><td class=\"v\">%s</td></tr>\n", zend_module->name);
165 		} else {
166 			php_info_printf("%s\n", zend_module->name);
167 		}
168 	}
169 }
170 /* }}} */
171 
_display_module_info_func(zval * el)172 static int _display_module_info_func(zval *el) /* {{{ */
173 {
174 	zend_module_entry *module = (zend_module_entry*)Z_PTR_P(el);
175 	if (module->info_func || module->version) {
176 		php_info_print_module(module);
177 	}
178 	return ZEND_HASH_APPLY_KEEP;
179 }
180 /* }}} */
181 
_display_module_info_def(zval * el)182 static int _display_module_info_def(zval *el) /* {{{ */
183 {
184 	zend_module_entry *module = (zend_module_entry*)Z_PTR_P(el);
185 	if (!module->info_func && !module->version) {
186 		php_info_print_module(module);
187 	}
188 	return ZEND_HASH_APPLY_KEEP;
189 }
190 /* }}} */
191 
192 /* {{{ php_print_gpcse_array
193  */
php_print_gpcse_array(char * name,uint name_length)194 static void php_print_gpcse_array(char *name, uint name_length)
195 {
196 	zval *data, *tmp, tmp2;
197 	zend_string *string_key;
198 	zend_ulong num_key;
199 	zend_string *key;
200 
201 	key = zend_string_init(name, name_length, 0);
202 	zend_is_auto_global(key);
203 
204 	if ((data = zend_hash_find(&EG(symbol_table), key)) != NULL && (Z_TYPE_P(data) == IS_ARRAY)) {
205 		ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(data), num_key, string_key, tmp) {
206 			if (!sapi_module.phpinfo_as_text) {
207 				php_info_print("<tr>");
208 				php_info_print("<td class=\"e\">");
209 			}
210 
211 			php_info_print("$");
212 			php_info_print(name);
213 			php_info_print("['");
214 
215 			if (string_key != NULL) {
216 				if (!sapi_module.phpinfo_as_text) {
217 					php_info_print_html_esc(ZSTR_VAL(string_key), ZSTR_LEN(string_key));
218 				} else {
219 					php_info_print(ZSTR_VAL(string_key));
220 				}
221 			} else {
222 				php_info_printf(ZEND_ULONG_FMT, num_key);
223 			}
224 			php_info_print("']");
225 			if (!sapi_module.phpinfo_as_text) {
226 				php_info_print("</td><td class=\"v\">");
227 			} else {
228 				php_info_print(" => ");
229 			}
230 			if (Z_TYPE_P(tmp) == IS_ARRAY) {
231 				if (!sapi_module.phpinfo_as_text) {
232 					php_info_print("<pre>");
233 					zend_print_zval_r_ex((zend_write_func_t) php_info_print_html_esc, tmp, 0);
234 					php_info_print("</pre>");
235 				} else {
236 					zend_print_zval_r(tmp, 0);
237 				}
238 			} else {
239 				ZVAL_COPY_VALUE(&tmp2, tmp);
240 				if (Z_TYPE(tmp2) != IS_STRING) {
241 					tmp = NULL;
242 					zval_copy_ctor(&tmp2);
243 					convert_to_string(&tmp2);
244 				}
245 
246 				if (!sapi_module.phpinfo_as_text) {
247 					if (Z_STRLEN(tmp2) == 0) {
248 						php_info_print("<i>no value</i>");
249 					} else {
250 						php_info_print_html_esc(Z_STRVAL(tmp2), Z_STRLEN(tmp2));
251 					}
252 				} else {
253 					php_info_print(Z_STRVAL(tmp2));
254 				}
255 
256 				if (!tmp) {
257 					zval_dtor(&tmp2);
258 				}
259 			}
260 			if (!sapi_module.phpinfo_as_text) {
261 				php_info_print("</td></tr>\n");
262 			} else {
263 				php_info_print("\n");
264 			}
265 		} ZEND_HASH_FOREACH_END();
266 	}
267 	zend_string_free(key);
268 }
269 /* }}} */
270 
271 /* {{{ php_info_print_style
272  */
php_info_print_style(void)273 void php_info_print_style(void)
274 {
275 	php_info_printf("<style type=\"text/css\">\n");
276 	php_info_print_css();
277 	php_info_printf("</style>\n");
278 }
279 /* }}} */
280 
281 /* {{{ php_info_html_esc
282  */
php_info_html_esc(char * string)283 PHPAPI zend_string *php_info_html_esc(char *string)
284 {
285 	return php_escape_html_entities((unsigned char *) string, strlen(string), 0, ENT_QUOTES, NULL);
286 }
287 /* }}} */
288 
289 #ifdef PHP_WIN32
290 /* {{{  */
291 
php_get_windows_name()292 char* php_get_windows_name()
293 {
294 	OSVERSIONINFOEX osvi = EG(windows_version_info);
295 	SYSTEM_INFO si;
296 	PGNSI pGNSI;
297 	PGPI pGPI;
298 	DWORD dwType;
299 	char *major = NULL, *sub = NULL, *retval;
300 
301 	ZeroMemory(&si, sizeof(SYSTEM_INFO));
302 
303 	pGNSI = (PGNSI) GetProcAddress(GetModuleHandle("kernel32.dll"), "GetNativeSystemInfo");
304 	if(NULL != pGNSI) {
305 		pGNSI(&si);
306 	} else {
307 		GetSystemInfo(&si);
308 	}
309 
310 	if (VER_PLATFORM_WIN32_NT==osvi.dwPlatformId && osvi.dwMajorVersion >= 10) {
311 		if (osvi.dwMajorVersion == 10) {
312 			if( osvi.dwMinorVersion == 0 ) {
313 				if( osvi.wProductType == VER_NT_WORKSTATION ) {
314 					major = "Windows 10";
315 				} else {
316 					major = "Windows Server 2016";
317 				}
318 			}
319 		}
320 	} else if (VER_PLATFORM_WIN32_NT==osvi.dwPlatformId && osvi.dwMajorVersion >= 6) {
321 		if (osvi.dwMajorVersion == 6) {
322 			if( osvi.dwMinorVersion == 0 ) {
323 				if( osvi.wProductType == VER_NT_WORKSTATION ) {
324 					major = "Windows Vista";
325 				} else {
326 					major = "Windows Server 2008";
327 				}
328 			} else if ( osvi.dwMinorVersion == 1 ) {
329 				if( osvi.wProductType == VER_NT_WORKSTATION )  {
330 					major = "Windows 7";
331 				} else {
332 					major = "Windows Server 2008 R2";
333 				}
334 			} else if ( osvi.dwMinorVersion == 2 ) {
335 				/* could be Windows 8/Windows Server 2012, could be Windows 8.1/Windows Server 2012 R2 */
336 				/* XXX and one more X - the above comment is true if no manifest is used for two cases:
337 					- if the PHP build doesn't use the correct manifest
338 					- if PHP DLL loaded under some binary that doesn't use the correct manifest
339 
340 					So keep the handling here as is for now, even if we know 6.2 is win8 and nothing else, and think about an improvement. */
341 				OSVERSIONINFOEX osvi81;
342 				DWORDLONG dwlConditionMask = 0;
343 				int op = VER_GREATER_EQUAL;
344 
345 				ZeroMemory(&osvi81, sizeof(OSVERSIONINFOEX));
346 				osvi81.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
347 				osvi81.dwMajorVersion = 6;
348 				osvi81.dwMinorVersion = 3;
349 				osvi81.wServicePackMajor = 0;
350 
351 				VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, op);
352 				VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, op);
353 				VER_SET_CONDITION(dwlConditionMask, VER_SERVICEPACKMAJOR, op);
354 
355 				if (VerifyVersionInfo(&osvi81,
356 					VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR,
357 					dwlConditionMask)) {
358 					osvi.dwMinorVersion = 3; /* Windows 8.1/Windows Server 2012 R2 */
359 					if( osvi.wProductType == VER_NT_WORKSTATION )  {
360 						major = "Windows 8.1";
361 					} else {
362 						major = "Windows Server 2012 R2";
363 					}
364 				} else {
365 					if( osvi.wProductType == VER_NT_WORKSTATION )  {
366 						major = "Windows 8";
367 					} else {
368 						major = "Windows Server 2012";
369 					}
370 				}
371 			} else if (osvi.dwMinorVersion == 3) {
372 				if( osvi.wProductType == VER_NT_WORKSTATION )  {
373 					major = "Windows 8.1";
374 				} else {
375 					major = "Windows Server 2012 R2";
376 				}
377 			} else {
378 				major = "Unknown Windows version";
379 			}
380 
381 			pGPI = (PGPI) GetProcAddress(GetModuleHandle("kernel32.dll"), "GetProductInfo");
382 			pGPI(6, 0, 0, 0, &dwType);
383 
384 			switch (dwType) {
385 				case PRODUCT_ULTIMATE:
386 					sub = "Ultimate Edition";
387 					break;
388 				case PRODUCT_HOME_BASIC:
389 					sub = "Home Basic Edition";
390 					break;
391 				case PRODUCT_HOME_PREMIUM:
392 					sub = "Home Premium Edition";
393 					break;
394 				case PRODUCT_ENTERPRISE:
395 					sub = "Enterprise Edition";
396 					break;
397 				case PRODUCT_HOME_BASIC_N:
398 					sub = "Home Basic N Edition";
399 					break;
400 				case PRODUCT_BUSINESS:
401 					if ((osvi.dwMajorVersion > 6) || (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion > 0)) {
402 						sub = "Professional Edition";
403 					} else {
404 						sub = "Business Edition";
405 					}
406 					break;
407 				case PRODUCT_STANDARD_SERVER:
408 					sub = "Standard Edition";
409 					break;
410 				case PRODUCT_DATACENTER_SERVER:
411 					sub = "Datacenter Edition";
412 					break;
413 				case PRODUCT_SMALLBUSINESS_SERVER:
414 					sub = "Small Business Server";
415 					break;
416 				case PRODUCT_ENTERPRISE_SERVER:
417 					sub = "Enterprise Edition";
418 					break;
419 				case PRODUCT_STARTER:
420 					if ((osvi.dwMajorVersion > 6) || (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion > 0)) {
421 						sub = "Starter N Edition";
422 					} else {
423 					    sub = "Starter Edition";
424 					}
425 					break;
426 				case PRODUCT_DATACENTER_SERVER_CORE:
427 					sub = "Datacenter Edition (core installation)";
428 					break;
429 				case PRODUCT_STANDARD_SERVER_CORE:
430 					sub = "Standard Edition (core installation)";
431 					break;
432 				case PRODUCT_ENTERPRISE_SERVER_CORE:
433 					sub = "Enterprise Edition (core installation)";
434 					break;
435 				case PRODUCT_ENTERPRISE_SERVER_IA64:
436 					sub = "Enterprise Edition for Itanium-based Systems";
437 					break;
438 				case PRODUCT_BUSINESS_N:
439 					if ((osvi.dwMajorVersion > 6) || (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion > 0)) {
440 						sub = "Professional N Edition";
441 					} else {
442 						sub = "Business N Edition";
443 					}
444 					break;
445 				case PRODUCT_WEB_SERVER:
446 					sub = "Web Server Edition";
447 					break;
448 				case PRODUCT_CLUSTER_SERVER:
449 					sub = "HPC Edition";
450 					break;
451 				case PRODUCT_HOME_SERVER:
452 					sub = "Storage Server Essentials Edition";
453 					break;
454 				case PRODUCT_STORAGE_EXPRESS_SERVER:
455 					sub = "Storage Server Express Edition";
456 					break;
457 				case PRODUCT_STORAGE_STANDARD_SERVER:
458 					sub = "Storage Server Standard Edition";
459 					break;
460 				case PRODUCT_STORAGE_WORKGROUP_SERVER:
461 					sub = "Storage Server Workgroup Edition";
462 					break;
463 				case PRODUCT_STORAGE_ENTERPRISE_SERVER:
464 					sub = "Storage Server Enterprise Edition";
465 					break;
466 				case PRODUCT_SERVER_FOR_SMALLBUSINESS:
467 					sub = "Essential Server Solutions Edition";
468 					break;
469 				case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM:
470 					sub = "Small Business Server Premium Edition";
471 					break;
472 				case PRODUCT_HOME_PREMIUM_N:
473 					sub = "Home Premium N Edition";
474 					break;
475 				case PRODUCT_ENTERPRISE_N:
476 					sub = "Enterprise N Edition";
477 					break;
478 				case PRODUCT_ULTIMATE_N:
479 					sub = "Ultimate N Edition";
480 					break;
481 				case PRODUCT_WEB_SERVER_CORE:
482 					sub = "Web Server Edition (core installation)";
483 					break;
484 				case PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT:
485 					sub = "Essential Business Server Management Server Edition";
486 					break;
487 				case PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY:
488 					sub = "Essential Business Server Management Security Edition";
489 					break;
490 				case PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING:
491 					sub = "Essential Business Server Management Messaging Edition";
492 					break;
493 				case PRODUCT_SERVER_FOUNDATION:
494 					sub = "Foundation Edition";
495 					break;
496 				case PRODUCT_HOME_PREMIUM_SERVER:
497 					sub = "Home Server 2011 Edition";
498 					break;
499 				case PRODUCT_SERVER_FOR_SMALLBUSINESS_V:
500 					sub = "Essential Server Solutions Edition (without Hyper-V)";
501 					break;
502 				case PRODUCT_STANDARD_SERVER_V:
503 					sub = "Standard Edition (without Hyper-V)";
504 					break;
505 				case PRODUCT_DATACENTER_SERVER_V:
506 					sub = "Datacenter Edition (without Hyper-V)";
507 					break;
508 				case PRODUCT_ENTERPRISE_SERVER_V:
509 					sub = "Enterprise Edition (without Hyper-V)";
510 					break;
511 				case PRODUCT_DATACENTER_SERVER_CORE_V:
512 					sub = "Datacenter Edition (core installation, without Hyper-V)";
513 					break;
514 				case PRODUCT_STANDARD_SERVER_CORE_V:
515 					sub = "Standard Edition (core installation, without Hyper-V)";
516 					break;
517 				case PRODUCT_ENTERPRISE_SERVER_CORE_V:
518 					sub = "Enterprise Edition (core installation, without Hyper-V)";
519 					break;
520 				case PRODUCT_HYPERV:
521 					sub = "Hyper-V Server";
522 					break;
523 				case PRODUCT_STORAGE_EXPRESS_SERVER_CORE:
524 					sub = "Storage Server Express Edition (core installation)";
525 					break;
526 				case PRODUCT_STORAGE_STANDARD_SERVER_CORE:
527 					sub = "Storage Server Standard Edition (core installation)";
528 					break;
529 				case PRODUCT_STORAGE_WORKGROUP_SERVER_CORE:
530 					sub = "Storage Server Workgroup Edition (core installation)";
531 					break;
532 				case PRODUCT_STORAGE_ENTERPRISE_SERVER_CORE:
533 					sub = "Storage Server Enterprise Edition (core installation)";
534 					break;
535 				case PRODUCT_STARTER_N:
536 					sub = "Starter N Edition";
537 					break;
538 				case PRODUCT_PROFESSIONAL:
539 					sub = "Professional Edition";
540 					break;
541 				case PRODUCT_PROFESSIONAL_N:
542 					sub = "Professional N Edition";
543 					break;
544 				case PRODUCT_SB_SOLUTION_SERVER:
545 					sub = "Small Business Server 2011 Essentials Edition";
546 					break;
547 				case PRODUCT_SERVER_FOR_SB_SOLUTIONS:
548 					sub = "Server For SB Solutions Edition";
549 					break;
550 				case PRODUCT_STANDARD_SERVER_SOLUTIONS:
551 					sub = "Solutions Premium Edition";
552 					break;
553 				case PRODUCT_STANDARD_SERVER_SOLUTIONS_CORE:
554 					sub = "Solutions Premium Edition (core installation)";
555 					break;
556 				case PRODUCT_SB_SOLUTION_SERVER_EM:
557 					sub = "Server For SB Solutions EM Edition";
558 					break;
559 				case PRODUCT_SERVER_FOR_SB_SOLUTIONS_EM:
560 					sub = "Server For SB Solutions EM Edition";
561 					break;
562 				case PRODUCT_SOLUTION_EMBEDDEDSERVER:
563 					sub = "MultiPoint Server Edition";
564 					break;
565 				case PRODUCT_ESSENTIALBUSINESS_SERVER_MGMT:
566 					sub = "Essential Server Solution Management Edition";
567 					break;
568 				case PRODUCT_ESSENTIALBUSINESS_SERVER_ADDL:
569 					sub = "Essential Server Solution Additional Edition";
570 					break;
571 				case PRODUCT_ESSENTIALBUSINESS_SERVER_MGMTSVC:
572 					sub = "Essential Server Solution Management SVC Edition";
573 					break;
574 				case PRODUCT_ESSENTIALBUSINESS_SERVER_ADDLSVC:
575 					sub = "Essential Server Solution Additional SVC Edition";
576 					break;
577 				case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM_CORE:
578 					sub = "Small Business Server Premium Edition (core installation)";
579 					break;
580 				case PRODUCT_CLUSTER_SERVER_V:
581 					sub = "Hyper Core V Edition";
582 					break;
583 				case PRODUCT_STARTER_E:
584 					sub = "Hyper Core V Edition";
585 					break;
586 				case PRODUCT_ENTERPRISE_EVALUATION:
587 					sub = "Enterprise Edition (evaluation installation)";
588 					break;
589 				case PRODUCT_MULTIPOINT_STANDARD_SERVER:
590 					sub = "MultiPoint Server Standard Edition (full installation)";
591 					break;
592 				case PRODUCT_MULTIPOINT_PREMIUM_SERVER:
593 					sub = "MultiPoint Server Premium Edition (full installation)";
594 					break;
595 				case PRODUCT_STANDARD_EVALUATION_SERVER:
596 					sub = "Standard Edition (evaluation installation)";
597 					break;
598 				case PRODUCT_DATACENTER_EVALUATION_SERVER:
599 					sub = "Datacenter Edition (evaluation installation)";
600 					break;
601 				case PRODUCT_ENTERPRISE_N_EVALUATION:
602 					sub = "Enterprise N Edition (evaluation installation)";
603 					break;
604 				case PRODUCT_STORAGE_WORKGROUP_EVALUATION_SERVER:
605 					sub = "Storage Server Workgroup Edition (evaluation installation)";
606 					break;
607 				case PRODUCT_STORAGE_STANDARD_EVALUATION_SERVER:
608 					sub = "Storage Server Standard Edition (evaluation installation)";
609 					break;
610 				case PRODUCT_CORE_N:
611 					sub = "Windows 8 N Edition";
612 					break;
613 				case PRODUCT_CORE_COUNTRYSPECIFIC:
614 					sub = "Windows 8 China Edition";
615 					break;
616 				case PRODUCT_CORE_SINGLELANGUAGE:
617 					sub = "Windows 8 Single Language Edition";
618 					break;
619 				case PRODUCT_CORE:
620 					sub = "Windows 8 Edition";
621 					break;
622 				case PRODUCT_PROFESSIONAL_WMC:
623 					sub = "Professional with Media Center Edition";
624 					break;
625 			}
626 		}
627 	} else {
628 		return NULL;
629 	}
630 
631 	spprintf(&retval, 0, "%s%s%s%s%s", major, sub?" ":"", sub?sub:"", osvi.szCSDVersion[0] != '\0'?" ":"", osvi.szCSDVersion);
632 	return retval;
633 }
634 /* }}}  */
635 
636 /* {{{  */
php_get_windows_cpu(char * buf,int bufsize)637 void php_get_windows_cpu(char *buf, int bufsize)
638 {
639 	SYSTEM_INFO SysInfo;
640 	GetSystemInfo(&SysInfo);
641 	switch (SysInfo.wProcessorArchitecture) {
642 		case PROCESSOR_ARCHITECTURE_INTEL :
643 			snprintf(buf, bufsize, "i%d", SysInfo.dwProcessorType);
644 			break;
645 		case PROCESSOR_ARCHITECTURE_MIPS :
646 			snprintf(buf, bufsize, "MIPS R%d000", SysInfo.wProcessorLevel);
647 			break;
648 		case PROCESSOR_ARCHITECTURE_ALPHA :
649 			snprintf(buf, bufsize, "Alpha %d", SysInfo.wProcessorLevel);
650 			break;
651 		case PROCESSOR_ARCHITECTURE_PPC :
652 			snprintf(buf, bufsize, "PPC 6%02d", SysInfo.wProcessorLevel);
653 			break;
654 		case PROCESSOR_ARCHITECTURE_IA64 :
655 			snprintf(buf, bufsize,  "IA64");
656 			break;
657 #if defined(PROCESSOR_ARCHITECTURE_IA32_ON_WIN64)
658 		case PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 :
659 			snprintf(buf, bufsize, "IA32");
660 			break;
661 #endif
662 #if defined(PROCESSOR_ARCHITECTURE_AMD64)
663 		case PROCESSOR_ARCHITECTURE_AMD64 :
664 			snprintf(buf, bufsize, "AMD64");
665 			break;
666 #endif
667 		case PROCESSOR_ARCHITECTURE_UNKNOWN :
668 		default:
669 			snprintf(buf, bufsize, "Unknown");
670 			break;
671 	}
672 }
673 /* }}}  */
674 #endif
675 
676 /* {{{ php_get_uname
677  */
php_get_uname(char mode)678 PHPAPI zend_string *php_get_uname(char mode)
679 {
680 	char *php_uname;
681 	char tmp_uname[256];
682 #ifdef PHP_WIN32
683 	DWORD dwBuild=0;
684 	DWORD dwVersion = GetVersion();
685 	DWORD dwWindowsMajorVersion =  (DWORD)(LOBYTE(LOWORD(dwVersion)));
686 	DWORD dwWindowsMinorVersion =  (DWORD)(HIBYTE(LOWORD(dwVersion)));
687 	DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1;
688 	char ComputerName[MAX_COMPUTERNAME_LENGTH + 1];
689 
690 	GetComputerName(ComputerName, &dwSize);
691 
692 	if (mode == 's') {
693 		php_uname = "Windows NT";
694 	} else if (mode == 'r') {
695 		snprintf(tmp_uname, sizeof(tmp_uname), "%d.%d", dwWindowsMajorVersion, dwWindowsMinorVersion);
696 		php_uname = tmp_uname;
697 	} else if (mode == 'n') {
698 		php_uname = ComputerName;
699 	} else if (mode == 'v') {
700 		char *winver = php_get_windows_name();
701 		dwBuild = (DWORD)(HIWORD(dwVersion));
702 		if(winver == NULL) {
703 			snprintf(tmp_uname, sizeof(tmp_uname), "build %d", dwBuild);
704 		} else {
705 			snprintf(tmp_uname, sizeof(tmp_uname), "build %d (%s)", dwBuild, winver);
706 		}
707 		php_uname = tmp_uname;
708 		if(winver) {
709 			efree(winver);
710 		}
711 	} else if (mode == 'm') {
712 		php_get_windows_cpu(tmp_uname, sizeof(tmp_uname));
713 		php_uname = tmp_uname;
714 	} else { /* assume mode == 'a' */
715 		char *winver = php_get_windows_name();
716 		char wincpu[20];
717 
718 		ZEND_ASSERT(winver != NULL);
719 
720 		php_get_windows_cpu(wincpu, sizeof(wincpu));
721 		dwBuild = (DWORD)(HIWORD(dwVersion));
722 
723 		/* Windows "version" 6.2 could be Windows 8/Windows Server 2012, but also Windows 8.1/Windows Server 2012 R2 */
724 		if (dwWindowsMajorVersion == 6 && dwWindowsMinorVersion == 2) {
725 			if (strncmp(winver, "Windows 8.1", 11) == 0 || strncmp(winver, "Windows Server 2012 R2", 22) == 0) {
726 				dwWindowsMinorVersion = 3;
727 			}
728 		}
729 
730 		snprintf(tmp_uname, sizeof(tmp_uname), "%s %s %d.%d build %d (%s) %s",
731 				 "Windows NT", ComputerName,
732 				 dwWindowsMajorVersion, dwWindowsMinorVersion, dwBuild, winver?winver:"unknown", wincpu);
733 		if(winver) {
734 			efree(winver);
735 		}
736 		php_uname = tmp_uname;
737 	}
738 #else
739 #ifdef HAVE_SYS_UTSNAME_H
740 	struct utsname buf;
741 	if (uname((struct utsname *)&buf) == -1) {
742 		php_uname = PHP_UNAME;
743 	} else {
744 #ifdef NETWARE
745 		if (mode == 's') {
746 			php_uname = buf.sysname;
747 		} else if (mode == 'r') {
748 			snprintf(tmp_uname, sizeof(tmp_uname), "%d.%d.%d",
749 					 buf.netware_major, buf.netware_minor, buf.netware_revision);
750 			php_uname = tmp_uname;
751 		} else if (mode == 'n') {
752 			php_uname = buf.servername;
753 		} else if (mode == 'v') {
754 			snprintf(tmp_uname, sizeof(tmp_uname), "libc-%d.%d.%d #%d",
755 					 buf.libmajor, buf.libminor, buf.librevision, buf.libthreshold);
756 			php_uname = tmp_uname;
757 		} else if (mode == 'm') {
758 			php_uname = buf.machine;
759 		} else { /* assume mode == 'a' */
760 			snprintf(tmp_uname, sizeof(tmp_uname), "%s %s %d.%d.%d libc-%d.%d.%d #%d %s",
761 					 buf.sysname, buf.servername,
762 					 buf.netware_major, buf.netware_minor, buf.netware_revision,
763 					 buf.libmajor, buf.libminor, buf.librevision, buf.libthreshold,
764 					 buf.machine);
765 			php_uname = tmp_uname;
766 		}
767 #else
768 		if (mode == 's') {
769 			php_uname = buf.sysname;
770 		} else if (mode == 'r') {
771 			php_uname = buf.release;
772 		} else if (mode == 'n') {
773 			php_uname = buf.nodename;
774 		} else if (mode == 'v') {
775 			php_uname = buf.version;
776 		} else if (mode == 'm') {
777 			php_uname = buf.machine;
778 		} else { /* assume mode == 'a' */
779 			snprintf(tmp_uname, sizeof(tmp_uname), "%s %s %s %s %s",
780 					 buf.sysname, buf.nodename, buf.release, buf.version,
781 					 buf.machine);
782 			php_uname = tmp_uname;
783 		}
784 #endif /* NETWARE */
785 	}
786 #else
787 	php_uname = PHP_UNAME;
788 #endif
789 #endif
790 	return zend_string_init(php_uname, strlen(php_uname), 0);
791 }
792 /* }}} */
793 
794 /* {{{ php_print_info_htmlhead
795  */
php_print_info_htmlhead(void)796 PHPAPI void php_print_info_htmlhead(void)
797 {
798 	php_info_print("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"DTD/xhtml1-transitional.dtd\">\n");
799 	php_info_print("<html xmlns=\"http://www.w3.org/1999/xhtml\">");
800 	php_info_print("<head>\n");
801 	php_info_print_style();
802 	php_info_print("<title>phpinfo()</title>");
803 	php_info_print("<meta name=\"ROBOTS\" content=\"NOINDEX,NOFOLLOW,NOARCHIVE\" />");
804 	php_info_print("</head>\n");
805 	php_info_print("<body><div class=\"center\">\n");
806 }
807 /* }}} */
808 
809 /* {{{ module_name_cmp */
module_name_cmp(const void * a,const void * b)810 static int module_name_cmp(const void *a, const void *b)
811 {
812 	Bucket *f = (Bucket *) a;
813 	Bucket *s = (Bucket *) b;
814 
815 	return strcasecmp(((zend_module_entry *)Z_PTR(f->val))->name,
816 				  ((zend_module_entry *)Z_PTR(s->val))->name);
817 }
818 /* }}} */
819 
820 /* {{{ php_print_info
821  */
php_print_info(int flag)822 PHPAPI void php_print_info(int flag)
823 {
824 	char **env, *tmp1, *tmp2;
825 	zend_string *php_uname;
826 
827 	if (!sapi_module.phpinfo_as_text) {
828 		php_print_info_htmlhead();
829 	} else {
830 		php_info_print("phpinfo()\n");
831 	}
832 
833 	if (flag & PHP_INFO_GENERAL) {
834 		char *zend_version = get_zend_version();
835 		char temp_api[10];
836 
837 		php_uname = php_get_uname('a');
838 
839 		if (!sapi_module.phpinfo_as_text) {
840 			php_info_print_box_start(1);
841 		}
842 
843 		if (!sapi_module.phpinfo_as_text) {
844 	        time_t the_time;
845 	        struct tm *ta, tmbuf;
846 
847 	        the_time = time(NULL);
848 	        ta = php_localtime_r(&the_time, &tmbuf);
849 
850             php_info_print("<a href=\"http://www.php.net/\"><img border=\"0\" src=\"");
851 	        if (ta && (ta->tm_mon==3) && (ta->tm_mday==1)) {
852 		        php_info_print(PHP_EGG_LOGO_DATA_URI "\" alt=\"PHP logo\" /></a>");
853 	        } else {
854 		        php_info_print(PHP_LOGO_DATA_URI "\" alt=\"PHP logo\" /></a>");
855 			}
856 		}
857 
858 		if (!sapi_module.phpinfo_as_text) {
859 			php_info_printf("<h1 class=\"p\">PHP Version %s</h1>\n", PHP_VERSION);
860 		} else {
861 			php_info_print_table_row(2, "PHP Version", PHP_VERSION);
862 		}
863 		php_info_print_box_end();
864 		php_info_print_table_start();
865 		php_info_print_table_row(2, "System", ZSTR_VAL(php_uname));
866 		php_info_print_table_row(2, "Build Date", __DATE__ " " __TIME__);
867 #ifdef COMPILER
868 		php_info_print_table_row(2, "Compiler", COMPILER);
869 #endif
870 #ifdef ARCHITECTURE
871 		php_info_print_table_row(2, "Architecture", ARCHITECTURE);
872 #endif
873 #ifdef CONFIGURE_COMMAND
874 		php_info_print_table_row(2, "Configure Command", CONFIGURE_COMMAND );
875 #endif
876 
877 		if (sapi_module.pretty_name) {
878 			php_info_print_table_row(2, "Server API", sapi_module.pretty_name );
879 		}
880 
881 #ifdef VIRTUAL_DIR
882 		php_info_print_table_row(2, "Virtual Directory Support", "enabled" );
883 #else
884 		php_info_print_table_row(2, "Virtual Directory Support", "disabled" );
885 #endif
886 
887 		php_info_print_table_row(2, "Configuration File (php.ini) Path", PHP_CONFIG_FILE_PATH);
888 		php_info_print_table_row(2, "Loaded Configuration File", php_ini_opened_path ? php_ini_opened_path : "(none)");
889 		php_info_print_table_row(2, "Scan this dir for additional .ini files", php_ini_scanned_path ? php_ini_scanned_path : "(none)");
890 		php_info_print_table_row(2, "Additional .ini files parsed", php_ini_scanned_files ? php_ini_scanned_files : "(none)");
891 
892 		snprintf(temp_api, sizeof(temp_api), "%d", PHP_API_VERSION);
893 		php_info_print_table_row(2, "PHP API", temp_api);
894 
895 		snprintf(temp_api, sizeof(temp_api), "%d", ZEND_MODULE_API_NO);
896 		php_info_print_table_row(2, "PHP Extension", temp_api);
897 
898 		snprintf(temp_api, sizeof(temp_api), "%d", ZEND_EXTENSION_API_NO);
899 		php_info_print_table_row(2, "Zend Extension", temp_api);
900 
901 		php_info_print_table_row(2, "Zend Extension Build", ZEND_EXTENSION_BUILD_ID);
902 		php_info_print_table_row(2, "PHP Extension Build", ZEND_MODULE_BUILD_ID);
903 
904 #if ZEND_DEBUG
905 		php_info_print_table_row(2, "Debug Build", "yes" );
906 #else
907 		php_info_print_table_row(2, "Debug Build", "no" );
908 #endif
909 
910 #ifdef ZTS
911 		php_info_print_table_row(2, "Thread Safety", "enabled" );
912 #else
913 		php_info_print_table_row(2, "Thread Safety", "disabled" );
914 #endif
915 
916 #ifdef ZEND_SIGNALS
917 		php_info_print_table_row(2, "Zend Signal Handling", "enabled" );
918 #else
919 		php_info_print_table_row(2, "Zend Signal Handling", "disabled" );
920 #endif
921 
922 		php_info_print_table_row(2, "Zend Memory Manager", is_zend_mm() ? "enabled" : "disabled" );
923 
924 		{
925 			const zend_multibyte_functions *functions = zend_multibyte_get_functions();
926 			char *descr;
927 			if (functions) {
928 				spprintf(&descr, 0, "provided by %s", functions->provider_name);
929 			} else {
930 				descr = estrdup("disabled");
931 			}
932             php_info_print_table_row(2, "Zend Multibyte Support", descr);
933 			efree(descr);
934 		}
935 
936 #if HAVE_IPV6
937 		php_info_print_table_row(2, "IPv6 Support", "enabled" );
938 #else
939 		php_info_print_table_row(2, "IPv6 Support", "disabled" );
940 #endif
941 
942 #if HAVE_DTRACE
943 		php_info_print_table_row(2, "DTrace Support", (zend_dtrace_enabled ? "enabled" : "available, disabled"));
944 #else
945 		php_info_print_table_row(2, "DTrace Support", "disabled" );
946 #endif
947 
948 		php_info_print_stream_hash("PHP Streams",  php_stream_get_url_stream_wrappers_hash());
949 		php_info_print_stream_hash("Stream Socket Transports", php_stream_xport_get_hash());
950 		php_info_print_stream_hash("Stream Filters", php_get_stream_filters_hash());
951 
952 		php_info_print_table_end();
953 
954 		/* Zend Engine */
955 		php_info_print_box_start(0);
956 		if (!sapi_module.phpinfo_as_text) {
957 			php_info_print("<a href=\"http://www.zend.com/\"><img border=\"0\" src=\"");
958 			php_info_print(ZEND_LOGO_DATA_URI "\" alt=\"Zend logo\" /></a>\n");
959 		}
960 		php_info_print("This program makes use of the Zend Scripting Language Engine:");
961 		php_info_print(!sapi_module.phpinfo_as_text?"<br />":"\n");
962 		if (sapi_module.phpinfo_as_text) {
963 			php_info_print(zend_version);
964 		} else {
965 			zend_html_puts(zend_version, strlen(zend_version));
966 		}
967 		php_info_print_box_end();
968 		zend_string_free(php_uname);
969 	}
970 
971 	zend_ini_sort_entries();
972 
973 	if (flag & PHP_INFO_CONFIGURATION) {
974 		php_info_print_hr();
975 		if (!sapi_module.phpinfo_as_text) {
976 			php_info_print("<h1>Configuration</h1>\n");
977 		} else {
978 			SECTION("Configuration");
979 		}
980 		if (!(flag & PHP_INFO_MODULES)) {
981 			SECTION("PHP Core");
982 			display_ini_entries(NULL);
983 		}
984 	}
985 
986 	if (flag & PHP_INFO_MODULES) {
987 		HashTable sorted_registry;
988 
989 		zend_hash_init(&sorted_registry, zend_hash_num_elements(&module_registry), NULL, NULL, 1);
990 		zend_hash_copy(&sorted_registry, &module_registry, NULL);
991 		zend_hash_sort(&sorted_registry, module_name_cmp, 0);
992 
993 		zend_hash_apply(&sorted_registry, _display_module_info_func);
994 
995 		SECTION("Additional Modules");
996 		php_info_print_table_start();
997 		php_info_print_table_header(1, "Module Name");
998 		zend_hash_apply(&sorted_registry, _display_module_info_def);
999 		php_info_print_table_end();
1000 
1001 		zend_hash_destroy(&sorted_registry);
1002 	}
1003 
1004 	if (flag & PHP_INFO_ENVIRONMENT) {
1005 		SECTION("Environment");
1006 		php_info_print_table_start();
1007 		php_info_print_table_header(2, "Variable", "Value");
1008 		for (env=environ; env!=NULL && *env !=NULL; env++) {
1009 			tmp1 = estrdup(*env);
1010 			if (!(tmp2=strchr(tmp1,'='))) { /* malformed entry? */
1011 				efree(tmp1);
1012 				continue;
1013 			}
1014 			*tmp2 = 0;
1015 			tmp2++;
1016 			php_info_print_table_row(2, tmp1, tmp2);
1017 			efree(tmp1);
1018 		}
1019 		php_info_print_table_end();
1020 	}
1021 
1022 	if (flag & PHP_INFO_VARIABLES) {
1023 		zval *data;
1024 
1025 		SECTION("PHP Variables");
1026 
1027 		php_info_print_table_start();
1028 		php_info_print_table_header(2, "Variable", "Value");
1029 		if ((data = zend_hash_str_find(&EG(symbol_table), "PHP_SELF", sizeof("PHP_SELF")-1)) != NULL && Z_TYPE_P(data) == IS_STRING) {
1030 			php_info_print_table_row(2, "PHP_SELF", Z_STRVAL_P(data));
1031 		}
1032 		if ((data = zend_hash_str_find(&EG(symbol_table), "PHP_AUTH_TYPE", sizeof("PHP_AUTH_TYPE")-1)) != NULL && Z_TYPE_P(data) == IS_STRING) {
1033 			php_info_print_table_row(2, "PHP_AUTH_TYPE", Z_STRVAL_P(data));
1034 		}
1035 		if ((data = zend_hash_str_find(&EG(symbol_table), "PHP_AUTH_USER", sizeof("PHP_AUTH_USER")-1)) != NULL && Z_TYPE_P(data) == IS_STRING) {
1036 			php_info_print_table_row(2, "PHP_AUTH_USER", Z_STRVAL_P(data));
1037 		}
1038 		if ((data = zend_hash_str_find(&EG(symbol_table), "PHP_AUTH_PW", sizeof("PHP_AUTH_PW")-1)) != NULL && Z_TYPE_P(data) == IS_STRING) {
1039 			php_info_print_table_row(2, "PHP_AUTH_PW", Z_STRVAL_P(data));
1040 		}
1041 		php_print_gpcse_array(ZEND_STRL("_REQUEST"));
1042 		php_print_gpcse_array(ZEND_STRL("_GET"));
1043 		php_print_gpcse_array(ZEND_STRL("_POST"));
1044 		php_print_gpcse_array(ZEND_STRL("_FILES"));
1045 		php_print_gpcse_array(ZEND_STRL("_COOKIE"));
1046 		php_print_gpcse_array(ZEND_STRL("_SERVER"));
1047 		php_print_gpcse_array(ZEND_STRL("_ENV"));
1048 		php_info_print_table_end();
1049 	}
1050 
1051 
1052 	if ((flag & PHP_INFO_CREDITS) && !sapi_module.phpinfo_as_text) {
1053 		php_info_print_hr();
1054 		php_print_credits(PHP_CREDITS_ALL & ~PHP_CREDITS_FULLPAGE);
1055 	}
1056 
1057 	if (flag & PHP_INFO_LICENSE) {
1058 		if (!sapi_module.phpinfo_as_text) {
1059 			SECTION("PHP License");
1060 			php_info_print_box_start(0);
1061 			php_info_print("<p>\n");
1062 			php_info_print("This program is free software; you can redistribute it and/or modify ");
1063 			php_info_print("it under the terms of the PHP License as published by the PHP Group ");
1064 			php_info_print("and included in the distribution in the file:  LICENSE\n");
1065 			php_info_print("</p>\n");
1066 			php_info_print("<p>");
1067 			php_info_print("This program is distributed in the hope that it will be useful, ");
1068 			php_info_print("but WITHOUT ANY WARRANTY; without even the implied warranty of ");
1069 			php_info_print("MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n");
1070 			php_info_print("</p>\n");
1071 			php_info_print("<p>");
1072 			php_info_print("If you did not receive a copy of the PHP license, or have any questions about ");
1073 			php_info_print("PHP licensing, please contact license@php.net.\n");
1074 			php_info_print("</p>\n");
1075 			php_info_print_box_end();
1076 		} else {
1077 			php_info_print("\nPHP License\n");
1078 			php_info_print("This program is free software; you can redistribute it and/or modify\n");
1079 			php_info_print("it under the terms of the PHP License as published by the PHP Group\n");
1080 			php_info_print("and included in the distribution in the file:  LICENSE\n");
1081 			php_info_print("\n");
1082 			php_info_print("This program is distributed in the hope that it will be useful,\n");
1083 			php_info_print("but WITHOUT ANY WARRANTY; without even the implied warranty of\n");
1084 			php_info_print("MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n");
1085 			php_info_print("\n");
1086 			php_info_print("If you did not receive a copy of the PHP license, or have any\n");
1087 			php_info_print("questions about PHP licensing, please contact license@php.net.\n");
1088 		}
1089 	}
1090 
1091 	if (!sapi_module.phpinfo_as_text) {
1092 		php_info_print("</div></body></html>");
1093 	}
1094 }
1095 /* }}} */
1096 
php_info_print_table_start(void)1097 PHPAPI void php_info_print_table_start(void) /* {{{ */
1098 {
1099 	if (!sapi_module.phpinfo_as_text) {
1100 		php_info_print("<table>\n");
1101 	} else {
1102 		php_info_print("\n");
1103 	}
1104 }
1105 /* }}} */
1106 
php_info_print_table_end(void)1107 PHPAPI void php_info_print_table_end(void) /* {{{ */
1108 {
1109 	if (!sapi_module.phpinfo_as_text) {
1110 		php_info_print("</table>\n");
1111 	}
1112 
1113 }
1114 /* }}} */
1115 
php_info_print_box_start(int flag)1116 PHPAPI void php_info_print_box_start(int flag) /* {{{ */
1117 {
1118 	php_info_print_table_start();
1119 	if (flag) {
1120 		if (!sapi_module.phpinfo_as_text) {
1121 			php_info_print("<tr class=\"h\"><td>\n");
1122 		}
1123 	} else {
1124 		if (!sapi_module.phpinfo_as_text) {
1125 			php_info_print("<tr class=\"v\"><td>\n");
1126 		} else {
1127 			php_info_print("\n");
1128 		}
1129 	}
1130 }
1131 /* }}} */
1132 
php_info_print_box_end(void)1133 PHPAPI void php_info_print_box_end(void) /* {{{ */
1134 {
1135 	if (!sapi_module.phpinfo_as_text) {
1136 		php_info_print("</td></tr>\n");
1137 	}
1138 	php_info_print_table_end();
1139 }
1140 /* }}} */
1141 
php_info_print_hr(void)1142 PHPAPI void php_info_print_hr(void) /* {{{ */
1143 {
1144 	if (!sapi_module.phpinfo_as_text) {
1145 		php_info_print("<hr />\n");
1146 	} else {
1147 		php_info_print("\n\n _______________________________________________________________________\n\n");
1148 	}
1149 }
1150 /* }}} */
1151 
php_info_print_table_colspan_header(int num_cols,char * header)1152 PHPAPI void php_info_print_table_colspan_header(int num_cols, char *header) /* {{{ */
1153 {
1154 	int spaces;
1155 
1156 	if (!sapi_module.phpinfo_as_text) {
1157 		php_info_printf("<tr class=\"h\"><th colspan=\"%d\">%s</th></tr>\n", num_cols, header );
1158 	} else {
1159 		spaces = (int)(74 - strlen(header));
1160 		php_info_printf("%*s%s%*s\n", (int)(spaces/2), " ", header, (int)(spaces/2), " ");
1161 	}
1162 }
1163 /* }}} */
1164 
1165 /* {{{ php_info_print_table_header
1166  */
php_info_print_table_header(int num_cols,...)1167 PHPAPI void php_info_print_table_header(int num_cols, ...)
1168 {
1169 	int i;
1170 	va_list row_elements;
1171 	char *row_element;
1172 
1173 	va_start(row_elements, num_cols);
1174 	if (!sapi_module.phpinfo_as_text) {
1175 		php_info_print("<tr class=\"h\">");
1176 	}
1177 	for (i=0; i<num_cols; i++) {
1178 		row_element = va_arg(row_elements, char *);
1179 		if (!row_element || !*row_element) {
1180 			row_element = " ";
1181 		}
1182 		if (!sapi_module.phpinfo_as_text) {
1183 			php_info_print("<th>");
1184 			php_info_print(row_element);
1185 			php_info_print("</th>");
1186 		} else {
1187 			php_info_print(row_element);
1188 			if (i < num_cols-1) {
1189 				php_info_print(" => ");
1190 			} else {
1191 				php_info_print("\n");
1192 			}
1193 		}
1194 	}
1195 	if (!sapi_module.phpinfo_as_text) {
1196 		php_info_print("</tr>\n");
1197 	}
1198 
1199 	va_end(row_elements);
1200 }
1201 /* }}} */
1202 
1203 /* {{{ php_info_print_table_row_internal
1204  */
php_info_print_table_row_internal(int num_cols,const char * value_class,va_list row_elements)1205 static void php_info_print_table_row_internal(int num_cols,
1206 		const char *value_class, va_list row_elements)
1207 {
1208 	int i;
1209 	char *row_element;
1210 
1211 	if (!sapi_module.phpinfo_as_text) {
1212 		php_info_print("<tr>");
1213 	}
1214 	for (i=0; i<num_cols; i++) {
1215 		if (!sapi_module.phpinfo_as_text) {
1216 			php_info_printf("<td class=\"%s\">",
1217 			   (i==0 ? "e" : value_class )
1218 			);
1219 		}
1220 		row_element = va_arg(row_elements, char *);
1221 		if (!row_element || !*row_element) {
1222 			if (!sapi_module.phpinfo_as_text) {
1223 				php_info_print( "<i>no value</i>" );
1224 			} else {
1225 				php_info_print( " " );
1226 			}
1227 		} else {
1228 			if (!sapi_module.phpinfo_as_text) {
1229 				php_info_print_html_esc(row_element, strlen(row_element));
1230 			} else {
1231 				php_info_print(row_element);
1232 				if (i < num_cols-1) {
1233 					php_info_print(" => ");
1234 				}
1235 			}
1236 		}
1237 		if (!sapi_module.phpinfo_as_text) {
1238 			php_info_print(" </td>");
1239 		} else if (i == (num_cols - 1)) {
1240 			php_info_print("\n");
1241 		}
1242 	}
1243 	if (!sapi_module.phpinfo_as_text) {
1244 		php_info_print("</tr>\n");
1245 	}
1246 }
1247 /* }}} */
1248 
1249 /* {{{ php_info_print_table_row
1250  */
php_info_print_table_row(int num_cols,...)1251 PHPAPI void php_info_print_table_row(int num_cols, ...)
1252 {
1253 	va_list row_elements;
1254 
1255 	va_start(row_elements, num_cols);
1256 	php_info_print_table_row_internal(num_cols, "v", row_elements);
1257 	va_end(row_elements);
1258 }
1259 /* }}} */
1260 
1261 /* {{{ php_info_print_table_row_ex
1262  */
php_info_print_table_row_ex(int num_cols,const char * value_class,...)1263 PHPAPI void php_info_print_table_row_ex(int num_cols, const char *value_class,
1264 		...)
1265 {
1266 	va_list row_elements;
1267 
1268 	va_start(row_elements, value_class);
1269 	php_info_print_table_row_internal(num_cols, value_class, row_elements);
1270 	va_end(row_elements);
1271 }
1272 /* }}} */
1273 
1274 /* {{{ register_phpinfo_constants
1275  */
register_phpinfo_constants(INIT_FUNC_ARGS)1276 void register_phpinfo_constants(INIT_FUNC_ARGS)
1277 {
1278 	REGISTER_LONG_CONSTANT("INFO_GENERAL", PHP_INFO_GENERAL, CONST_PERSISTENT|CONST_CS);
1279 	REGISTER_LONG_CONSTANT("INFO_CREDITS", PHP_INFO_CREDITS, CONST_PERSISTENT|CONST_CS);
1280 	REGISTER_LONG_CONSTANT("INFO_CONFIGURATION", PHP_INFO_CONFIGURATION, CONST_PERSISTENT|CONST_CS);
1281 	REGISTER_LONG_CONSTANT("INFO_MODULES", PHP_INFO_MODULES, CONST_PERSISTENT|CONST_CS);
1282 	REGISTER_LONG_CONSTANT("INFO_ENVIRONMENT", PHP_INFO_ENVIRONMENT, CONST_PERSISTENT|CONST_CS);
1283 	REGISTER_LONG_CONSTANT("INFO_VARIABLES", PHP_INFO_VARIABLES, CONST_PERSISTENT|CONST_CS);
1284 	REGISTER_LONG_CONSTANT("INFO_LICENSE", PHP_INFO_LICENSE, CONST_PERSISTENT|CONST_CS);
1285 	REGISTER_LONG_CONSTANT("INFO_ALL", PHP_INFO_ALL, CONST_PERSISTENT|CONST_CS);
1286 	REGISTER_LONG_CONSTANT("CREDITS_GROUP",	PHP_CREDITS_GROUP, CONST_PERSISTENT|CONST_CS);
1287 	REGISTER_LONG_CONSTANT("CREDITS_GENERAL",	PHP_CREDITS_GENERAL, CONST_PERSISTENT|CONST_CS);
1288 	REGISTER_LONG_CONSTANT("CREDITS_SAPI",	PHP_CREDITS_SAPI, CONST_PERSISTENT|CONST_CS);
1289 	REGISTER_LONG_CONSTANT("CREDITS_MODULES",	PHP_CREDITS_MODULES, CONST_PERSISTENT|CONST_CS);
1290 	REGISTER_LONG_CONSTANT("CREDITS_DOCS",	PHP_CREDITS_DOCS, CONST_PERSISTENT|CONST_CS);
1291 	REGISTER_LONG_CONSTANT("CREDITS_FULLPAGE",	PHP_CREDITS_FULLPAGE, CONST_PERSISTENT|CONST_CS);
1292 	REGISTER_LONG_CONSTANT("CREDITS_QA",	PHP_CREDITS_QA, CONST_PERSISTENT|CONST_CS);
1293 	REGISTER_LONG_CONSTANT("CREDITS_ALL",	PHP_CREDITS_ALL, CONST_PERSISTENT|CONST_CS);
1294 }
1295 /* }}} */
1296 
1297 /* {{{ proto void phpinfo([int what])
1298    Output a page of useful information about PHP and the current request */
PHP_FUNCTION(phpinfo)1299 PHP_FUNCTION(phpinfo)
1300 {
1301 	zend_long flag = PHP_INFO_ALL;
1302 
1303 	if (zend_parse_parameters(ZEND_NUM_ARGS(), "|l", &flag) == FAILURE) {
1304 		return;
1305 	}
1306 
1307 	/* Andale!  Andale!  Yee-Hah! */
1308 	php_output_start_default();
1309 	php_print_info((int)flag);
1310 	php_output_end();
1311 
1312 	RETURN_TRUE;
1313 }
1314 
1315 /* }}} */
1316 
1317 /* {{{ proto string phpversion([string extension])
1318    Return the current PHP version */
PHP_FUNCTION(phpversion)1319 PHP_FUNCTION(phpversion)
1320 {
1321 	char *ext_name = NULL;
1322 	size_t ext_name_len = 0;
1323 
1324 	if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &ext_name, &ext_name_len) == FAILURE) {
1325 		return;
1326 	}
1327 
1328 	if (!ext_name) {
1329 		RETURN_STRING(PHP_VERSION);
1330 	} else {
1331 		const char *version;
1332 		version = zend_get_module_version(ext_name);
1333 		if (version == NULL) {
1334 			RETURN_FALSE;
1335 		}
1336 		RETURN_STRING(version);
1337 	}
1338 }
1339 /* }}} */
1340 
1341 /* {{{ proto void phpcredits([int flag])
1342    Prints the list of people who've contributed to the PHP project */
PHP_FUNCTION(phpcredits)1343 PHP_FUNCTION(phpcredits)
1344 {
1345 	zend_long flag = PHP_CREDITS_ALL;
1346 
1347 	if (zend_parse_parameters(ZEND_NUM_ARGS(), "|l", &flag) == FAILURE) {
1348 		return;
1349 	}
1350 
1351 	php_print_credits((int)flag);
1352 	RETURN_TRUE;
1353 }
1354 /* }}} */
1355 
1356 /* {{{ proto string php_sapi_name(void)
1357    Return the current SAPI module name */
PHP_FUNCTION(php_sapi_name)1358 PHP_FUNCTION(php_sapi_name)
1359 {
1360 	if (zend_parse_parameters_none() == FAILURE) {
1361 		return;
1362 	}
1363 
1364 	if (sapi_module.name) {
1365 		RETURN_STRING(sapi_module.name);
1366 	} else {
1367 		RETURN_FALSE;
1368 	}
1369 }
1370 
1371 /* }}} */
1372 
1373 /* {{{ proto string php_uname(void)
1374    Return information about the system PHP was built on */
PHP_FUNCTION(php_uname)1375 PHP_FUNCTION(php_uname)
1376 {
1377 	char *mode = "a";
1378 	size_t modelen = sizeof("a")-1;
1379 
1380 	if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &mode, &modelen) == FAILURE) {
1381 		return;
1382 	}
1383 	RETURN_STR(php_get_uname(*mode));
1384 }
1385 
1386 /* }}} */
1387 
1388 /* {{{ proto string php_ini_scanned_files(void)
1389    Return comma-separated string of .ini files parsed from the additional ini dir */
PHP_FUNCTION(php_ini_scanned_files)1390 PHP_FUNCTION(php_ini_scanned_files)
1391 {
1392 	if (zend_parse_parameters_none() == FAILURE) {
1393 		return;
1394 	}
1395 
1396 	if (strlen(PHP_CONFIG_FILE_SCAN_DIR) && php_ini_scanned_files) {
1397 		RETURN_STRING(php_ini_scanned_files);
1398 	} else {
1399 		RETURN_FALSE;
1400 	}
1401 }
1402 /* }}} */
1403 
1404 /* {{{ proto string php_ini_loaded_file(void)
1405    Return the actual loaded ini filename */
PHP_FUNCTION(php_ini_loaded_file)1406 PHP_FUNCTION(php_ini_loaded_file)
1407 {
1408 	if (zend_parse_parameters_none() == FAILURE) {
1409 		return;
1410 	}
1411 
1412 	if (php_ini_opened_path) {
1413 		RETURN_STRING(php_ini_opened_path);
1414 	} else {
1415 		RETURN_FALSE;
1416 	}
1417 }
1418 /* }}} */
1419 
1420 /*
1421  * Local variables:
1422  * tab-width: 4
1423  * c-basic-offset: 4
1424  * End:
1425  * vim600: sw=4 ts=4 fdm=marker
1426  * vim<600: sw=4 ts=4
1427  */
1428