Browse Source

(PHP php_uname) display runtime uname rather than compile-time uname, added

an optional parameter to get single fields (like uname(1))
# Windows version is not tested, and I didn't know how to get
# `uname -n` on Windows, so it's hardcoded to "localhost" for now.
# Windows gurus feel free to fix. :-)
experimental/new_ui_api
Stig Bakken 25 years ago
parent
commit
7f89d8c13a
  1. 86
      ext/standard/info.c

86
ext/standard/info.c

@ -33,6 +33,9 @@
#endif
#include "zend_globals.h" /* needs ELS */
#include "zend_highlight.h"
#ifdef HAVE_SYS_UTSNAME_H
#include <sys/utsname.h>
#endif
#define SECTION(name) PUTS("<h2 align=\"center\">" name "</h2>\n")
@ -119,26 +122,76 @@ void php_info_print_style(void)
/* {{{ php_get_uname
*/
PHPAPI char *php_get_uname()
PHPAPI char *php_get_uname(char mode)
{
char *php_uname;
char tmp_uname[256];
#ifdef PHP_WIN32
char php_windows_uname[256];
DWORD dwBuild=0;
DWORD dwVersion = GetVersion();
DWORD dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
DWORD dwWindowsMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));
/* Get build numbers for Windows NT or Win95 */
if (dwVersion < 0x80000000){
dwBuild = (DWORD)(HIWORD(dwVersion));
snprintf(php_windows_uname, 255, "%s %d.%d build %d", "Windows NT", dwWindowsMajorVersion, dwWindowsMinorVersion, dwBuild);
} else {
snprintf(php_windows_uname, 255, "%s %d.%d", "Windows 95/98", dwWindowsMajorVersion, dwWindowsMinorVersion);
}
php_uname = php_windows_uname;
if (mode == 's') {
if (dwVersion < 0x80000000) {
php_uname = "Windows NT";
} else {
php_uname = "Windows 9x";
}
} else if (mode == 'r') {
snprintf(tmp_uname, sizeof(tmp_uname), "%d.%d",
dwWindowsMajorVersion, dwWindowsMinorVersion);
php_uname = tmp_uname;
} else if (mode == 'n') {
// XXX HOW TO GET THIS ON WINDOWS?
php_uname = "localhost";
} else if (mode == 'v') {
dwBuild = (DWORD)(HIWORD(dwVersion));
snprintf(tmp_uname, sizeof(tmp_uname), "build %d", dwBuild);
php_uname = tmp_uname;
} else if (mode == 'm') {
// XXX HOW TO GET THIS ON WINDOWS?
php_uname = "i386";
} else { // assume mode == 'a'
/* Get build numbers for Windows NT or Win95 */
if (dwVersion < 0x80000000){
dwBuild = (DWORD)(HIWORD(dwVersion));
snprintf(tmp_uname, sizeof(tmp_uname), "%s %s %d.%d build %d",
"Windows NT", "localhost",
dwWindowsMajorVersion, dwWindowsMinorVersion, dwBuild);
} else {
snprintf(tmp_uname, sizeof(tmp_uname), "%s %s %d.%d",
"Windows 9x", "localhost",
dwWindowsMajorVersion, dwWindowsMinorVersion);
}
php_uname = tmp_uname;
}
#else
#ifdef HAVE_SYS_UTSNAME_H
struct utsname buf;
if (uname((struct utsname *)&buf) == -1) {
php_uname = PHP_UNAME;
} else {
if (mode == 's') {
php_uname = buf.sysname;
} else if (mode == 'r') {
php_uname = buf.release;
} else if (mode == 'n') {
php_uname = buf.nodename;
} else if (mode == 'v') {
php_uname = buf.version;
} else if (mode == 'm') {
php_uname = buf.machine;
} else { // assume mode == 'a'
snprintf(tmp_uname, sizeof(tmp_uname), "%s %s %s %s %s",
buf.sysname, buf.nodename, buf.release, buf.version,
buf.machine);
php_uname = tmp_uname;
}
}
#else
php_uname=PHP_UNAME;
php_uname = PHP_UNAME;
#endif
#endif
return estrdup(php_uname);
}
@ -162,7 +215,7 @@ PHPAPI void php_print_info(int flag TSRMLS_DC)
if (flag & PHP_INFO_GENERAL) {
char *zend_version = get_zend_version();
php_uname = php_get_uname();
php_uname = php_get_uname('a');
PUTS("<head>");
php_info_print_style();
PUTS("<title>phpinfo()</title></head><body>");
@ -573,11 +626,12 @@ PHP_FUNCTION(php_sapi_name)
Return information about the system PHP was built on */
PHP_FUNCTION(php_uname)
{
if (ZEND_NUM_ARGS() != 0) {
WRONG_PARAM_COUNT;
char *mode = "a";
int modelen;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &mode, &modelen) == FAILURE) {
return;
}
RETURN_STRING(php_get_uname(), 0);
RETURN_STRING(php_get_uname(*mode), 0);
}
/* }}} */

Loading…
Cancel
Save