]> granicus.if.org Git - php/commitdiff
(PHP php_uname) display runtime uname rather than compile-time uname, added
authorStig Bakken <ssb@php.net>
Fri, 29 Mar 2002 10:19:23 +0000 (10:19 +0000)
committerStig Bakken <ssb@php.net>
Fri, 29 Mar 2002 10:19:23 +0000 (10:19 +0000)
                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. :-)

ext/standard/info.c

index ac0d5560e6e6f7c0212629835d061d43d23d41ab..24ab23357ed7bbdce1300405199abcfc1a35f2a1 100644 (file)
@@ -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);
 }
 
 /* }}} */