pajoye          Fri Jan 16 10:02:50 2009 UTC

  Modified files:              
    /php-src/main       win32_internal_function_disabled.h main.c 
  Log:
  MFB: 
   - add EG(windows_version_info), set at init time once per instance
     contains a OSVERSIONINFOEX struct. It lets us determine easily on which 
windows version is used (for example)
   - [DOC] add the ability to disable a function when the windows function does 
not support a feature (for example symlink)
   - [DOC] symlink, hardlink & co support (1/3)
  
http://cvs.php.net/viewvc.cgi/php-src/main/win32_internal_function_disabled.h?r1=1.1&r2=1.2&diff_format=u
Index: php-src/main/win32_internal_function_disabled.h
diff -u /dev/null php-src/main/win32_internal_function_disabled.h:1.2
--- /dev/null   Fri Jan 16 10:02:50 2009
+++ php-src/main/win32_internal_function_disabled.h     Fri Jan 16 10:02:50 2009
@@ -0,0 +1,25 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 5                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2009 The PHP Group                                |
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 3.01 of the PHP license,      |
+   | that is bundled with this package in the file LICENSE, and is        |
+   | available through the world-wide-web at the following url:           |
+   | http://www.php.net/license/3_01.txt                                  |
+   | If you did not receive a copy of the PHP license and are unable to   |
+   | obtain it through the world-wide-web, please send a note to          |
+   | lice...@php.net so we can mail you a copy immediately.               |
+   +----------------------------------------------------------------------+
+   | Author: Pierre A. Joye <pie...@php.net>                              |
+   +----------------------------------------------------------------------+
+ */
+
+/* $Id: win32_internal_function_disabled.h,v 1.2 2009/01/16 10:02:50 pajoye 
Exp $ */
+
+/* 5 means the min version is 5 (XP/2000), 6 (2k8/vista), etc. */
+static const char *function_name_5[] = {"link", NULL};
+const int function_name_cnt_5 = 1;
+static const char *function_name_6[] = {"readlink", "symlink", NULL};
+const int function_name_cnt_6 = 2;
http://cvs.php.net/viewvc.cgi/php-src/main/main.c?r1=1.788&r2=1.789&diff_format=u
Index: php-src/main/main.c
diff -u php-src/main/main.c:1.788 php-src/main/main.c:1.789
--- php-src/main/main.c:1.788   Fri Jan  9 15:00:36 2009
+++ php-src/main/main.c Fri Jan 16 10:02:50 2009
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: main.c,v 1.788 2009/01/09 15:00:36 iliaa Exp $ */
+/* $Id: main.c,v 1.789 2009/01/16 10:02:50 pajoye Exp $ */
 
 /* {{{ includes
  */
@@ -99,6 +99,33 @@
 PHPAPI int core_globals_id;
 #endif
 
+#ifdef PHP_WIN32
+#include "win32_internal_function_disabled.h"
+
+static php_win32_disable_functions() {
+       int i;
+       TSRMLS_FETCH();
+
+       if (EG(windows_version_info).dwMajorVersion < 5) {
+               for (i = 0; i < function_name_cnt_5; i++) {
+                       if (zend_hash_del(CG(function_table), 
function_name_5[i], strlen(function_name_5[i]) + 1)==FAILURE) {
+                               php_printf("Unable to disable function '%s'\n", 
function_name_5[i]);
+                               return FAILURE;
+                       }
+               }
+       }
+
+       if (EG(windows_version_info).dwMajorVersion < 6) {
+               for (i = 0; i < function_name_cnt_6; i++) {
+                       if (zend_hash_del(CG(function_table), 
function_name_6[i], strlen(function_name_6[i]) + 1)==FAILURE) {
+                               php_printf("Unable to disable function '%s'\n", 
function_name_6[i]);
+                               return FAILURE;
+                       }
+               }
+       }
+}
+#endif
+
 #define SAFE_FILENAME(f) ((f)?(f):"-")
 
 /* {{{ PHP_INI_MH
@@ -1788,6 +1815,9 @@
 #ifdef ZTS
        zend_executor_globals *executor_globals;
        void ***tsrm_ls;
+#ifdef PHP_WIN32
+       DWORD dwVersion = GetVersion();
+#endif
 
        php_core_globals *core_globals;
 #endif
@@ -1796,16 +1826,12 @@
        WSADATA wsaData;
 #endif
 #ifdef PHP_WIN32
-       {
-               DWORD dwVersion = GetVersion();
-
                /* Get build numbers for Windows NT or Win95 */
                if (dwVersion < 0x80000000){
                        php_os="WINNT";
                } else {
                        php_os="WIN32";
                }
-       }
 #if defined(_MSC_VER) && (_MSC_VER >= 1400)
        old_invalid_parameter_handler =
                _set_invalid_parameter_handler(dummy_invalid_parameter_handler);
@@ -1862,6 +1888,18 @@
 #endif
        gc_globals_ctor(TSRMLS_C);
 
+#ifdef PHP_WIN32
+       {
+               OSVERSIONINFOEX *osvi = &EG(windows_version_info);
+
+               ZeroMemory(osvi, sizeof(OSVERSIONINFOEX));
+               osvi->dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
+               if( !GetVersionEx((OSVERSIONINFO *) osvi)) {
+                       php_printf("\nGetVersionEx unusable. %d\n", 
GetLastError());
+                       return FAILURE;
+               }
+       }
+#endif
        EG(bailout) = NULL;
        EG(error_reporting) = E_ALL & ~E_NOTICE;
 
@@ -2050,6 +2088,10 @@
                module->info_func = PHP_MINFO(php_core);
        }
 
+#ifdef PHP_WIN32
+       /* Disable incompatible functions for the running platform */
+       php_win32_disable_functions();
+#endif
        zend_post_startup(TSRMLS_C);
 
        module_initialized = 1;


Reply via email to