From 96bc547ca269b434cf306fa2a95641f51418bf33 Mon Sep 17 00:00:00 2001 From: Pierre Joye Date: Fri, 16 Jan 2009 10:02:50 +0000 Subject: [PATCH] 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) --- main/main.c | 50 +++++++++++++++++++++++-- main/win32_internal_function_disabled.h | 25 +++++++++++++ 2 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 main/win32_internal_function_disabled.h diff --git a/main/main.c b/main/main.c index 97750a29ad..2ad7d9e01a 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 @@ -1788,6 +1815,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 @@ -1796,16 +1826,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); @@ -1862,6 +1888,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; @@ -2050,6 +2088,10 @@ 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 zend_post_startup(TSRMLS_C); module_initialized = 1; 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; -- 2.50.1