source: src/router/php7/ext/standard/info.c @ 31879

Last change on this file since 31879 was 31879, checked in by brainslayer, 6 weeks ago

update php

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