From: Pierre Joye Date: Fri, 16 Jan 2009 00:57:05 +0000 (+0000) Subject: - add EG(windows_version_info), set at init time once per instance X-Git-Tag: php-5.3.0beta1~141 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2f61ad9b9805bedf6be4e8a38b525684e4699c8c;p=php - 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) - add the ability to disable a function when the windows function does not support a feature (for example symlink) - symlink, hardlink & co support (1/2) --- diff --git a/main/main.c b/main/main.c index a1cd4ca0e7..a7e0c8d6be 100644 --- a/main/main.c +++ b/main/main.c @@ -99,6 +99,33 @@ php_core_globals core_globals; 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 @@ -1677,6 +1704,9 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod #ifdef ZTS zend_executor_globals *executor_globals; void ***tsrm_ls; +#ifdef PHP_WIN32 + DWORD dwVersion = GetVersion(); +#endif php_core_globals *core_globals; #endif @@ -1685,16 +1715,12 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod 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); @@ -1752,6 +1778,18 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod #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; @@ -1927,6 +1965,11 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod module->info_func = PHP_MINFO(php_core); } +#ifdef PHP_WIN32 + /* Disable incompatible functions for the running platform */ + php_win32_disable_functions(); +#endif + #ifdef ZTS zend_post_startup(TSRMLS_C); #endif diff --git a/main/win32_internal_function_disabled.h b/main/win32_internal_function_disabled.h new file mode 100644 index 0000000000..af8e54a1a3 --- /dev/null +++ b/main/win32_internal_function_disabled.h @@ -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 | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: Pierre A. Joye | + +----------------------------------------------------------------------+ + */ + +/* $Id$ */ + +/* 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;