1/* 2 +----------------------------------------------------------------------+ 3 | PHP Version 5 | 4 +----------------------------------------------------------------------+ 5 | Copyright (c) 1997-2013 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@easydns.com> | 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 41 42#ifdef PHP_WIN32 43typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); 44typedef BOOL (WINAPI *PGPI)(DWORD, DWORD, DWORD, DWORD, PDWORD); 45# include "winver.h" 46 47# if _MSC_VER < 1300 48# define OSVERSIONINFOEX php_win_OSVERSIONINFOEX 49# endif 50#endif 51 52#define SECTION(name) if (!sapi_module.phpinfo_as_text) { \ 53 php_info_print("<h2>" name "</h2>\n"); \ 54 } else { \ 55 php_info_print_table_start(); \ 56 php_info_print_table_header(1, name); \ 57 php_info_print_table_end(); \ 58 } \ 59 60PHPAPI extern char *php_ini_opened_path; 61PHPAPI extern char *php_ini_scanned_path; 62PHPAPI extern char *php_ini_scanned_files; 63 64static int php_info_print_html_esc(const char *str, int len) /* {{{ */ 65{ 66 size_t new_len; 67 int written; 68 char *new_str; 69 TSRMLS_FETCH(); 70 71 new_str = php_escape_html_entities((unsigned char *) str, len, &new_len, 0, ENT_QUOTES, "utf-8" TSRMLS_CC); 72 written = php_output_write(new_str, new_len TSRMLS_CC); 73 efree(new_str); 74 return written; 75} 76/* }}} */ 77 78static int php_info_printf(const char *fmt, ...) /* {{{ */ 79{ 80 char *buf; 81 int len, written; 82 va_list argv; 83 TSRMLS_FETCH(); 84 85 va_start(argv, fmt); 86 len = vspprintf(&buf, 0, fmt, argv); 87 va_end(argv); 88 89 written = php_output_write(buf, len TSRMLS_CC); 90 efree(buf); 91 return written; 92} 93/* }}} */ 94 95static int php_info_print(const char *str) /* {{{ */ 96{ 97 TSRMLS_FETCH(); 98 return php_output_write(str, strlen(str) TSRMLS_CC); 99} 100/* }}} */ 101 102static void php_info_print_stream_hash(const char *name, HashTable *ht TSRMLS_DC) /* {{{ */ 103{ 104 char *key; 105 uint len; 106 107 if (ht) { 108 if (zend_hash_num_elements(ht)) { 109 HashPosition pos; 110 111 if (!sapi_module.phpinfo_as_text) { 112 php_info_printf("<tr><td class=\"e\">Registered %s</td><td class=\"v\">", name); 113 } else { 114 php_info_printf("\nRegistered %s => ", name); 115 } 116 117 zend_hash_internal_pointer_reset_ex(ht, &pos); 118 while (zend_hash_get_current_key_ex(ht, &key, &len, NULL, 0, &pos) == HASH_KEY_IS_STRING) 119 { 120 php_info_print(key); 121 zend_hash_move_forward_ex(ht, &pos); 122 if (zend_hash_get_current_key_ex(ht, &key, &len, NULL, 0, &pos) == HASH_KEY_IS_STRING) { 123 php_info_print(", "); 124 } else { 125 break; 126 } 127 } 128 129 if (!sapi_module.phpinfo_as_text) { 130 php_info_print("</td></tr>\n"); 131 } 132 } else { 133 char reg_name[128]; 134 snprintf(reg_name, sizeof(reg_name), "Registered %s", name); 135 php_info_print_table_row(2, reg_name, "none registered"); 136 } 137 } else { 138 php_info_print_table_row(2, name, "disabled"); 139 } 140} 141/* }}} */ 142 143PHPAPI void php_info_print_module(zend_module_entry *zend_module TSRMLS_DC) /* {{{ */ 144{ 145 if (zend_module->info_func || zend_module->version) { 146 if (!sapi_module.phpinfo_as_text) { 147 php_info_printf("<h2><a name=\"module_%s\">%s</a></h2>\n", zend_module->name, zend_module->name); 148 } else { 149 php_info_print_table_start(); 150 php_info_print_table_header(1, zend_module->name); 151 php_info_print_table_end(); 152 } 153 if (zend_module->info_func) { 154 zend_module->info_func(zend_module TSRMLS_CC); 155 } else { 156 php_info_print_table_start(); 157 php_info_print_table_row(2, "Version", zend_module->version); 158 php_info_print_table_end(); 159 DISPLAY_INI_ENTRIES(); 160 } 161 } else { 162 if (!sapi_module.phpinfo_as_text) { 163 php_info_printf("<tr><td>%s</td></tr>\n", zend_module->name); 164 } else { 165 php_info_printf("%s\n", zend_module->name); 166 } 167 } 168} 169/* }}} */ 170 171static int _display_module_info_func(zend_module_entry *module TSRMLS_DC) /* {{{ */ 172{ 173 if (module->info_func || module->version) { 174 php_info_print_module(module TSRMLS_CC); 175 } 176 return ZEND_HASH_APPLY_KEEP; 177} 178/* }}} */ 179 180static int _display_module_info_def(zend_module_entry *module TSRMLS_DC) /* {{{ */ 181{ 182 if (!module->info_func && !module->version) { 183 php_info_print_module(module TSRMLS_CC); 184 } 185 return ZEND_HASH_APPLY_KEEP; 186} 187/* }}} */ 188 189/* {{{ php_print_gpcse_array 190 */ 191static void php_print_gpcse_array(char *name, uint name_length TSRMLS_DC) 192{ 193 zval **data, **tmp, tmp2; 194 char *string_key; 195 uint string_len; 196 ulong num_key; 197 198 zend_is_auto_global(name, name_length TSRMLS_CC); 199 200 if (zend_hash_find(&EG(symbol_table), name, name_length+1, (void **) &data)!=FAILURE 201 && (Z_TYPE_PP(data)==IS_ARRAY)) { 202 zend_hash_internal_pointer_reset(Z_ARRVAL_PP(data)); 203 while (zend_hash_get_current_data(Z_ARRVAL_PP(data), (void **) &tmp) == SUCCESS) { 204 if (!sapi_module.phpinfo_as_text) { 205 php_info_print("<tr>"); 206 php_info_print("<td class=\"e\">"); 207 } 208 209 php_info_print(name); 210 php_info_print("[\""); 211 212 switch (zend_hash_get_current_key_ex(Z_ARRVAL_PP(data), &string_key, &string_len, &num_key, 0, NULL)) { 213 case HASH_KEY_IS_STRING: 214 if (!sapi_module.phpinfo_as_text) { 215 php_info_print_html_esc(string_key, string_len-1); 216 } else { 217 php_info_print(string_key); 218 } 219 break; 220 case HASH_KEY_IS_LONG: 221 php_info_printf("%ld", num_key); 222 break; 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_PP(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 TSRMLS_CC); 234 php_info_print("</pre>"); 235 } else { 236 zend_print_zval_r(*tmp, 0 TSRMLS_CC); 237 } 238 } else { 239 tmp2 = **tmp; 240 if (Z_TYPE_PP(tmp) != 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_move_forward(Z_ARRVAL_PP(data)); 266 } 267 } 268} 269/* }}} */ 270 271/* {{{ php_info_print_style 272 */ 273void php_info_print_style(TSRMLS_D) 274{ 275 php_info_printf("<style type=\"text/css\">\n"); 276 php_info_print_css(TSRMLS_C); 277 php_info_printf("</style>\n"); 278} 279/* }}} */ 280 281/* {{{ php_info_html_esc 282 */ 283PHPAPI char *php_info_html_esc(char *string TSRMLS_DC) 284{ 285 size_t new_len; 286 return php_escape_html_entities(string, strlen(string), &new_len, 0, ENT_QUOTES, NULL TSRMLS_CC); 287} 288/* }}} */ 289 290#ifdef PHP_WIN32 291/* {{{ */ 292 293char* php_get_windows_name() 294{ 295 OSVERSIONINFOEX osvi; 296 SYSTEM_INFO si; 297 PGNSI pGNSI; 298 PGPI pGPI; 299 BOOL bOsVersionInfoEx; 300 DWORD dwType; 301 char *major = NULL, *sub = NULL, *retval; 302 303 ZeroMemory(&si, sizeof(SYSTEM_INFO)); 304 ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); 305 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); 306 307 if (!(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi))) { 308 return NULL; 309 } 310 311 pGNSI = (PGNSI) GetProcAddress(GetModuleHandle("kernel32.dll"), "GetNativeSystemInfo"); 312 if(NULL != pGNSI) { 313 pGNSI(&si); 314 } else { 315 GetSystemInfo(&si); 316 } 317 318 if (VER_PLATFORM_WIN32_NT==osvi.dwPlatformId && osvi.dwMajorVersion > 4 ) { 319 if (osvi.dwMajorVersion == 6) { 320 if( osvi.dwMinorVersion == 0 ) { 321 if( osvi.wProductType == VER_NT_WORKSTATION ) { 322 major = "Windows Vista"; 323 } else { 324 major = "Windows Server 2008"; 325 } 326 } else 327 if ( osvi.dwMinorVersion == 1 ) { 328 if( osvi.wProductType == VER_NT_WORKSTATION ) { 329 major = "Windows 7"; 330 } else { 331 major = "Windows Server 2008 R2"; 332 } 333 } else if ( osvi.dwMinorVersion == 2 ) { 334 if( osvi.wProductType == VER_NT_WORKSTATION ) { 335 major = "Windows 8"; 336 } else { 337 major = "Windows Server 2012"; 338 } 339 } else { 340 major = "Unknown Windows version"; 341 } 342 343 pGPI = (PGPI) GetProcAddress(GetModuleHandle("kernel32.dll"), "GetProductInfo"); 344 pGPI(6, 0, 0, 0, &dwType); 345 346 switch (dwType) { 347 case PRODUCT_ULTIMATE: 348 sub = "Ultimate Edition"; 349 break; 350 case PRODUCT_HOME_PREMIUM: 351 sub = "Home Premium Edition"; 352 break; 353 case PRODUCT_HOME_BASIC: 354 sub = "Home Basic Edition"; 355 break; 356 case PRODUCT_ENTERPRISE: 357 sub = "Enterprise Edition"; 358 break; 359 case PRODUCT_BUSINESS: 360 sub = "Business Edition"; 361 break; 362 case PRODUCT_STARTER: 363 sub = "Starter Edition"; 364 break; 365 case PRODUCT_CLUSTER_SERVER: 366 sub = "Cluster Server Edition"; 367 break; 368 case PRODUCT_DATACENTER_SERVER: 369 sub = "Datacenter Edition"; 370 break; 371 case PRODUCT_DATACENTER_SERVER_CORE: 372 sub = "Datacenter Edition (core installation)"; 373 break; 374 case PRODUCT_ENTERPRISE_SERVER: 375 sub = "Enterprise Edition"; 376 break; 377 case PRODUCT_ENTERPRISE_SERVER_CORE: 378 sub = "Enterprise Edition (core installation)"; 379 break; 380 case PRODUCT_ENTERPRISE_SERVER_IA64: 381 sub = "Enterprise Edition for Itanium-based Systems"; 382 break; 383 case PRODUCT_SMALLBUSINESS_SERVER: 384 sub = "Small Business Server"; 385 break; 386 case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM: 387 sub = "Small Business Server Premium Edition"; 388 break; 389 case PRODUCT_STANDARD_SERVER: 390 sub = "Standard Edition"; 391 break; 392 case PRODUCT_STANDARD_SERVER_CORE: 393 sub = "Standard Edition (core installation)"; 394 break; 395 case PRODUCT_WEB_SERVER: 396 sub = "Web Server Edition"; 397 break; 398 } 399 } 400 401 if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 ) { 402 if (GetSystemMetrics(SM_SERVERR2)) 403 major = "Windows Server 2003 R2"; 404 else if (osvi.wSuiteMask==VER_SUITE_STORAGE_SERVER) 405 major = "Windows Storage Server 2003"; 406 else if (osvi.wSuiteMask==VER_SUITE_WH_SERVER) 407 major = "Windows Home Server"; 408 else if (osvi.wProductType == VER_NT_WORKSTATION && 409 si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64) { 410 major = "Windows XP Professional x64 Edition"; 411 } else { 412 major = "Windows Server 2003"; 413 } 414 415 /* Test for the server type. */ 416 if ( osvi.wProductType != VER_NT_WORKSTATION ) { 417 if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_IA64 ) { 418 if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) 419 sub = "Datacenter Edition for Itanium-based Systems"; 420 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) 421 sub = "Enterprise Edition for Itanium-based Systems"; 422 } 423 424 else if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 ) { 425 if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) 426 sub = "Datacenter x64 Edition"; 427 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) 428 sub = "Enterprise x64 Edition"; 429 else sub = "Standard x64 Edition"; 430 } else { 431 if ( osvi.wSuiteMask & VER_SUITE_COMPUTE_SERVER ) 432 sub = "Compute Cluster Edition"; 433 else if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) 434 sub = "Datacenter Edition"; 435 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) 436 sub = "Enterprise Edition"; 437 else if ( osvi.wSuiteMask & VER_SUITE_BLADE ) 438 sub = "Web Edition"; 439 else sub = "Standard Edition"; 440 } 441 } 442 } 443 444 if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 ) { 445 major = "Windows XP"; 446 if( osvi.wSuiteMask & VER_SUITE_PERSONAL ) { 447 sub = "Home Edition"; 448 } else if (GetSystemMetrics(SM_MEDIACENTER)) { 449 sub = "Media Center Edition"; 450 } else if (GetSystemMetrics(SM_STARTER)) { 451 sub = "Starter Edition"; 452 } else if (GetSystemMetrics(SM_TABLETPC)) { 453 sub = "Tablet PC Edition"; 454 } else { 455 sub = "Professional"; 456 } 457 } 458 459 if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 ) { 460 major = "Windows 2000"; 461 462 if (osvi.wProductType == VER_NT_WORKSTATION ) { 463 sub = "Professional"; 464 } else { 465 if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) 466 sub = "Datacenter Server"; 467 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) 468 sub = "Advanced Server"; 469 else sub = "Server"; 470 } 471 } 472 } else { 473 return NULL; 474 } 475 476 spprintf(&retval, 0, "%s%s%s%s%s", major, sub?" ":"", sub?sub:"", osvi.szCSDVersion[0] != '\0'?" ":"", osvi.szCSDVersion); 477 return retval; 478} 479/* }}} */ 480 481/* {{{ */ 482void php_get_windows_cpu(char *buf, int bufsize) 483{ 484 SYSTEM_INFO SysInfo; 485 GetSystemInfo(&SysInfo); 486 switch (SysInfo.wProcessorArchitecture) { 487 case PROCESSOR_ARCHITECTURE_INTEL : 488 snprintf(buf, bufsize, "i%d", SysInfo.dwProcessorType); 489 break; 490 case PROCESSOR_ARCHITECTURE_MIPS : 491 snprintf(buf, bufsize, "MIPS R%d000", SysInfo.wProcessorLevel); 492 break; 493 case PROCESSOR_ARCHITECTURE_ALPHA : 494 snprintf(buf, bufsize, "Alpha %d", SysInfo.wProcessorLevel); 495 break; 496 case PROCESSOR_ARCHITECTURE_PPC : 497 snprintf(buf, bufsize, "PPC 6%02d", SysInfo.wProcessorLevel); 498 break; 499 case PROCESSOR_ARCHITECTURE_IA64 : 500 snprintf(buf, bufsize, "IA64"); 501 break; 502#if defined(PROCESSOR_ARCHITECTURE_IA32_ON_WIN64) 503 case PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 : 504 snprintf(buf, bufsize, "IA32"); 505 break; 506#endif 507#if defined(PROCESSOR_ARCHITECTURE_AMD64) 508 case PROCESSOR_ARCHITECTURE_AMD64 : 509 snprintf(buf, bufsize, "AMD64"); 510 break; 511#endif 512 case PROCESSOR_ARCHITECTURE_UNKNOWN : 513 default: 514 snprintf(buf, bufsize, "Unknown"); 515 break; 516 } 517} 518/* }}} */ 519#endif 520 521/* {{{ php_get_uname 522 */ 523PHPAPI char *php_get_uname(char mode) 524{ 525 char *php_uname; 526 char tmp_uname[256]; 527#ifdef PHP_WIN32 528 DWORD dwBuild=0; 529 DWORD dwVersion = GetVersion(); 530 DWORD dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion))); 531 DWORD dwWindowsMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion))); 532 DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1; 533 char ComputerName[MAX_COMPUTERNAME_LENGTH + 1]; 534 535 GetComputerName(ComputerName, &dwSize); 536 537 if (mode == 's') { 538 php_uname = "Windows NT"; 539 } else if (mode == 'r') { 540 snprintf(tmp_uname, sizeof(tmp_uname), "%d.%d", dwWindowsMajorVersion, dwWindowsMinorVersion); 541 php_uname = tmp_uname; 542 } else if (mode == 'n') { 543 php_uname = ComputerName; 544 } else if (mode == 'v') { 545 char *winver = php_get_windows_name(); 546 dwBuild = (DWORD)(HIWORD(dwVersion)); 547 if(winver == NULL) { 548 snprintf(tmp_uname, sizeof(tmp_uname), "build %d", dwBuild); 549 } else { 550 snprintf(tmp_uname, sizeof(tmp_uname), "build %d (%s)", dwBuild, winver); 551 } 552 php_uname = tmp_uname; 553 if(winver) { 554 efree(winver); 555 } 556 } else if (mode == 'm') { 557 php_get_windows_cpu(tmp_uname, sizeof(tmp_uname)); 558 php_uname = tmp_uname; 559 } else { /* assume mode == 'a' */ 560 char *winver = php_get_windows_name(); 561 char wincpu[20]; 562 563 php_get_windows_cpu(wincpu, sizeof(wincpu)); 564 dwBuild = (DWORD)(HIWORD(dwVersion)); 565 snprintf(tmp_uname, sizeof(tmp_uname), "%s %s %d.%d build %d (%s) %s", 566 "Windows NT", ComputerName, 567 dwWindowsMajorVersion, dwWindowsMinorVersion, dwBuild, winver?winver:"unknown", wincpu); 568 if(winver) { 569 efree(winver); 570 } 571 php_uname = tmp_uname; 572 } 573#else 574#ifdef HAVE_SYS_UTSNAME_H 575 struct utsname buf; 576 if (uname((struct utsname *)&buf) == -1) { 577 php_uname = PHP_UNAME; 578 } else { 579#ifdef NETWARE 580 if (mode == 's') { 581 php_uname = buf.sysname; 582 } else if (mode == 'r') { 583 snprintf(tmp_uname, sizeof(tmp_uname), "%d.%d.%d", 584 buf.netware_major, buf.netware_minor, buf.netware_revision); 585 php_uname = tmp_uname; 586 } else if (mode == 'n') { 587 php_uname = buf.servername; 588 } else if (mode == 'v') { 589 snprintf(tmp_uname, sizeof(tmp_uname), "libc-%d.%d.%d #%d", 590 buf.libmajor, buf.libminor, buf.librevision, buf.libthreshold); 591 php_uname = tmp_uname; 592 } else if (mode == 'm') { 593 php_uname = buf.machine; 594 } else { /* assume mode == 'a' */ 595 snprintf(tmp_uname, sizeof(tmp_uname), "%s %s %d.%d.%d libc-%d.%d.%d #%d %s", 596 buf.sysname, buf.servername, 597 buf.netware_major, buf.netware_minor, buf.netware_revision, 598 buf.libmajor, buf.libminor, buf.librevision, buf.libthreshold, 599 buf.machine); 600 php_uname = tmp_uname; 601 } 602#else 603 if (mode == 's') { 604 php_uname = buf.sysname; 605 } else if (mode == 'r') { 606 php_uname = buf.release; 607 } else if (mode == 'n') { 608 php_uname = buf.nodename; 609 } else if (mode == 'v') { 610 php_uname = buf.version; 611 } else if (mode == 'm') { 612 php_uname = buf.machine; 613 } else { /* assume mode == 'a' */ 614 snprintf(tmp_uname, sizeof(tmp_uname), "%s %s %s %s %s", 615 buf.sysname, buf.nodename, buf.release, buf.version, 616 buf.machine); 617 php_uname = tmp_uname; 618 } 619#endif /* NETWARE */ 620 } 621#else 622 php_uname = PHP_UNAME; 623#endif 624#endif 625 return estrdup(php_uname); 626} 627/* }}} */ 628 629/* {{{ php_print_info_htmlhead 630 */ 631PHPAPI void php_print_info_htmlhead(TSRMLS_D) 632{ 633 php_info_print("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"DTD/xhtml1-transitional.dtd\">\n"); 634 php_info_print("<html xmlns=\"http://www.w3.org/1999/xhtml\">"); 635 php_info_print("<head>\n"); 636 php_info_print_style(TSRMLS_C); 637 php_info_print("<title>phpinfo()</title>"); 638 php_info_print("<meta name=\"ROBOTS\" content=\"NOINDEX,NOFOLLOW,NOARCHIVE\" />"); 639 php_info_print("</head>\n"); 640 php_info_print("<body><div class=\"center\">\n"); 641} 642/* }}} */ 643 644/* {{{ module_name_cmp */ 645static int module_name_cmp(const void *a, const void *b TSRMLS_DC) 646{ 647 Bucket *f = *((Bucket **) a); 648 Bucket *s = *((Bucket **) b); 649 650 return strcasecmp(((zend_module_entry *)f->pData)->name, 651 ((zend_module_entry *)s->pData)->name); 652} 653/* }}} */ 654 655/* {{{ php_print_info 656 */ 657PHPAPI void php_print_info(int flag TSRMLS_DC) 658{ 659 char **env, *tmp1, *tmp2; 660 char *php_uname; 661 662 if (!sapi_module.phpinfo_as_text) { 663 php_print_info_htmlhead(TSRMLS_C); 664 } else { 665 php_info_print("phpinfo()\n"); 666 } 667 668 if (flag & PHP_INFO_GENERAL) { 669 char *zend_version = get_zend_version(); 670 char temp_api[10]; 671 672 php_uname = php_get_uname('a'); 673 674 if (!sapi_module.phpinfo_as_text) { 675 php_info_print_box_start(1); 676 } 677 678 if (!sapi_module.phpinfo_as_text) { 679 time_t the_time; 680 struct tm *ta, tmbuf; 681 682 the_time = time(NULL); 683 ta = php_localtime_r(&the_time, &tmbuf); 684 685 php_info_print("<a href=\"http://www.php.net/\"><img border=\"0\" src=\""); 686 if (ta && (ta->tm_mon==3) && (ta->tm_mday==1)) { 687 php_info_print(PHP_EGG_LOGO_DATA_URI "\" alt=\"PHP logo\" /></a>"); 688 } else { 689 php_info_print(PHP_LOGO_DATA_URI "\" alt=\"PHP logo\" /></a>"); 690 } 691 } 692 693 if (!sapi_module.phpinfo_as_text) { 694 php_info_printf("<h1 class=\"p\">PHP Version %s</h1>\n", PHP_VERSION); 695 } else { 696 php_info_print_table_row(2, "PHP Version", PHP_VERSION); 697 } 698 php_info_print_box_end(); 699 php_info_print_table_start(); 700 php_info_print_table_row(2, "System", php_uname ); 701 php_info_print_table_row(2, "Build Date", __DATE__ " " __TIME__ ); 702#ifdef COMPILER 703 php_info_print_table_row(2, "Compiler", COMPILER); 704#endif 705#ifdef ARCHITECTURE 706 php_info_print_table_row(2, "Architecture", ARCHITECTURE); 707#endif 708#ifdef CONFIGURE_COMMAND 709 php_info_print_table_row(2, "Configure Command", CONFIGURE_COMMAND ); 710#endif 711 712 if (sapi_module.pretty_name) { 713 php_info_print_table_row(2, "Server API", sapi_module.pretty_name ); 714 } 715 716#ifdef VIRTUAL_DIR 717 php_info_print_table_row(2, "Virtual Directory Support", "enabled" ); 718#else 719 php_info_print_table_row(2, "Virtual Directory Support", "disabled" ); 720#endif 721 722 php_info_print_table_row(2, "Configuration File (php.ini) Path", PHP_CONFIG_FILE_PATH); 723 php_info_print_table_row(2, "Loaded Configuration File", php_ini_opened_path ? php_ini_opened_path : "(none)"); 724 php_info_print_table_row(2, "Scan this dir for additional .ini files", php_ini_scanned_path ? php_ini_scanned_path : "(none)"); 725 php_info_print_table_row(2, "Additional .ini files parsed", php_ini_scanned_files ? php_ini_scanned_files : "(none)"); 726 727 snprintf(temp_api, sizeof(temp_api), "%d", PHP_API_VERSION); 728 php_info_print_table_row(2, "PHP API", temp_api); 729 730 snprintf(temp_api, sizeof(temp_api), "%d", ZEND_MODULE_API_NO); 731 php_info_print_table_row(2, "PHP Extension", temp_api); 732 733 snprintf(temp_api, sizeof(temp_api), "%d", ZEND_EXTENSION_API_NO); 734 php_info_print_table_row(2, "Zend Extension", temp_api); 735 736 php_info_print_table_row(2, "Zend Extension Build", ZEND_EXTENSION_BUILD_ID); 737 php_info_print_table_row(2, "PHP Extension Build", ZEND_MODULE_BUILD_ID); 738 739#if ZEND_DEBUG 740 php_info_print_table_row(2, "Debug Build", "yes" ); 741#else 742 php_info_print_table_row(2, "Debug Build", "no" ); 743#endif 744 745#ifdef ZTS 746 php_info_print_table_row(2, "Thread Safety", "enabled" ); 747#else 748 php_info_print_table_row(2, "Thread Safety", "disabled" ); 749#endif 750 751#ifdef ZEND_SIGNALS 752 php_info_print_table_row(2, "Zend Signal Handling", "enabled" ); 753#else 754 php_info_print_table_row(2, "Zend Signal Handling", "disabled" ); 755#endif 756 757 php_info_print_table_row(2, "Zend Memory Manager", is_zend_mm(TSRMLS_C) ? "enabled" : "disabled" ); 758 759 { 760 const zend_multibyte_functions *functions = zend_multibyte_get_functions(TSRMLS_C); 761 char *descr; 762 if (functions) { 763 spprintf(&descr, 0, "provided by %s", functions->provider_name); 764 } else { 765 descr = estrdup("disabled"); 766 } 767 php_info_print_table_row(2, "Zend Multibyte Support", descr); 768 efree(descr); 769 } 770 771#if HAVE_IPV6 772 php_info_print_table_row(2, "IPv6 Support", "enabled" ); 773#else 774 php_info_print_table_row(2, "IPv6 Support", "disabled" ); 775#endif 776 777#if HAVE_DTRACE 778 php_info_print_table_row(2, "DTrace Support", "enabled" ); 779#else 780 php_info_print_table_row(2, "DTrace Support", "disabled" ); 781#endif 782 783 php_info_print_stream_hash("PHP Streams", php_stream_get_url_stream_wrappers_hash() TSRMLS_CC); 784 php_info_print_stream_hash("Stream Socket Transports", php_stream_xport_get_hash() TSRMLS_CC); 785 php_info_print_stream_hash("Stream Filters", php_get_stream_filters_hash() TSRMLS_CC); 786 787 php_info_print_table_end(); 788 789 /* Zend Engine */ 790 php_info_print_box_start(0); 791 if (!sapi_module.phpinfo_as_text) { 792 php_info_print("<a href=\"http://www.zend.com/\"><img border=\"0\" src=\""); 793 php_info_print(ZEND_LOGO_DATA_URI "\" alt=\"Zend logo\" /></a>\n"); 794 } 795 php_info_print("This program makes use of the Zend Scripting Language Engine:"); 796 php_info_print(!sapi_module.phpinfo_as_text?"<br />":"\n"); 797 if (sapi_module.phpinfo_as_text) { 798 php_info_print(zend_version); 799 } else { 800 zend_html_puts(zend_version, strlen(zend_version) TSRMLS_CC); 801 } 802 php_info_print_box_end(); 803 efree(php_uname); 804 } 805 806 zend_ini_sort_entries(TSRMLS_C); 807 808 if (flag & PHP_INFO_CONFIGURATION) { 809 php_info_print_hr(); 810 if (!sapi_module.phpinfo_as_text) { 811 php_info_print("<h1>Configuration</h1>\n"); 812 } else { 813 SECTION("Configuration"); 814 } 815 if (!(flag & PHP_INFO_MODULES)) { 816 SECTION("PHP Core"); 817 display_ini_entries(NULL); 818 } 819 } 820 821 if (flag & PHP_INFO_MODULES) { 822 HashTable sorted_registry; 823 zend_module_entry tmp; 824 825 zend_hash_init(&sorted_registry, zend_hash_num_elements(&module_registry), NULL, NULL, 1); 826 zend_hash_copy(&sorted_registry, &module_registry, NULL, &tmp, sizeof(zend_module_entry)); 827 zend_hash_sort(&sorted_registry, zend_qsort, module_name_cmp, 0 TSRMLS_CC); 828 829 zend_hash_apply(&sorted_registry, (apply_func_t) _display_module_info_func TSRMLS_CC); 830 831 SECTION("Additional Modules"); 832 php_info_print_table_start(); 833 php_info_print_table_header(1, "Module Name"); 834 zend_hash_apply(&sorted_registry, (apply_func_t) _display_module_info_def TSRMLS_CC); 835 php_info_print_table_end(); 836 837 zend_hash_destroy(&sorted_registry); 838 } 839 840 if (flag & PHP_INFO_ENVIRONMENT) { 841 SECTION("Environment"); 842 php_info_print_table_start(); 843 php_info_print_table_header(2, "Variable", "Value"); 844 for (env=environ; env!=NULL && *env !=NULL; env++) { 845 tmp1 = estrdup(*env); 846 if (!(tmp2=strchr(tmp1,'='))) { /* malformed entry? */ 847 efree(tmp1); 848 continue; 849 } 850 *tmp2 = 0; 851 tmp2++; 852 php_info_print_table_row(2, tmp1, tmp2); 853 efree(tmp1); 854 } 855 php_info_print_table_end(); 856 } 857 858 if (flag & PHP_INFO_VARIABLES) { 859 zval **data; 860 861 SECTION("PHP Variables"); 862 863 php_info_print_table_start(); 864 php_info_print_table_header(2, "Variable", "Value"); 865 if (zend_hash_find(&EG(symbol_table), "PHP_SELF", sizeof("PHP_SELF"), (void **) &data) != FAILURE) { 866 php_info_print_table_row(2, "PHP_SELF", Z_STRVAL_PP(data)); 867 } 868 if (zend_hash_find(&EG(symbol_table), "PHP_AUTH_TYPE", sizeof("PHP_AUTH_TYPE"), (void **) &data) != FAILURE) { 869 php_info_print_table_row(2, "PHP_AUTH_TYPE", Z_STRVAL_PP(data)); 870 } 871 if (zend_hash_find(&EG(symbol_table), "PHP_AUTH_USER", sizeof("PHP_AUTH_USER"), (void **) &data) != FAILURE) { 872 php_info_print_table_row(2, "PHP_AUTH_USER", Z_STRVAL_PP(data)); 873 } 874 if (zend_hash_find(&EG(symbol_table), "PHP_AUTH_PW", sizeof("PHP_AUTH_PW"), (void **) &data) != FAILURE) { 875 php_info_print_table_row(2, "PHP_AUTH_PW", Z_STRVAL_PP(data)); 876 } 877 php_print_gpcse_array(ZEND_STRL("_REQUEST") TSRMLS_CC); 878 php_print_gpcse_array(ZEND_STRL("_GET") TSRMLS_CC); 879 php_print_gpcse_array(ZEND_STRL("_POST") TSRMLS_CC); 880 php_print_gpcse_array(ZEND_STRL("_FILES") TSRMLS_CC); 881 php_print_gpcse_array(ZEND_STRL("_COOKIE") TSRMLS_CC); 882 php_print_gpcse_array(ZEND_STRL("_SERVER") TSRMLS_CC); 883 php_print_gpcse_array(ZEND_STRL("_ENV") TSRMLS_CC); 884 php_info_print_table_end(); 885 } 886 887 888 if ((flag & PHP_INFO_CREDITS) && !sapi_module.phpinfo_as_text) { 889 php_info_print_hr(); 890 php_print_credits(PHP_CREDITS_ALL & ~PHP_CREDITS_FULLPAGE TSRMLS_CC); 891 } 892 893 if (flag & PHP_INFO_LICENSE) { 894 if (!sapi_module.phpinfo_as_text) { 895 SECTION("PHP License"); 896 php_info_print_box_start(0); 897 php_info_print("<p>\n"); 898 php_info_print("This program is free software; you can redistribute it and/or modify "); 899 php_info_print("it under the terms of the PHP License as published by the PHP Group "); 900 php_info_print("and included in the distribution in the file: LICENSE\n"); 901 php_info_print("</p>\n"); 902 php_info_print("<p>"); 903 php_info_print("This program is distributed in the hope that it will be useful, "); 904 php_info_print("but WITHOUT ANY WARRANTY; without even the implied warranty of "); 905 php_info_print("MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"); 906 php_info_print("</p>\n"); 907 php_info_print("<p>"); 908 php_info_print("If you did not receive a copy of the PHP license, or have any questions about "); 909 php_info_print("PHP licensing, please contact license@php.net.\n"); 910 php_info_print("</p>\n"); 911 php_info_print_box_end(); 912 } else { 913 php_info_print("\nPHP License\n"); 914 php_info_print("This program is free software; you can redistribute it and/or modify\n"); 915 php_info_print("it under the terms of the PHP License as published by the PHP Group\n"); 916 php_info_print("and included in the distribution in the file: LICENSE\n"); 917 php_info_print("\n"); 918 php_info_print("This program is distributed in the hope that it will be useful,\n"); 919 php_info_print("but WITHOUT ANY WARRANTY; without even the implied warranty of\n"); 920 php_info_print("MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"); 921 php_info_print("\n"); 922 php_info_print("If you did not receive a copy of the PHP license, or have any\n"); 923 php_info_print("questions about PHP licensing, please contact license@php.net.\n"); 924 } 925 } 926 927 if (!sapi_module.phpinfo_as_text) { 928 php_info_print("</div></body></html>"); 929 } 930} 931/* }}} */ 932 933PHPAPI void php_info_print_table_start(void) /* {{{ */ 934{ 935 if (!sapi_module.phpinfo_as_text) { 936 php_info_print("<table border=\"0\" cellpadding=\"3\" width=\"600\">\n"); 937 } else { 938 php_info_print("\n"); 939 } 940} 941/* }}} */ 942 943PHPAPI void php_info_print_table_end(void) /* {{{ */ 944{ 945 if (!sapi_module.phpinfo_as_text) { 946 php_info_print("</table><br />\n"); 947 } 948 949} 950/* }}} */ 951 952PHPAPI void php_info_print_box_start(int flag) /* {{{ */ 953{ 954 php_info_print_table_start(); 955 if (flag) { 956 if (!sapi_module.phpinfo_as_text) { 957 php_info_print("<tr class=\"h\"><td>\n"); 958 } 959 } else { 960 if (!sapi_module.phpinfo_as_text) { 961 php_info_print("<tr class=\"v\"><td>\n"); 962 } else { 963 php_info_print("\n"); 964 } 965 } 966} 967/* }}} */ 968 969PHPAPI void php_info_print_box_end(void) /* {{{ */ 970{ 971 if (!sapi_module.phpinfo_as_text) { 972 php_info_print("</td></tr>\n"); 973 } 974 php_info_print_table_end(); 975} 976/* }}} */ 977 978PHPAPI void php_info_print_hr(void) /* {{{ */ 979{ 980 if (!sapi_module.phpinfo_as_text) { 981 php_info_print("<hr />\n"); 982 } else { 983 php_info_print("\n\n _______________________________________________________________________\n\n"); 984 } 985} 986/* }}} */ 987 988PHPAPI void php_info_print_table_colspan_header(int num_cols, char *header) /* {{{ */ 989{ 990 int spaces; 991 992 if (!sapi_module.phpinfo_as_text) { 993 php_info_printf("<tr class=\"h\"><th colspan=\"%d\">%s</th></tr>\n", num_cols, header ); 994 } else { 995 spaces = (74 - strlen(header)); 996 php_info_printf("%*s%s%*s\n", (int)(spaces/2), " ", header, (int)(spaces/2), " "); 997 } 998} 999/* }}} */ 1000 1001/* {{{ php_info_print_table_header 1002 */ 1003PHPAPI void php_info_print_table_header(int num_cols, ...) 1004{ 1005 int i; 1006 va_list row_elements; 1007 char *row_element; 1008 1009 va_start(row_elements, num_cols); 1010 if (!sapi_module.phpinfo_as_text) { 1011 php_info_print("<tr class=\"h\">"); 1012 } 1013 for (i=0; i<num_cols; i++) { 1014 row_element = va_arg(row_elements, char *); 1015 if (!row_element || !*row_element) { 1016 row_element = " "; 1017 } 1018 if (!sapi_module.phpinfo_as_text) { 1019 php_info_print("<th>"); 1020 php_info_print(row_element); 1021 php_info_print("</th>"); 1022 } else { 1023 php_info_print(row_element); 1024 if (i < num_cols-1) { 1025 php_info_print(" => "); 1026 } else { 1027 php_info_print("\n"); 1028 } 1029 } 1030 } 1031 if (!sapi_module.phpinfo_as_text) { 1032 php_info_print("</tr>\n"); 1033 } 1034 1035 va_end(row_elements); 1036} 1037/* }}} */ 1038 1039/* {{{ php_info_print_table_row_internal 1040 */ 1041static void php_info_print_table_row_internal(int num_cols, 1042 const char *value_class, va_list row_elements) 1043{ 1044 int i; 1045 char *row_element; 1046 1047 if (!sapi_module.phpinfo_as_text) { 1048 php_info_print("<tr>"); 1049 } 1050 for (i=0; i<num_cols; i++) { 1051 if (!sapi_module.phpinfo_as_text) { 1052 php_info_printf("<td class=\"%s\">", 1053 (i==0 ? "e" : value_class ) 1054 ); 1055 } 1056 row_element = va_arg(row_elements, char *); 1057 if (!row_element || !*row_element) { 1058 if (!sapi_module.phpinfo_as_text) { 1059 php_info_print( "<i>no value</i>" ); 1060 } else { 1061 php_info_print( " " ); 1062 } 1063 } else { 1064 if (!sapi_module.phpinfo_as_text) { 1065 php_info_print_html_esc(row_element, strlen(row_element)); 1066 } else { 1067 php_info_print(row_element); 1068 if (i < num_cols-1) { 1069 php_info_print(" => "); 1070 } 1071 } 1072 } 1073 if (!sapi_module.phpinfo_as_text) { 1074 php_info_print(" </td>"); 1075 } else if (i == (num_cols - 1)) { 1076 php_info_print("\n"); 1077 } 1078 } 1079 if (!sapi_module.phpinfo_as_text) { 1080 php_info_print("</tr>\n"); 1081 } 1082} 1083/* }}} */ 1084 1085/* {{{ php_info_print_table_row 1086 */ 1087PHPAPI void php_info_print_table_row(int num_cols, ...) 1088{ 1089 va_list row_elements; 1090 1091 va_start(row_elements, num_cols); 1092 php_info_print_table_row_internal(num_cols, "v", row_elements); 1093 va_end(row_elements); 1094} 1095/* }}} */ 1096 1097/* {{{ php_info_print_table_row_ex 1098 */ 1099PHPAPI void php_info_print_table_row_ex(int num_cols, const char *value_class, 1100 ...) 1101{ 1102 va_list row_elements; 1103 1104 va_start(row_elements, value_class); 1105 php_info_print_table_row_internal(num_cols, value_class, row_elements); 1106 va_end(row_elements); 1107} 1108/* }}} */ 1109 1110/* {{{ register_phpinfo_constants 1111 */ 1112void register_phpinfo_constants(INIT_FUNC_ARGS) 1113{ 1114 REGISTER_LONG_CONSTANT("INFO_GENERAL", PHP_INFO_GENERAL, CONST_PERSISTENT|CONST_CS); 1115 REGISTER_LONG_CONSTANT("INFO_CREDITS", PHP_INFO_CREDITS, CONST_PERSISTENT|CONST_CS); 1116 REGISTER_LONG_CONSTANT("INFO_CONFIGURATION", PHP_INFO_CONFIGURATION, CONST_PERSISTENT|CONST_CS); 1117 REGISTER_LONG_CONSTANT("INFO_MODULES", PHP_INFO_MODULES, CONST_PERSISTENT|CONST_CS); 1118 REGISTER_LONG_CONSTANT("INFO_ENVIRONMENT", PHP_INFO_ENVIRONMENT, CONST_PERSISTENT|CONST_CS); 1119 REGISTER_LONG_CONSTANT("INFO_VARIABLES", PHP_INFO_VARIABLES, CONST_PERSISTENT|CONST_CS); 1120 REGISTER_LONG_CONSTANT("INFO_LICENSE", PHP_INFO_LICENSE, CONST_PERSISTENT|CONST_CS); 1121 REGISTER_LONG_CONSTANT("INFO_ALL", PHP_INFO_ALL, CONST_PERSISTENT|CONST_CS); 1122 REGISTER_LONG_CONSTANT("CREDITS_GROUP", PHP_CREDITS_GROUP, CONST_PERSISTENT|CONST_CS); 1123 REGISTER_LONG_CONSTANT("CREDITS_GENERAL", PHP_CREDITS_GENERAL, CONST_PERSISTENT|CONST_CS); 1124 REGISTER_LONG_CONSTANT("CREDITS_SAPI", PHP_CREDITS_SAPI, CONST_PERSISTENT|CONST_CS); 1125 REGISTER_LONG_CONSTANT("CREDITS_MODULES", PHP_CREDITS_MODULES, CONST_PERSISTENT|CONST_CS); 1126 REGISTER_LONG_CONSTANT("CREDITS_DOCS", PHP_CREDITS_DOCS, CONST_PERSISTENT|CONST_CS); 1127 REGISTER_LONG_CONSTANT("CREDITS_FULLPAGE", PHP_CREDITS_FULLPAGE, CONST_PERSISTENT|CONST_CS); 1128 REGISTER_LONG_CONSTANT("CREDITS_QA", PHP_CREDITS_QA, CONST_PERSISTENT|CONST_CS); 1129 REGISTER_LONG_CONSTANT("CREDITS_ALL", PHP_CREDITS_ALL, CONST_PERSISTENT|CONST_CS); 1130} 1131/* }}} */ 1132 1133/* {{{ proto void phpinfo([int what]) 1134 Output a page of useful information about PHP and the current request */ 1135PHP_FUNCTION(phpinfo) 1136{ 1137 long flag = PHP_INFO_ALL; 1138 1139 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &flag) == FAILURE) { 1140 return; 1141 } 1142 1143 /* Andale! Andale! Yee-Hah! */ 1144 php_output_start_default(TSRMLS_C); 1145 php_print_info(flag TSRMLS_CC); 1146 php_output_end(TSRMLS_C); 1147 1148 RETURN_TRUE; 1149} 1150 1151/* }}} */ 1152 1153/* {{{ proto string phpversion([string extension]) 1154 Return the current PHP version */ 1155PHP_FUNCTION(phpversion) 1156{ 1157 char *ext_name = NULL; 1158 int ext_name_len = 0; 1159 1160 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &ext_name, &ext_name_len) == FAILURE) { 1161 return; 1162 } 1163 1164 if (!ext_name) { 1165 RETURN_STRING(PHP_VERSION, 1); 1166 } else { 1167 const char *version; 1168 version = zend_get_module_version(ext_name); 1169 if (version == NULL) { 1170 RETURN_FALSE; 1171 } 1172 RETURN_STRING(version, 1); 1173 } 1174} 1175/* }}} */ 1176 1177/* {{{ proto void phpcredits([int flag]) 1178 Prints the list of people who've contributed to the PHP project */ 1179PHP_FUNCTION(phpcredits) 1180{ 1181 long flag = PHP_CREDITS_ALL; 1182 1183 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &flag) == FAILURE) { 1184 return; 1185 } 1186 1187 php_print_credits(flag TSRMLS_CC); 1188 RETURN_TRUE; 1189} 1190/* }}} */ 1191 1192/* {{{ proto string php_sapi_name(void) 1193 Return the current SAPI module name */ 1194PHP_FUNCTION(php_sapi_name) 1195{ 1196 if (zend_parse_parameters_none() == FAILURE) { 1197 return; 1198 } 1199 1200 if (sapi_module.name) { 1201 RETURN_STRING(sapi_module.name, 1); 1202 } else { 1203 RETURN_FALSE; 1204 } 1205} 1206 1207/* }}} */ 1208 1209/* {{{ proto string php_uname(void) 1210 Return information about the system PHP was built on */ 1211PHP_FUNCTION(php_uname) 1212{ 1213 char *mode = "a"; 1214 int modelen = sizeof("a")-1; 1215 1216 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &mode, &modelen) == FAILURE) { 1217 return; 1218 } 1219 RETURN_STRING(php_get_uname(*mode), 0); 1220} 1221 1222/* }}} */ 1223 1224/* {{{ proto string php_ini_scanned_files(void) 1225 Return comma-separated string of .ini files parsed from the additional ini dir */ 1226PHP_FUNCTION(php_ini_scanned_files) 1227{ 1228 if (zend_parse_parameters_none() == FAILURE) { 1229 return; 1230 } 1231 1232 if (strlen(PHP_CONFIG_FILE_SCAN_DIR) && php_ini_scanned_files) { 1233 RETURN_STRING(php_ini_scanned_files, 1); 1234 } else { 1235 RETURN_FALSE; 1236 } 1237} 1238/* }}} */ 1239 1240/* {{{ proto string php_ini_loaded_file(void) 1241 Return the actual loaded ini filename */ 1242PHP_FUNCTION(php_ini_loaded_file) 1243{ 1244 if (zend_parse_parameters_none() == FAILURE) { 1245 return; 1246 } 1247 1248 if (php_ini_opened_path) { 1249 RETURN_STRING(php_ini_opened_path, 1); 1250 } else { 1251 RETURN_FALSE; 1252 } 1253} 1254/* }}} */ 1255 1256/* 1257 * Local variables: 1258 * tab-width: 4 1259 * c-basic-offset: 4 1260 * End: 1261 * vim600: sw=4 ts=4 fdm=marker 1262 * vim<600: sw=4 ts=4 1263 */ 1264