diff options
Diffstat (limited to 'win32')
42 files changed, 206 insertions, 886 deletions
diff --git a/win32/build/Makefile b/win32/build/Makefile index 9435df5c46..a5a4259d17 100644 --- a/win32/build/Makefile +++ b/win32/build/Makefile @@ -1,6 +1,4 @@ # +----------------------------------------------------------------------+ -# | PHP Version 7 | -# +----------------------------------------------------------------------+ # | Copyright (c) The PHP Group | # +----------------------------------------------------------------------+ # | This source file is subject to version 3.01 of the PHP license, | @@ -77,16 +75,16 @@ $(BUILD_DIR)\$(PHPDLL).def: $(PHP_DLL_DEF_SOURCES) type $(PHP_DLL_DEF_SOURCES) > $(BUILD_DIR)\$(PHPDLL).def Zend\zend_ini_parser.c Zend\zend_ini_parser.h: Zend\zend_ini_parser.y - $(BISON) --output=Zend/zend_ini_parser.c -v -d -p ini_ Zend/zend_ini_parser.y + $(BISON) --output=Zend/zend_ini_parser.c -v -d Zend/zend_ini_parser.y Zend\zend_language_parser.c Zend\zend_language_parser.h: Zend\zend_language_parser.y - $(BISON) --output=Zend/zend_language_parser.c -v -d -p zend Zend/zend_language_parser.y + $(BISON) --output=Zend/zend_language_parser.c -v -d Zend/zend_language_parser.y @if "$(SED)" neq "" $(SED) -i "s,^int zendparse\(.*\),ZEND_API int zendparse\1,g" Zend/zend_language_parser.c @if "$(SED)" neq "" $(SED) -i "s,^int zendparse\(.*\),ZEND_API int zendparse\1,g" Zend/zend_language_parser.h @if "$(SED)" neq "" $(SED) -i "s,^#ifndef YYTOKENTYPE,#include \"zend.h\"\n#ifndef YYTOKENTYPE,g" Zend/zend_language_parser.h sapi\phpdbg\phpdbg_parser.c sapi\phpdbg\phpdbg_parser.h: sapi\phpdbg\phpdbg_parser.y - $(BISON) --output=sapi/phpdbg/phpdbg_parser.c -v -d -p phpdbg_ sapi/phpdbg/phpdbg_parser.y + $(BISON) --output=sapi/phpdbg/phpdbg_parser.c -v -d sapi/phpdbg/phpdbg_parser.y !if $(RE2C) != "" Zend\zend_ini_scanner.c: Zend\zend_ini_scanner.l @@ -239,6 +237,7 @@ build-devel: build-headers build-lib @if not exist $(BUILD_DIR_DEV)\script mkdir $(BUILD_DIR_DEV)\script >nul @if not exist $(BUILD_DIR_DEV)\build mkdir $(BUILD_DIR_DEV)\build >nul @copy run-tests.php $(BUILD_DIR_DEV)\script\ /y >nul + @copy build\gen_stub.php $(BUILD_DIR_DEV)\build\ /y >nul @copy win32\build\confutils.js $(BUILD_DIR_DEV)\script\ /y >nul @copy win32\build\configure.tail $(BUILD_DIR_DEV)\script\ /y >nul @copy win32\build\config.w32.phpize.in $(BUILD_DIR_DEV)\script\ /y >nul diff --git a/win32/build/buildconf.js b/win32/build/buildconf.js index 5a45e481fc..a758c65d40 100644 --- a/win32/build/buildconf.js +++ b/win32/build/buildconf.js @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | diff --git a/win32/build/config.w32 b/win32/build/config.w32 index fcb98704f4..a7d60812bd 100644 --- a/win32/build/config.w32 +++ b/win32/build/config.w32 @@ -231,13 +231,13 @@ ADD_SOURCES("Zend", "zend_language_parser.c zend_language_scanner.c \ zend_execute_API.c zend_highlight.c \ zend_llist.c zend_vm_opcodes.c zend_opcode.c zend_operators.c zend_ptr_stack.c \ zend_stack.c zend_variables.c zend.c zend_API.c zend_extensions.c \ - zend_hash.c zend_list.c zend_builtin_functions.c \ + zend_hash.c zend_list.c zend_builtin_functions.c zend_attributes.c \ zend_ini.c zend_sort.c zend_multibyte.c zend_ts_hash.c \ zend_stream.c zend_iterators.c zend_interfaces.c zend_objects.c \ zend_object_handlers.c zend_objects_API.c \ zend_default_classes.c zend_execute.c zend_strtod.c zend_gc.c zend_closures.c zend_weakrefs.c \ zend_float.c zend_string.c zend_generators.c zend_virtual_cwd.c zend_ast.c \ - zend_inheritance.c zend_smart_str.c zend_cpuinfo.c"); + zend_inheritance.c zend_smart_str.c zend_cpuinfo.c zend_observer.c zend_system_id.c"); ADD_FLAG("CFLAGS_BD_ZEND", "/D ZEND_ENABLE_STATIC_TSRMLS_CACHE=1"); if (VS_TOOLSET && VCVERS >= 1914) { @@ -249,7 +249,7 @@ if (VS_TOOLSET && VCVERS >= 1914) { ADD_SOURCES("main", "main.c snprintf.c spprintf.c getopt.c fopen_wrappers.c \ php_scandir.c php_ini.c SAPI.c rfc1867.c php_content_types.c strlcpy.c \ - strlcat.c mergesort.c reentrancy.c php_variables.c php_ticks.c network.c \ + strlcat.c reentrancy.c php_variables.c php_ticks.c network.c \ php_open_temporary_file.c output.c internal_functions.c \ php_syslog.c"); ADD_FLAG("CFLAGS_BD_MAIN", "/D ZEND_ENABLE_STATIC_TSRMLS_CACHE=1"); @@ -290,10 +290,9 @@ if (PHP_IPV6 == "yes") { } if (main_network_has_ipv6) { STDOUT.WriteLine("Enabling IPv6 support"); + AC_DEFINE('HAVE_GAI_STRERROR', 1); + AC_DEFINE('HAVE_IPV6', 1); } -AC_DEFINE('HAVE_GETADDRINFO', main_network_has_ipv6); -AC_DEFINE('HAVE_GAI_STRERROR', main_network_has_ipv6); -AC_DEFINE('HAVE_IPV6', main_network_has_ipv6); /* this allows up to 256 sockets to be select()ed in a single * call to select(), instead of the usual 64 */ diff --git a/win32/build/config.w32.h.in b/win32/build/config.w32.h.in index 5c093f5f86..ce4b71282e 100644 --- a/win32/build/config.w32.h.in +++ b/win32/build/config.w32.h.in @@ -44,7 +44,6 @@ /* its in win32/time.c */ #define HAVE_USLEEP 1 #define HAVE_NANOSLEEP 1 -#define PHP_SLEEP_NON_VOID 1 #define HAVE_GETCWD 1 #define NEED_ISBLANK 1 @@ -67,7 +66,6 @@ #define HAVE_GETLOGIN 1 #define HAVE_MEMMOVE 1 #define HAVE_REGCOMP 1 -#define HAVE_LOCALE_H 1 #define HAVE_SHUTDOWN 1 #define HAVE_STRCASECMP 1 #define HAVE_UTIME 1 @@ -119,12 +117,6 @@ #define HAVE_INET_PTON 1 #define HAVE_INET_NTOP 1 -#define HAVE_MBLEN - -#undef HAVE_ATOF_ACCEPTS_NAN -#undef HAVE_ATOF_ACCEPTS_INF -#define HAVE_HUGE_VAL_NAN 0 - /* vs.net 2005 has a 64-bit time_t. This will likely break * 3rdParty libs that were built with older compilers; switch * back to 32-bit */ @@ -133,10 +125,6 @@ #endif #define _REENTRANT 1 -#define HAVE_MBRLEN 1 -#define HAVE_MBSTATE_T 1 - -#define HAVE_HUGE_VAL_INF 1 #define HAVE_GETRUSAGE @@ -147,3 +135,5 @@ #ifdef __clang__ #define HAVE_FUNC_ATTRIBUTE_TARGET 1 #endif + +#define HAVE_GETADDRINFO 1 diff --git a/win32/build/confutils.js b/win32/build/confutils.js index 68894fa076..bf88cdae44 100644 --- a/win32/build/confutils.js +++ b/win32/build/confutils.js @@ -1,8 +1,6 @@ // Utils for configure script /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | @@ -96,11 +94,11 @@ if (typeof(CWD) == "undefined") { if (!MODE_PHPIZE) { /* defaults; we pick up the precise versions from configure.ac */ - var PHP_VERSION = 7; - var PHP_MINOR_VERSION = 4; + var PHP_VERSION = 8; + var PHP_MINOR_VERSION = 0; var PHP_RELEASE_VERSION = 0; var PHP_EXTRA_VERSION = ""; - var PHP_VERSION_STRING = "7.4.0"; + var PHP_VERSION_STRING = "8.0.0"; } /* Get version numbers and DEFINE as a string */ @@ -130,6 +128,17 @@ build_dirs = new Array(); extension_include_code = ""; extension_module_ptrs = ""; +(function () { + var wmiservice = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2"); + var oss = wmiservice.ExecQuery("Select * from Win32_OperatingSystem"); + var os = oss.ItemIndex(0); + AC_DEFINE("PHP_BUILD_SYSTEM", os.Caption + " [" + os.Version + "]", "Windows build system version"); + var build_provider = WshShell.Environment("Process").Item("PHP_BUILD_PROVIDER"); + if (build_provider) { + AC_DEFINE("PHP_BUILD_PROVIDER", build_provider); + } +}()); + if (!MODE_PHPIZE) { get_version_numbers(); } @@ -441,12 +450,13 @@ can be built that way. \ } var snapshot_build_exclusions = new Array( - 'debug', 'crt-debug', 'lzf-better-compression', + 'debug', 'lzf-better-compression', 'php-build', 'snapshot-template', 'ereg', 'pcre-regex', 'fastcgi', 'force-cgi-redirect', 'path-info-check', 'zts', 'ipv6', 'memory-limit', 'zend-multibyte', 'fd-setsize', 'memory-manager', - 'pgi', 'pgo', 'all-shared', 'config-profile' + 'pgi', 'pgo', 'all-shared', 'config-profile', + 'sanitizer' ); var force; @@ -2018,9 +2028,6 @@ function generate_tmp_php_ini() var directive = (extensions_enabled[i][2] ? 'zend_extension' : 'extension'); var ext_name = extensions_enabled[i][0]; - if ("gd" == ext_name) { - ext_name = "gd2"; - } if (!is_on_exclude_list_for_test_ini(ext_list, ext_name)) { INI.WriteLine(directive + "=php_" + ext_name + ".dll"); @@ -2304,19 +2311,6 @@ function generate_config_h() outfile.WriteLine("#define " + keys[i] + " " + pieces); } - if (VS_TOOLSET) { - if (VCVERS >= 1800) { - outfile.WriteLine(""); - outfile.WriteLine("#define HAVE_ACOSH 1"); - outfile.WriteLine("#define HAVE_ASINH 1"); - outfile.WriteLine("#define HAVE_ATANH 1"); - } - if (VCVERS >= 1900) { - outfile.WriteLine("#define HAVE_LOG1P 1"); - } - } - - outfile.Close(); } @@ -2345,7 +2339,7 @@ function generate_phpize() MF.WriteLine("var PHP_EXTRA_VERSION=\"" + PHP_EXTRA_VERSION + "\""); MF.WriteLine("var PHP_VERSION_STRING=\"" + PHP_VERSION_STRING + "\""); MF.WriteBlankLines(1); - MF.WriteLine("/* Genereted extensions list with mode (static/shared) */"); + MF.WriteLine("/* Generated extensions list with mode (static/shared) */"); var count = extensions_enabled.length; for (i in extensions_enabled) { @@ -2356,7 +2350,7 @@ function generate_phpize() } MF.WriteBlankLines(2); - MF.WriteLine("/* Genereted win32/build/phpize.js.in */"); + MF.WriteLine("/* Generated win32/build/phpize.js.in */"); MF.WriteBlankLines(1); MF.Write(file_get_contents("win32/build/phpize.js.in")); MF.Close(); @@ -2440,7 +2434,7 @@ function handle_analyzer_makefile_flags(fd, key, val) { var relevant = false; - /* VS integrates /analyze with the bulid process, + /* VS integrates /analyze with the build process, no further action is required. */ if ("no" == PHP_ANALYZER || "vs" == PHP_ANALYZER) { return; @@ -3106,8 +3100,8 @@ function toolset_get_compiler_name(short) return name; } if (version >= 1920) { /* NOTE - VS is intentional. Due to changes in recent Visual Studio - versioning scheme refering to the exact VC++ version is - hardly predictable. From this version on, it refers to + versioning scheme referring to the exact VC++ version is + hardly predictable. From this version on, it refers to Visual Studio version and implies the default toolset. When new versions are introduced, adapt also checks in php_win32_image_compatible(), if needed. */ @@ -3225,7 +3219,7 @@ function toolset_setup_common_cflags() // General CFLAGS for building objects DEFINE("CFLAGS", "/nologo $(BASE_INCLUDES) /D _WINDOWS /D WINDOWS=1 \ - /D ZEND_WIN32=1 /D PHP_WIN32=1 /D WIN32 /D _MBCS /W3 \ + /D ZEND_WIN32=1 /D PHP_WIN32=1 /D WIN32 /D _MBCS \ /D _USE_MATH_DEFINES"); if (envCFLAGS) { @@ -3411,13 +3405,13 @@ function toolset_setup_common_ldlags() function toolset_setup_common_libs() { // urlmon.lib ole32.lib oleaut32.lib uuid.lib gdi32.lib winspool.lib comdlg32.lib - DEFINE("LIBS", "kernel32.lib ole32.lib user32.lib advapi32.lib shell32.lib ws2_32.lib Dnsapi.lib psapi.lib bcrypt.lib imagehlp.lib"); + DEFINE("LIBS", "kernel32.lib ole32.lib user32.lib advapi32.lib shell32.lib ws2_32.lib Dnsapi.lib psapi.lib bcrypt.lib"); } function toolset_setup_build_mode() { if (PHP_DEBUG == "yes") { - ADD_FLAG("CFLAGS", "/LDd /MDd /W3 /Od /D _DEBUG /D ZEND_DEBUG=1 " + + ADD_FLAG("CFLAGS", "/LDd /MDd /Od /D _DEBUG /D ZEND_DEBUG=1 " + (X64?"/Zi":"/ZI")); ADD_FLAG("LDFLAGS", "/debug"); // Avoid problems when linking to release libraries that use the release @@ -3429,7 +3423,7 @@ function toolset_setup_build_mode() ADD_FLAG("CFLAGS", "/Zi"); ADD_FLAG("LDFLAGS", "/incremental:no /debug /opt:ref,icf"); } - ADD_FLAG("CFLAGS", "/LD /MD /W3"); + ADD_FLAG("CFLAGS", "/LD /MD"); if (PHP_SANITIZER == "yes" && CLANG_TOOLSET) { ADD_FLAG("CFLAGS", "/Od /D NDebug /D NDEBUG /D ZEND_WIN32_NEVER_INLINE /D ZEND_DEBUG=0"); } else { @@ -3673,7 +3667,7 @@ function get_clang_lib_dir() if (COMPILER_NAME_LONG.match(/clang version ([\d\.]+) \((.*)\)/)) { ver = RegExp.$1; } else { - ERROR("Faled to determine clang lib path"); + ERROR("Failed to determine clang lib path"); } if (X64) { @@ -3706,7 +3700,7 @@ function add_asan_opts(cflags_name, libs_name, ldflags_name) if (COMPILER_NAME_LONG.match(/clang version ([\d\.]+) \((.*)\)/)) { ver = RegExp.$1; } else { - ERROR("Faled to determine clang lib path"); + ERROR("Failed to determine clang lib path"); } if (!!cflags_name) { diff --git a/win32/build/deplister.c b/win32/build/deplister.c index b5dd059c98..1a53056219 100644 --- a/win32/build/deplister.c +++ b/win32/build/deplister.c @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | @@ -24,8 +22,8 @@ #include <imagehlp.h> BOOL CALLBACK StatusRoutine(IMAGEHLP_STATUS_REASON reason, - PSTR image_name, PSTR dll_name, - ULONG va, ULONG param) + PCSTR image_name, PCSTR dll_name, + ULONG_PTR va, ULONG_PTR param) { switch (reason) { case BindImportModuleFailed: diff --git a/win32/build/mkdist.php b/win32/build/mkdist.php index 84b69970a4..8ae3926b65 100644 --- a/win32/build/mkdist.php +++ b/win32/build/mkdist.php @@ -284,7 +284,7 @@ Build: $build_dir EOT ); -/* list build-in extensions */ +/* list built-in extensions */ $exts = get_loaded_extensions(); fprintf($fp, "\r\nBuilt-in Extensions\r\n"); fwrite($fp, "===========================\r\n"); @@ -335,9 +335,13 @@ libenchant_ispell.dll $ENCHANT_DLLS = array( array('', 'glib-2.dll'), array('', 'gmodule-2.dll'), - array('lib/enchant', 'libenchant_myspell.dll'), - array('lib/enchant', 'libenchant_ispell.dll'), ); +if (file_exists("$php_build_dir/bin/libenchant2.dll")) { + $ENCHANT_DLLS[] = array('lib/enchant', 'libenchant2_hunspell.dll'); +} else { + $ENCHANT_DLLS[] = array('lib/enchant', 'libenchant_myspell.dll'); + $ENCHANT_DLLS[] = array('lib/enchant', 'libenchant_ispell.dll'); +} foreach ($ENCHANT_DLLS as $dll) { $dest = "$dist_dir/$dll[0]"; $filename = $dll[1]; @@ -496,7 +500,7 @@ $dirs = array( foreach ($dirs as $dir) { copy_test_dir($dir, $test_dir); } -copy('run-tests.php', $test_dir . '/run-test.php'); +copy('run-tests.php', $test_dir . '/run-tests.php'); /* change this next line to true to use good-old * hand-assembled go-pear-bundle from the snapshot template */ diff --git a/win32/build/phpize.js.in b/win32/build/phpize.js.in index b15e29282e..40308f5fc7 100644 --- a/win32/build/phpize.js.in +++ b/win32/build/phpize.js.in @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | diff --git a/win32/codepage.c b/win32/codepage.c index 0543a057a5..6c00c532ec 100644 --- a/win32/codepage.c +++ b/win32/codepage.c @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | @@ -179,16 +177,12 @@ PW32CP wchar_t *php_win32_cp_conv_ascii_to_w(const char* in, size_t in_len, size while (end - idx > 15) { const __m128i block = _mm_load_si128((__m128i *)idx); - { - const __m128i lo = _mm_unpacklo_epi8(block, mask); - _mm_storeu_si128((__m128i *)ret_idx, lo); - } + const __m128i lo = _mm_unpacklo_epi8(block, mask); + _mm_storeu_si128((__m128i *)ret_idx, lo); ret_idx += 8; - { - const __m128i hi = _mm_unpackhi_epi8(block, mask); - _mm_storeu_si128((__m128i *)ret_idx, hi); - } + const __m128i hi = _mm_unpackhi_epi8(block, mask); + _mm_storeu_si128((__m128i *)ret_idx, hi); idx += 16; ret_idx += 8; @@ -561,20 +555,19 @@ PW32CP const struct php_win32_cp *php_win32_cp_cli_do_restore(DWORD id) /* Userspace functions, see basic_functions.* for arginfo and decls. */ -/* {{{ proto bool sapi_windows_cp_set(int cp) - * Set process codepage. */ +/* {{{ Set process codepage. */ PHP_FUNCTION(sapi_windows_cp_set) { zend_long id; const struct php_win32_cp *cp; if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &id) == FAILURE) { - return; + RETURN_THROWS(); } if (ZEND_LONG_UINT_OVFL(id)) { - php_error_docref(NULL, E_WARNING, "Argument %d is out of range", id); - RETURN_FALSE; + zend_argument_value_error(1, "must be between 0 and %u", UINT_MAX); + RETURN_THROWS(); } if (php_win32_console_is_cli_sapi()) { @@ -591,15 +584,14 @@ PHP_FUNCTION(sapi_windows_cp_set) } /* }}} */ -/* {{{ proto int sapi_windows_cp_get([string kind]) - * Get process codepage. */ +/* {{{ Get process codepage. */ PHP_FUNCTION(sapi_windows_cp_get) { char *kind; size_t kind_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &kind, &kind_len) == FAILURE) { - return; + RETURN_THROWS(); } if (kind_len == sizeof("ansi")-1 && !strncasecmp(kind, "ansi", kind_len)) { @@ -614,84 +606,80 @@ PHP_FUNCTION(sapi_windows_cp_get) /* }}} */ -/* {{{ proto bool sapi_windows_cp_is_utf8(void) - * Indicates whether the codepage is UTF-8 compatible. */ +/* {{{ Indicates whether the codepage is UTF-8 compatible. */ PHP_FUNCTION(sapi_windows_cp_is_utf8) { if (zend_parse_parameters_none() == FAILURE) { - return; + RETURN_THROWS(); } RETURN_BOOL(php_win32_cp_use_unicode()); } /* }}} */ -/* {{{ proto string sapi_windows_cp_conv(int|string in_codepage, int|string out_codepage, string subject) - * Convert string from one codepage to another. */ +/* {{{ Convert string from one codepage to another. */ PHP_FUNCTION(sapi_windows_cp_conv) { - char *subj, *ret; - size_t subj_len, ret_len, tmpw_len; + char *ret; + size_t ret_len, tmpw_len; wchar_t *tmpw; const struct php_win32_cp *in_cp, *out_cp; - zval *z_in_cp, *z_out_cp; + zend_string *string_in_codepage = NULL; + zend_long int_in_codepage = 0; + zend_string *string_out_codepage = NULL; + zend_long int_out_codepage = 0; + zend_string *subject; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "zzs", &z_in_cp, &z_out_cp, &subj, &subj_len) == FAILURE) { - return; - } + ZEND_PARSE_PARAMETERS_START(3, 3) + Z_PARAM_STR_OR_LONG(string_in_codepage, int_in_codepage) + Z_PARAM_STR_OR_LONG(string_out_codepage, int_out_codepage) + Z_PARAM_STR(subject) + ZEND_PARSE_PARAMETERS_END(); - if (ZEND_SIZE_T_INT_OVFL(subj_len)) { - php_error_docref(NULL, E_WARNING, "String is too long"); - RETURN_NULL(); + if (ZEND_SIZE_T_INT_OVFL(ZSTR_LEN(subject))) { + zend_argument_value_error(1, "is too long"); + RETURN_THROWS(); } - if (IS_LONG == Z_TYPE_P(z_in_cp)) { - if (ZEND_LONG_UINT_OVFL(Z_LVAL_P(z_in_cp))) { - php_error_docref(NULL, E_WARNING, "Argument %d is out of range", Z_LVAL_P(z_in_cp)); - RETURN_NULL(); - } - - in_cp = php_win32_cp_get_by_id((DWORD)Z_LVAL_P(z_in_cp)); + if (string_in_codepage != NULL) { + in_cp = php_win32_cp_get_by_enc(ZSTR_VAL(string_in_codepage)); if (!in_cp) { - php_error_docref(NULL, E_WARNING, "Invalid codepage %d", Z_LVAL_P(z_in_cp)); - RETURN_NULL(); + zend_argument_value_error(1, "must be a valid charset"); + RETURN_THROWS(); } } else { - if (!try_convert_to_string(z_in_cp)) { - return; + if (ZEND_LONG_UINT_OVFL(int_in_codepage)) { + zend_argument_value_error(1, "must be between 0 and %u", UINT_MAX); + RETURN_THROWS(); } - in_cp = php_win32_cp_get_by_enc(Z_STRVAL_P(z_in_cp)); + in_cp = php_win32_cp_get_by_id((DWORD)int_in_codepage); if (!in_cp) { - php_error_docref(NULL, E_WARNING, "Invalid charset %s", Z_STRVAL_P(z_in_cp)); - RETURN_NULL(); + zend_argument_value_error(1, "must be a valid codepage"); + RETURN_THROWS(); } } - if (IS_LONG == Z_TYPE_P(z_out_cp)) { - if (ZEND_LONG_UINT_OVFL(Z_LVAL_P(z_out_cp))) { - php_error_docref(NULL, E_WARNING, "Argument %d is out of range", Z_LVAL_P(z_out_cp)); - RETURN_NULL(); - } - - out_cp = php_win32_cp_get_by_id((DWORD)Z_LVAL_P(z_out_cp)); + if (string_out_codepage != NULL) { + out_cp = php_win32_cp_get_by_enc(ZSTR_VAL(string_out_codepage)); if (!out_cp) { - php_error_docref(NULL, E_WARNING, "Invalid codepage %d", Z_LVAL_P(z_out_cp)); - RETURN_NULL(); + zend_argument_value_error(2, "must be a valid charset"); + RETURN_THROWS(); } } else { - if (!try_convert_to_string(z_out_cp)) { - return; + if (ZEND_LONG_UINT_OVFL(int_out_codepage)) { + zend_argument_value_error(2, "must be between 0 and %u", UINT_MAX); + RETURN_THROWS(); } - out_cp = php_win32_cp_get_by_enc(Z_STRVAL_P(z_out_cp)); + out_cp = php_win32_cp_get_by_id((DWORD)int_out_codepage); if (!out_cp) { - php_error_docref(NULL, E_WARNING, "Invalid charset %s", Z_STRVAL_P(z_out_cp)); - RETURN_NULL(); + zend_argument_value_error(2, "must be a valid codepage"); + RETURN_THROWS(); } } - tmpw = php_win32_cp_conv_to_w(in_cp->id, in_cp->to_w_fl, subj, subj_len, &tmpw_len); + tmpw = php_win32_cp_conv_to_w(in_cp->id, in_cp->to_w_fl, ZSTR_VAL(subject), ZSTR_LEN(subject), &tmpw_len); if (!tmpw) { php_error_docref(NULL, E_WARNING, "Wide char conversion failed"); RETURN_NULL(); diff --git a/win32/codepage.h b/win32/codepage.h index 0dd72562b6..8f8fbcbaa1 100644 --- a/win32/codepage.h +++ b/win32/codepage.h @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | diff --git a/win32/console.c b/win32/console.c index 0b1bb0eff9..7833dd97d3 100644 --- a/win32/console.c +++ b/win32/console.c @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | diff --git a/win32/console.h b/win32/console.h index 2d36d85508..47336a0a7b 100644 --- a/win32/console.h +++ b/win32/console.h @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | diff --git a/win32/dllmain.c b/win32/dllmain.c index 4743f732e9..7850a79699 100644 --- a/win32/dllmain.c +++ b/win32/dllmain.c @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | diff --git a/win32/ftok.c b/win32/ftok.c index db789f8b70..3e379e82ef 100644 --- a/win32/ftok.c +++ b/win32/ftok.c @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | diff --git a/win32/getrusage.c b/win32/getrusage.c index de67f7f8d2..c956613c69 100644 --- a/win32/getrusage.c +++ b/win32/getrusage.c @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | diff --git a/win32/getrusage.h b/win32/getrusage.h index c41c026aa2..c5a95c436b 100644 --- a/win32/getrusage.h +++ b/win32/getrusage.h @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | diff --git a/win32/globals.c b/win32/globals.c index 9bb392f42a..e9ba61761a 100644 --- a/win32/globals.c +++ b/win32/globals.c @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | diff --git a/win32/grp.h b/win32/grp.h deleted file mode 100644 index 301babed4e..0000000000 --- a/win32/grp.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ - | Copyright (c) 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: Sterling Hughes <sterling@php.net> | - +----------------------------------------------------------------------+ -*/ - -#ifndef PHP_WIN32_GRP_H -#define PHP_WIN32_GRP_H - -struct group { - char *gr_name; - char *gr_passwd; - int gr_gid; - char **gr_mem; -}; - -#endif diff --git a/win32/inet.c b/win32/inet.c index 7361b89bc2..4a835ca7a3 100644 --- a/win32/inet.c +++ b/win32/inet.c @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | diff --git a/win32/inet.h b/win32/inet.h index b57d78903d..06b646bd57 100644 --- a/win32/inet.h +++ b/win32/inet.h @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | diff --git a/win32/ioutil.c b/win32/ioutil.c index 48e65d918f..dad7d81cb6 100644 --- a/win32/ioutil.c +++ b/win32/ioutil.c @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | @@ -862,7 +860,6 @@ static int php_win32_ioutil_fstat_int(HANDLE h, php_win32_ioutil_stat_t *buf, co BY_HANDLE_FILE_INFORMATION d; PBY_HANDLE_FILE_INFORMATION data; LARGE_INTEGER t; - wchar_t mypath[MAXPATHLEN]; uint8_t is_dir; data = !dp ? &d : dp; diff --git a/win32/ioutil.h b/win32/ioutil.h index 05ed3621d2..97fa6116fb 100644 --- a/win32/ioutil.h +++ b/win32/ioutil.h @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | @@ -632,7 +630,6 @@ __forceinline static int php_win32_ioutil_link(const char *target, const char *l return ret; }/*}}}*/ -#define HAVE_REALPATH 1 PW32IO char *realpath(const char *path, char *resolved); __forceinline static char *php_win32_ioutil_realpath_ex0(const char *path, char *resolved, PBY_HANDLE_FILE_INFORMATION info) diff --git a/win32/ipc.h b/win32/ipc.h index c7cb476353..bbefb48703 100644 --- a/win32/ipc.h +++ b/win32/ipc.h @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | diff --git a/win32/nice.c b/win32/nice.c index 05aae465ed..4b2d388362 100644 --- a/win32/nice.c +++ b/win32/nice.c @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | @@ -56,7 +54,7 @@ * . PROCESS_MODE_BACKGROUND_BEGIN * . PROCESS_MODE_BACKGROUND_END * Process mode is not covered because it can easily forgotten to be changed - * back and can cause unforseen side effects that is hard to debug. Besides + * back and can cause unforeseen side effects that is hard to debug. Besides * that, these do generally not really fit into making a Windows somewhat * compatible nice() function. */ diff --git a/win32/nice.h b/win32/nice.h index 385855c2ea..dc082035d9 100644 --- a/win32/nice.h +++ b/win32/nice.h @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | diff --git a/win32/php_inttypes.h b/win32/php_inttypes.h deleted file mode 100644 index 20e9c9b775..0000000000 --- a/win32/php_inttypes.h +++ /dev/null @@ -1,313 +0,0 @@ -// ISO C9x compliant inttypes.h for Microsoft Visual Studio -// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 -// -// Copyright (c) 2006 Alexander Chemeris -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. The name of the author may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef _MSC_VER // [ -#error "Use this header only with Microsoft Visual C++ compilers!" -#endif // _MSC_VER ] - -// Starting with vc14, many of the C11 features are now included, so we only -// need many of these typedefs and defines for older VS suites -#if _MSC_VER < 1900 - -#ifndef _MSC_INTTYPES_H_ // [ -#define _MSC_INTTYPES_H_ - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include "stdint.h" - -// 7.8 Format conversion of integer types - -typedef struct { - intmax_t quot; - intmax_t rem; -} imaxdiv_t; - -// 7.8.1 Macros for format specifiers - -#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198 - -// The fprintf macros for signed integers are: -#define PRId8 "d" -#define PRIi8 "i" -#define PRIdLEAST8 "d" -#define PRIiLEAST8 "i" -#define PRIdFAST8 "d" -#define PRIiFAST8 "i" - -#define PRId16 "hd" -#define PRIi16 "hi" -#define PRIdLEAST16 "hd" -#define PRIiLEAST16 "hi" -#define PRIdFAST16 "hd" -#define PRIiFAST16 "hi" - -#define PRId32 "I32d" -#define PRIi32 "I32i" -#define PRIdLEAST32 "I32d" -#define PRIiLEAST32 "I32i" -#define PRIdFAST32 "I32d" -#define PRIiFAST32 "I32i" - -#define PRId64 "I64d" -#define PRIi64 "I64i" -#define PRIdLEAST64 "I64d" -#define PRIiLEAST64 "I64i" -#define PRIdFAST64 "I64d" -#define PRIiFAST64 "I64i" - -#define PRIdMAX "I64d" -#define PRIiMAX "I64i" - -#define PRIdPTR "Id" -#define PRIiPTR "Ii" - -// The fprintf macros for unsigned integers are: -#define PRIo8 "o" -#define PRIu8 "u" -#define PRIx8 "x" -#define PRIX8 "X" -#define PRIoLEAST8 "o" -#define PRIuLEAST8 "u" -#define PRIxLEAST8 "x" -#define PRIXLEAST8 "X" -#define PRIoFAST8 "o" -#define PRIuFAST8 "u" -#define PRIxFAST8 "x" -#define PRIXFAST8 "X" - -#define PRIo16 "ho" -#define PRIu16 "hu" -#define PRIx16 "hx" -#define PRIX16 "hX" -#define PRIoLEAST16 "ho" -#define PRIuLEAST16 "hu" -#define PRIxLEAST16 "hx" -#define PRIXLEAST16 "hX" -#define PRIoFAST16 "ho" -#define PRIuFAST16 "hu" -#define PRIxFAST16 "hx" -#define PRIXFAST16 "hX" - -#define PRIo32 "I32o" -#define PRIu32 "I32u" -#define PRIx32 "I32x" -#define PRIX32 "I32X" -#define PRIoLEAST32 "I32o" -#define PRIuLEAST32 "I32u" -#define PRIxLEAST32 "I32x" -#define PRIXLEAST32 "I32X" -#define PRIoFAST32 "I32o" -#define PRIuFAST32 "I32u" -#define PRIxFAST32 "I32x" -#define PRIXFAST32 "I32X" - -#define PRIo64 "I64o" -#define PRIu64 "I64u" -#define PRIx64 "I64x" -#define PRIX64 "I64X" -#define PRIoLEAST64 "I64o" -#define PRIuLEAST64 "I64u" -#define PRIxLEAST64 "I64x" -#define PRIXLEAST64 "I64X" -#define PRIoFAST64 "I64o" -#define PRIuFAST64 "I64u" -#define PRIxFAST64 "I64x" -#define PRIXFAST64 "I64X" - -#define PRIoMAX "I64o" -#define PRIuMAX "I64u" -#define PRIxMAX "I64x" -#define PRIXMAX "I64X" - -#define PRIoPTR "Io" -#define PRIuPTR "Iu" -#define PRIxPTR "Ix" -#define PRIXPTR "IX" - -// The fscanf macros for signed integers are: -#define SCNd8 "d" -#define SCNi8 "i" -#define SCNdLEAST8 "d" -#define SCNiLEAST8 "i" -#define SCNdFAST8 "d" -#define SCNiFAST8 "i" - -#define SCNd16 "hd" -#define SCNi16 "hi" -#define SCNdLEAST16 "hd" -#define SCNiLEAST16 "hi" -#define SCNdFAST16 "hd" -#define SCNiFAST16 "hi" - -#define SCNd32 "ld" -#define SCNi32 "li" -#define SCNdLEAST32 "ld" -#define SCNiLEAST32 "li" -#define SCNdFAST32 "ld" -#define SCNiFAST32 "li" - -#define SCNd64 "I64d" -#define SCNi64 "I64i" -#define SCNdLEAST64 "I64d" -#define SCNiLEAST64 "I64i" -#define SCNdFAST64 "I64d" -#define SCNiFAST64 "I64i" - -#define SCNdMAX "I64d" -#define SCNiMAX "I64i" - -#ifdef _WIN64 // [ -# define SCNdPTR "I64d" -# define SCNiPTR "I64i" -#else // _WIN64 ][ -# define SCNdPTR "ld" -# define SCNiPTR "li" -#endif // _WIN64 ] - -// The fscanf macros for unsigned integers are: -#define SCNo8 "o" -#define SCNu8 "u" -#define SCNx8 "x" -#define SCNX8 "X" -#define SCNoLEAST8 "o" -#define SCNuLEAST8 "u" -#define SCNxLEAST8 "x" -#define SCNXLEAST8 "X" -#define SCNoFAST8 "o" -#define SCNuFAST8 "u" -#define SCNxFAST8 "x" -#define SCNXFAST8 "X" - -#define SCNo16 "ho" -#define SCNu16 "hu" -#define SCNx16 "hx" -#define SCNX16 "hX" -#define SCNoLEAST16 "ho" -#define SCNuLEAST16 "hu" -#define SCNxLEAST16 "hx" -#define SCNXLEAST16 "hX" -#define SCNoFAST16 "ho" -#define SCNuFAST16 "hu" -#define SCNxFAST16 "hx" -#define SCNXFAST16 "hX" - -#define SCNo32 "lo" -#define SCNu32 "lu" -#define SCNx32 "lx" -#define SCNX32 "lX" -#define SCNoLEAST32 "lo" -#define SCNuLEAST32 "lu" -#define SCNxLEAST32 "lx" -#define SCNXLEAST32 "lX" -#define SCNoFAST32 "lo" -#define SCNuFAST32 "lu" -#define SCNxFAST32 "lx" -#define SCNXFAST32 "lX" - -#define SCNo64 "I64o" -#define SCNu64 "I64u" -#define SCNx64 "I64x" -#define SCNX64 "I64X" -#define SCNoLEAST64 "I64o" -#define SCNuLEAST64 "I64u" -#define SCNxLEAST64 "I64x" -#define SCNXLEAST64 "I64X" -#define SCNoFAST64 "I64o" -#define SCNuFAST64 "I64u" -#define SCNxFAST64 "I64x" -#define SCNXFAST64 "I64X" - -#define SCNoMAX "I64o" -#define SCNuMAX "I64u" -#define SCNxMAX "I64x" -#define SCNXMAX "I64X" - -#ifdef _WIN64 // [ -# define SCNoPTR "I64o" -# define SCNuPTR "I64u" -# define SCNxPTR "I64x" -# define SCNXPTR "I64X" -#else // _WIN64 ][ -# define SCNoPTR "lo" -# define SCNuPTR "lu" -# define SCNxPTR "lx" -# define SCNXPTR "lX" -#endif // _WIN64 ] - -#endif // __STDC_FORMAT_MACROS ] - -// 7.8.2 Functions for greatest-width integer types - -// 7.8.2.1 The imaxabs function -#define imaxabs _abs64 - -// 7.8.2.2 The imaxdiv function - -// This is modified version of div() function from Microsoft's div.c found -// in %MSVC.NET%\crt\src\div.c -#ifdef STATIC_IMAXDIV // [ -static -#else // STATIC_IMAXDIV ][ -_inline -#endif // STATIC_IMAXDIV ] -imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) -{ - imaxdiv_t result; - - result.quot = numer / denom; - result.rem = numer % denom; - - if (numer < 0 && result.rem > 0) { - // did division wrong; must fix up - ++result.quot; - result.rem -= denom; - } - - return result; -} - -// 7.8.2.3 The strtoimax and strtoumax functions -#define strtoimax _strtoi64 -#define strtoumax _strtoui64 - -// 7.8.2.4 The wcstoimax and wcstoumax functions -#define wcstoimax _wcstoi64 -#define wcstoumax _wcstoui64 - - -#endif // _MSC_INTTYPES_H_ ] - -#else -#include <inttypes.h> -#endif diff --git a/win32/php_registry.h b/win32/php_registry.h index f46c482085..9effd01d4e 100644 --- a/win32/php_registry.h +++ b/win32/php_registry.h @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | diff --git a/win32/php_stdint.h b/win32/php_stdint.h deleted file mode 100644 index e7615f1479..0000000000 --- a/win32/php_stdint.h +++ /dev/null @@ -1,265 +0,0 @@ -// ISO C9x compliant stdint.h for Microsoft Visual Studio -// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 -// -// Copyright (c) 2006-2009 Alexander Chemeris -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. The name of the author may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef _MSC_VER // [ -#error "Use this header only with Microsoft Visual C++ compilers!" -#endif // _MSC_VER ] - -// Starting with vc14, many of the C11 features are now included, so we only -// need many of these typedefs and defines for older VS suites -#if _MSC_VER < 1900 - -#ifndef _MSC_STDINT_H_ // [ -#define _MSC_STDINT_H_ - -#ifndef _STDINT -# define _STDINT -#endif - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include <limits.h> - -// For Visual Studio 6 in C++ mode wrap <wchar.h> include with 'extern "C++" {}' -// or compiler give many errors like this: -// error C2733: second C linkage of overloaded function 'wmemchr' not allowed -#if (_MSC_VER < 1300) && defined(__cplusplus) - extern "C++" { -#endif -# include <wchar.h> -#if (_MSC_VER < 1300) && defined(__cplusplus) - } -#endif - -// Define _W64 macros to mark types changing their size, like intptr_t. -#ifndef _W64 -# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 -# define _W64 __w64 -# else -# define _W64 -# endif -#endif - - -// 7.18.1 Integer types - -// 7.18.1.1 Exact-width integer types -#ifndef int8_t -typedef __int8 int8_t; -#endif -#ifndef int16_t -typedef __int16 int16_t; -#endif -#ifndef int32_t -typedef __int32 int32_t; -#endif -#ifndef int64_t -typedef __int64 int64_t; -#endif -#ifndef uint8_t -typedef unsigned __int8 uint8_t; -#endif -typedef unsigned __int16 uint16_t; -#ifndef uint32_t -typedef unsigned __int32 uint32_t; -#endif -typedef unsigned __int64 uint64_t; - -// 7.18.1.2 Minimum-width integer types -typedef int8_t int_least8_t; -typedef int16_t int_least16_t; -typedef int32_t int_least32_t; -typedef int64_t int_least64_t; -typedef uint8_t uint_least8_t; -typedef uint16_t uint_least16_t; -typedef uint32_t uint_least32_t; -typedef uint64_t uint_least64_t; - -// 7.18.1.3 Fastest minimum-width integer types -typedef int8_t int_fast8_t; -typedef int16_t int_fast16_t; -typedef int32_t int_fast32_t; -typedef int64_t int_fast64_t; -typedef uint8_t uint_fast8_t; -typedef uint16_t uint_fast16_t; -typedef uint32_t uint_fast32_t; -typedef uint32_t u_int32_t; -typedef uint64_t uint_fast64_t; - -// 7.18.1.4 Integer types capable of holding object pointers -/* intptr_t and uintptr_t are available from stddef.h */ -#include <stddef.h> - -// 7.18.1.5 Greatest-width integer types -typedef int64_t intmax_t; -typedef uint64_t uintmax_t; - - -// 7.18.2 Limits of specified-width integer types - -#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 - -// 7.18.2.1 Limits of exact-width integer types -#if _MSC_VER >= 1700 && !defined(_INTSAFE_H_INCLUDED_) -#define INT8_MIN ((int8_t)_I8_MIN) -#define INT8_MAX _I8_MAX -#define INT16_MIN ((int16_t)_I16_MIN) -#define INT16_MAX _I16_MAX -#define INT32_MIN ((int32_t)_I32_MIN) -#define INT32_MAX _I32_MAX -#define INT64_MIN ((int64_t)_I64_MIN) -#define INT64_MAX _I64_MAX -#define UINT8_MAX _UI8_MAX -#define UINT16_MAX _UI16_MAX -#define UINT32_MAX _UI32_MAX -#define UINT64_MAX _UI64_MAX -#endif - -// 7.18.2.2 Limits of minimum-width integer types -#define INT_LEAST8_MIN INT8_MIN -#define INT_LEAST8_MAX INT8_MAX -#define INT_LEAST16_MIN INT16_MIN -#define INT_LEAST16_MAX INT16_MAX -#define INT_LEAST32_MIN INT32_MIN -#define INT_LEAST32_MAX INT32_MAX -#define INT_LEAST64_MIN INT64_MIN -#define INT_LEAST64_MAX INT64_MAX -#define UINT_LEAST8_MAX UINT8_MAX -#define UINT_LEAST16_MAX UINT16_MAX -#define UINT_LEAST32_MAX UINT32_MAX -#define UINT_LEAST64_MAX UINT64_MAX - -// 7.18.2.3 Limits of fastest minimum-width integer types -#define INT_FAST8_MIN INT8_MIN -#define INT_FAST8_MAX INT8_MAX -#define INT_FAST16_MIN INT16_MIN -#define INT_FAST16_MAX INT16_MAX -#define INT_FAST32_MIN INT32_MIN -#define INT_FAST32_MAX INT32_MAX -#define INT_FAST64_MIN INT64_MIN -#define INT_FAST64_MAX INT64_MAX -#define UINT_FAST8_MAX UINT8_MAX -#define UINT_FAST16_MAX UINT16_MAX -#define UINT_FAST32_MAX UINT32_MAX -#define UINT_FAST64_MAX UINT64_MAX - -// 7.18.2.4 Limits of integer types capable of holding object pointers -#ifdef _WIN64 // [ -# define INTPTR_MIN INT64_MIN -# define INTPTR_MAX INT64_MAX -# define UINTPTR_MAX UINT64_MAX -#else // _WIN64 ][ -# define INTPTR_MIN INT32_MIN -# define INTPTR_MAX INT32_MAX -# define UINTPTR_MAX UINT32_MAX -#endif // _WIN64 ] - -// 7.18.2.5 Limits of greatest-width integer types -#define INTMAX_MIN INT64_MIN -#define INTMAX_MAX INT64_MAX -#define UINTMAX_MAX UINT64_MAX - -// 7.18.3 Limits of other integer types - -#ifdef _WIN64 // [ -# define PTRDIFF_MIN _I64_MIN -# define PTRDIFF_MAX _I64_MAX -#else // _WIN64 ][ -# define PTRDIFF_MIN _I32_MIN -# define PTRDIFF_MAX _I32_MAX -#endif // _WIN64 ] - -#define SIG_ATOMIC_MIN INT_MIN -#define SIG_ATOMIC_MAX INT_MAX - -#ifndef SIZE_MAX // [ -# ifdef _WIN64 // [ -# define SIZE_MAX _UI64_MAX -# else // _WIN64 ][ -# define SIZE_MAX _UI32_MAX -# endif // _WIN64 ] -#endif // SIZE_MAX ] - -// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h> -#ifndef WCHAR_MIN // [ -# define WCHAR_MIN 0 -#endif // WCHAR_MIN ] -#ifndef WCHAR_MAX // [ -# define WCHAR_MAX _UI16_MAX -#endif // WCHAR_MAX ] - -#define WINT_MIN 0 -#define WINT_MAX _UI16_MAX - -#endif // __STDC_LIMIT_MACROS ] - - -// 7.18.4 Limits of other integer types - -#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 - -// 7.18.4.1 Macros for minimum-width integer constants - -#define INT8_C(val) val##i8 -#define INT16_C(val) val##i16 -#define INT32_C(val) val##i32 -#define INT64_C(val) val##i64 - -#define UINT8_C(val) val##ui8 -#define UINT16_C(val) val##ui16 -#define UINT32_C(val) val##ui32 -#define UINT64_C(val) val##ui64 - -// 7.18.4.2 Macros for greatest-width integer constants -#define INTMAX_C INT64_C -#define UINTMAX_C UINT64_C - -#if _MSC_VER < 1600 -static __inline int64_t llabs(int64_t i) -{ - return i >= 0 ? i: -i; -} -#endif - -#endif // __STDC_CONSTANT_MACROS ] - - -#endif // _MSC_STDINT_H_ ] - -#else -#include <stdint.h> -#endif - -#ifndef u_char -typedef unsigned __int8 u_char; -#endif diff --git a/win32/php_win32_globals.h b/win32/php_win32_globals.h index bb91f08c50..05da08104b 100644 --- a/win32/php_win32_globals.h +++ b/win32/php_win32_globals.h @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | diff --git a/win32/readdir.c b/win32/readdir.c index c172f16fc2..efa7bd5966 100644 --- a/win32/readdir.c +++ b/win32/readdir.c @@ -1,8 +1,9 @@ +#include "php.h" + #include <malloc.h> #include <string.h> #include <errno.h> -#include "php.h" #include "readdir.h" #include "win32/ioutil.h" diff --git a/win32/readdir.h b/win32/readdir.h index 61876f3dc1..cc8e1a9a25 100644 --- a/win32/readdir.h +++ b/win32/readdir.h @@ -26,7 +26,7 @@ struct dirent { /* typedef DIR - not the same as Unix */ struct DIR_W32 { HANDLE handle; /* _findfirst/_findnext handle */ - uint16_t offset; /* offset into directory */ + uint32_t offset; /* offset into directory */ uint8_t finished; /* 1 if there are not more files */ WIN32_FIND_DATAW fileinfo; /* from _findfirst/_findnext */ wchar_t *dirw; /* the dir we are reading */ diff --git a/win32/registry.c b/win32/registry.c index 99c3ce365f..09d9c98868 100644 --- a/win32/registry.c +++ b/win32/registry.c @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | diff --git a/win32/select.c b/win32/select.c index b02766e4f3..865c3e44b9 100644 --- a/win32/select.c +++ b/win32/select.c @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | diff --git a/win32/select.h b/win32/select.h index c23eb87ddb..f6f9af99c1 100644 --- a/win32/select.h +++ b/win32/select.h @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | diff --git a/win32/sendmail.c b/win32/sendmail.c index 9e31028d58..3d73ef9b5b 100644 --- a/win32/sendmail.c +++ b/win32/sendmail.c @@ -1,7 +1,7 @@ /* * PHP Sendmail for Windows. * - * This file is rewritten specificly for PHPFI. Some functionality + * This file is rewritten specifically for PHPFI. Some functionality * has been removed (MIME and file attachments). This code was * modified from code based on code written by Jarle Aase. * @@ -91,7 +91,7 @@ static char *ErrorMessages[] = }; /* This pattern converts all single occurrences of \n (Unix) - * withour a leading \r to \r\n and all occurrences of \r (Mac) + * without a leading \r to \r\n and all occurrences of \r (Mac) * without a trailing \n to \r\n * Thx to Nibbler from ircnet/#linuxger */ @@ -114,7 +114,7 @@ static char *ErrorMessages[] = /* This function is meant to unify the headers passed to to mail() * This means, use PCRE to transform single occurrences of \n or \r in \r\n - * As a second step we also eleminate all \r\n occurrences which are: + * As a second step we also eliminate all \r\n occurrences which are: * 1) At the start of the header * 2) At the end of the header * 3) Two or more occurrences in the header are removed so only one is left @@ -122,7 +122,7 @@ static char *ErrorMessages[] = * Returns NULL on error, or the new char* buffer on success. * You have to take care and efree() the buffer on your own. */ -static zend_string *php_win32_mail_trim_header(char *header) +static zend_string *php_win32_mail_trim_header(const char *header) { zend_string *result, *result2; zend_string *replace; @@ -176,14 +176,14 @@ static zend_string *php_win32_mail_trim_header(char *header) // // See SendText() for additional args! //********************************************************************/ -PHPAPI int TSendMail(char *host, int *error, char **error_message, - char *headers, char *Subject, char *mailTo, char *data, +PHPAPI int TSendMail(const char *host, int *error, char **error_message, + const char *headers, const char *Subject, const char *mailTo, const char *data, char *mailCc, char *mailBcc, char *mailRPath) { int ret; char *RPath = NULL; zend_string *headers_lc = NULL, *headers_trim = NULL; /* headers_lc is only created if we've a header at all */ - char *pos1 = NULL, *pos2 = NULL; + const char *pos1 = NULL, *pos2 = NULL; if (host == NULL) { *error = BAD_MAIL_HOST; @@ -216,7 +216,7 @@ PHPAPI int TSendMail(char *host, int *error, char **error_message, RPath = estrdup(INI_STR("sendmail_from")); } else if (headers_lc) { int found = 0; - char *lookup = ZSTR_VAL(headers_lc); + const char *lookup = ZSTR_VAL(headers_lc); while (lookup) { pos1 = strstr(lookup, "from:"); @@ -270,7 +270,7 @@ PHPAPI int TSendMail(char *host, int *error, char **error_message, /* 128 is safe here, the specifier in snprintf isn't longer than that */ *error_message = ecalloc(1, HOST_NAME_LEN + 128); snprintf(*error_message, HOST_NAME_LEN + 128, - "Failed to connect to mailserver at \"%s\" port %d, verify your \"SMTP\" " + "Failed to connect to mailserver at \"%s\" port " ZEND_ULONG_FMT ", verify your \"SMTP\" " "and \"smtp_port\" setting in php.ini or use ini_set()", PW32G(mail_host), !INI_INT("smtp_port") ? 25 : INI_INT("smtp_port")); return FAILURE; @@ -300,7 +300,7 @@ PHPAPI int TSendMail(char *host, int *error, char **error_message, // Author/Date: jcar 20/9/96 // History: //********************************************************************/ -PHPAPI void TSMClose() +PHPAPI void TSMClose(void) { Post("QUIT\r\n"); Ack(NULL); @@ -352,12 +352,13 @@ PHPAPI char *GetSMErrorText(int index) // Author/Date: jcar 20/9/96 // History: //*******************************************************************/ -static int SendText(char *RPath, char *Subject, char *mailTo, char *mailCc, char *mailBcc, char *data, - char *headers, char *headers_lc, char **error_message) +static int SendText(char *RPath, const char *Subject, const char *mailTo, char *mailCc, char *mailBcc, const char *data, + const char *headers, char *headers_lc, char **error_message) { int res; char *p; - char *tempMailTo, *token, *pos1, *pos2; + char *tempMailTo, *token; + const char *pos1, *pos2; char *server_response = NULL; char *stripped_header = NULL; zend_string *data_cln; @@ -633,7 +634,7 @@ static int SendText(char *RPath, char *Subject, char *mailTo, char *mailCc, char return (SUCCESS); } -static int addToHeader(char **header_buffer, const char *specifier, char *string) +static int addToHeader(char **header_buffer, const char *specifier, const char *string) { *header_buffer = erealloc(*header_buffer, strlen(*header_buffer) + strlen(specifier) + strlen(string) + 1); sprintf(*header_buffer + strlen(*header_buffer), specifier, string); @@ -651,7 +652,7 @@ static int addToHeader(char **header_buffer, const char *specifier, char *string // Author/Date: jcar 20/9/96 // History: //********************************************************************/ -static int PostHeader(char *RPath, char *Subject, char *mailTo, char *xheaders) +static int PostHeader(char *RPath, const char *Subject, const char *mailTo, char *xheaders) { /* Print message header according to RFC 822 */ /* Return-path, Received, Date, From, Subject, Sender, To, cc */ @@ -887,7 +888,7 @@ again: /* Check for newline */ Index += rlen; - /* SMPT RFC says \r\n is the only valid line ending, who are we to argue ;) + /* SMTP RFC says \r\n is the only valid line ending, who are we to argue ;) * The response code must contain at least 5 characters ex. 220\r\n */ if (Received < 5 || buf[Received - 1] != '\n' || buf[Received - 2] != '\r') { goto again; @@ -958,7 +959,7 @@ static unsigned long GetAddr(LPSTR szHost) // Name: int FormatEmailAddress // Input: // Output: -// Description: Formats the email address to remove any content ouside +// Description: Formats the email address to remove any content outside // of the angle brackets < > as per RFC 2821. // // Returns the invalidly formatted mail address if the < > are diff --git a/win32/sendmail.h b/win32/sendmail.h index bb502cb7dd..486482c0c0 100644 --- a/win32/sendmail.h +++ b/win32/sendmail.h @@ -32,16 +32,16 @@ #define MAX_ERROR_INDEX 22 /* Always last error message + 1 */ -PHPAPI int TSendMail(char *smtpaddr, int *returnerror, char **error_message, - char *RPath, char *Subject, char *mailTo, char *data, +PHPAPI int TSendMail(const char *host, int *error, char **error_message, + const char *headers, const char *Subject, const char *mailTo, const char *data, char *mailCc, char *mailBcc, char *mailRPath); PHPAPI void TSMClose(void); -static int SendText(char *RPath, char *Subject, char *mailTo, char *mailCc, char *mailBcc, char *data, - char *headers, char *headers_lc, char **error_message); +static int SendText(char *RPath, const char *Subject, const char *mailTo, char *mailCc, char *mailBcc, const char *data, + const char *headers, char *headers_lc, char **error_message); PHPAPI char *GetSMErrorText(int index); static int MailConnect(); -static int PostHeader(char *RPath, char *Subject, char *mailTo, char *xheaders); +static int PostHeader(char *RPath, const char *Subject, const char *mailTo, char *xheaders); static int Post(LPCSTR msg); static int Ack(char **server_response); static unsigned long GetAddr(LPSTR szHost); diff --git a/win32/signal.c b/win32/signal.c index bdfd7033f3..23a5acbff9 100644 --- a/win32/signal.c +++ b/win32/signal.c @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | @@ -86,31 +84,33 @@ static BOOL WINAPI php_win32_signal_system_ctrl_handler(DWORD evt) return TRUE; }/*}}}*/ -/* {{{ proto bool sapi_windows_set_ctrl_handler(callable handler, [, bool add = true]) - Assigns a CTRL signal handler to a PHP function */ +/* {{{ Assigns a CTRL signal handler to a PHP function */ PHP_FUNCTION(sapi_windows_set_ctrl_handler) { - zval *handler = NULL; + zend_fcall_info fci; + zend_fcall_info_cache fcc; zend_bool add = 1; + + /* callable argument corresponds to the CTRL handler */ + if (zend_parse_parameters(ZEND_NUM_ARGS(), "f!|b", &fci, &fcc, &add) == FAILURE) { + RETURN_THROWS(); + } + #if ZTS if (!tsrm_is_main_thread()) { - php_error_docref(NULL, E_WARNING, "CTRL events can only be received on the main thread"); - return; + zend_throw_error(NULL, "CTRL events can only be received on the main thread"); + RETURN_THROWS(); } #endif if (!php_win32_console_is_cli_sapi()) { - php_error_docref(NULL, E_WARNING, "CTRL events trapping is only supported on console"); - return; - } - - if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|b", &handler, &add) == FAILURE) { - return; + zend_throw_error(NULL, "CTRL events trapping is only supported on console"); + RETURN_THROWS(); } - if (IS_NULL == Z_TYPE_P(handler)) { - zval_dtor(&ctrl_handler); + if (!ZEND_FCI_INITIALIZED(fci)) { + zval_ptr_dtor(&ctrl_handler); ZVAL_UNDEF(&ctrl_handler); if (!SetConsoleCtrlHandler(NULL, add)) { RETURN_FALSE; @@ -118,22 +118,15 @@ PHP_FUNCTION(sapi_windows_set_ctrl_handler) RETURN_TRUE; } - if (!zend_is_callable(handler, 0, NULL)) { - zend_string *func_name = zend_get_callable_name(handler); - php_error_docref(NULL, E_WARNING, "%s is not a callable function name error", ZSTR_VAL(func_name)); - zend_string_release_ex(func_name, 0); - RETURN_FALSE; - } - if (!SetConsoleCtrlHandler(NULL, FALSE) || !SetConsoleCtrlHandler(php_win32_signal_system_ctrl_handler, add)) { - zend_string *func_name = zend_get_callable_name(handler); + zend_string *func_name = zend_get_callable_name(&fci.function_name); php_error_docref(NULL, E_WARNING, "Unable to attach %s as a CTRL handler", ZSTR_VAL(func_name)); zend_string_release_ex(func_name, 0); RETURN_FALSE; } - zval_dtor(&ctrl_handler); - ZVAL_COPY(&ctrl_handler, handler); + zval_ptr_dtor_nogc(&ctrl_handler); + ZVAL_COPY(&ctrl_handler, &fci.function_name); RETURN_TRUE; }/*}}}*/ @@ -143,12 +136,12 @@ PHP_FUNCTION(sapi_windows_generate_ctrl_event) zend_long evt, pid = 0; zend_bool ret = 0; - if (!php_win32_console_is_cli_sapi()) { - php_error_docref(NULL, E_WARNING, "CTRL events trapping is only supported on console"); - return; + if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|l", &evt, &pid) == FAILURE) { + RETURN_THROWS(); } - if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|l", &evt, &pid) == FAILURE) { + if (!php_win32_console_is_cli_sapi()) { + zend_throw_error(NULL, "CTRL events trapping is only supported on console"); return; } diff --git a/win32/sockets.c b/win32/sockets.c index 461ce69888..0a9a230df5 100644 --- a/win32/sockets.c +++ b/win32/sockets.c @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | @@ -26,34 +24,33 @@ #include "php.h" -PHPAPI int socketpair(int domain, int type, int protocol, SOCKET sock[2]) +PHPAPI int socketpair_win32(int domain, int type, int protocol, SOCKET sock[2], int overlapped) { struct sockaddr_in address; SOCKET redirect; int size = sizeof(address); - if(domain != AF_INET) { + if (domain != AF_INET) { WSASetLastError(WSAENOPROTOOPT); return -1; } - sock[0] = sock[1] = redirect = INVALID_SOCKET; - + sock[1] = redirect = INVALID_SOCKET; - sock[0] = socket(domain, type, protocol); + sock[0] = socket(domain, type, protocol); if (INVALID_SOCKET == sock[0]) { goto error; } address.sin_addr.s_addr = INADDR_ANY; - address.sin_family = AF_INET; - address.sin_port = 0; + address.sin_family = AF_INET; + address.sin_port = 0; - if (bind(sock[0], (struct sockaddr*)&address, sizeof(address)) != 0) { + if (bind(sock[0], (struct sockaddr *) &address, sizeof(address)) != 0) { goto error; } - if(getsockname(sock[0], (struct sockaddr *)&address, &size) != 0) { + if (getsockname(sock[0], (struct sockaddr *) &address, &size) != 0) { goto error; } @@ -61,17 +58,22 @@ PHPAPI int socketpair(int domain, int type, int protocol, SOCKET sock[2]) goto error; } - sock[1] = socket(domain, type, protocol); + if (overlapped) { + sock[1] = socket(domain, type, protocol); + } else { + sock[1] = WSASocket(domain, type, protocol, NULL, 0, 0); + } + if (INVALID_SOCKET == sock[1]) { goto error; } address.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - if(connect(sock[1], (struct sockaddr*)&address, sizeof(address)) != 0) { + if (connect(sock[1], (struct sockaddr *) &address, sizeof(address)) != 0) { goto error; } - redirect = accept(sock[0],(struct sockaddr*)&address, &size); + redirect = accept(sock[0], (struct sockaddr *) &address, &size); if (INVALID_SOCKET == redirect) { goto error; } @@ -88,3 +90,8 @@ error: WSASetLastError(WSAECONNABORTED); return -1; } + +PHPAPI int socketpair(int domain, int type, int protocol, SOCKET sock[2]) +{ + return socketpair_win32(domain, type, protocol, sock, 1); +} diff --git a/win32/sockets.h b/win32/sockets.h index 2e693f8840..2b2b5c4712 100644 --- a/win32/sockets.h +++ b/win32/sockets.h @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | @@ -24,6 +22,7 @@ #ifndef PHP_WIN32_SOCKETS_H #define PHP_WIN32_SOCKETS_H +PHPAPI int socketpair_win32(int domain, int type, int protocol, SOCKET sock[2], int overlapped); PHPAPI int socketpair(int domain, int type, int protocol, SOCKET sock[2]); #endif diff --git a/win32/syslog.h b/win32/syslog.h index 5ea75d8486..560e8864fd 100644 --- a/win32/syslog.h +++ b/win32/syslog.h @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | diff --git a/win32/winutil.c b/win32/winutil.c index 8cf5cdc1e7..a14416a6ce 100644 --- a/win32/winutil.c +++ b/win32/winutil.c @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | @@ -22,12 +20,11 @@ #include "codepage.h" #include <bcrypt.h> #include <lmcons.h> -#include <imagehlp.h> PHP_WINUTIL_API char *php_win32_error_to_msg(HRESULT error) {/*{{{*/ - wchar_t *bufw = NULL; + wchar_t *bufw = NULL, *pw; char *buf; DWORD ret = FormatMessageW( @@ -39,6 +36,10 @@ PHP_WINUTIL_API char *php_win32_error_to_msg(HRESULT error) return ""; } + /* strip trailing line breaks and periods */ + for (pw = bufw + wcslen(bufw) - 1; pw >= bufw && (*pw == L'\r' || *pw == L'\n' || *pw == L'.'); pw--); + pw[1] = L'\0'; + buf = php_win32_cp_conv_w_to_any(bufw, ret, PHP_WIN32_CP_IGNORE_LEN_P); LocalFree(bufw); @@ -438,26 +439,13 @@ PHP_WINUTIL_API char *php_win32_get_username(void) return uname; }/*}}}*/ -static zend_always_inline BOOL is_compatible(const char *name, BOOL is_smaller, char *format, char **err) +static zend_always_inline BOOL is_compatible(HMODULE handle, BOOL is_smaller, char *format, char **err) {/*{{{*/ - /* work around ImageLoad() issue */ - char *name_stripped = name; - if (name[0] == '.' && IS_SLASH(name[1])) { - name_stripped += 2; - } - - PLOADED_IMAGE img = ImageLoad(name_stripped, NULL); + PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER) handle; + PIMAGE_NT_HEADERS pNTHeader = (PIMAGE_NT_HEADERS)((char *) dosHeader + dosHeader->e_lfanew); - if (!img) { - DWORD _err = GetLastError(); - char *err_txt = php_win32_error_to_msg(_err); - spprintf(err, 0, "Failed to load %s, %s", name, err_txt); - free(err_txt); - return FALSE; - } - - DWORD major = img->FileHeader->OptionalHeader.MajorLinkerVersion; - DWORD minor = img->FileHeader->OptionalHeader.MinorLinkerVersion; + DWORD major = pNTHeader->OptionalHeader.MajorLinkerVersion; + DWORD minor = pNTHeader->OptionalHeader.MinorLinkerVersion; #if PHP_LINKER_MAJOR == 14 /* VS 2015, 2017 and 2019 are binary compatible, but only forward compatible. @@ -476,23 +464,39 @@ static zend_always_inline BOOL is_compatible(const char *name, BOOL is_smaller, if (PHP_LINKER_MAJOR != major) #endif { - spprintf(err, 0, format, name, major, minor, PHP_LINKER_MAJOR, PHP_LINKER_MINOR); - ImageUnload(img); + char buf[MAX_PATH]; + if (GetModuleFileName(handle, buf, sizeof(buf)) != 0) { + spprintf(err, 0, format, buf, major, minor, PHP_LINKER_MAJOR, PHP_LINKER_MINOR); + } else { + spprintf(err, 0, "Can't retrieve the module name (error %u)", GetLastError()); + } return FALSE; } - ImageUnload(img); return TRUE; }/*}}}*/ -PHP_WINUTIL_API BOOL php_win32_image_compatible(const char *name, char **err) +PHP_WINUTIL_API BOOL php_win32_image_compatible(HMODULE handle, char **err) {/*{{{*/ - return is_compatible(name, TRUE, "Can't load module '%s' as it's linked with %u.%u, but the core is linked with %d.%d", err); + return is_compatible(handle, TRUE, "Can't load module '%s' as it's linked with %u.%u, but the core is linked with %d.%d", err); }/*}}}*/ -/* Expect a CRT name DLL. */ -PHP_WINUTIL_API BOOL php_win32_crt_compatible(const char *name, char **err) +/* Expect a CRT module handle */ +PHP_WINUTIL_API BOOL php_win32_crt_compatible(char **err) {/*{{{*/ - return is_compatible(name, FALSE, "'%s' %u.%u is not compatible with this PHP build linked with %d.%d", err); +#if PHP_LINKER_MAJOR == 14 + /* Extend for other CRT if needed. */ +# if PHP_DEBUG + const char *crt_name = "vcruntime140d.dll"; +# else + const char *crt_name = "vcruntime140.dll"; +# endif + HMODULE handle = GetModuleHandle(crt_name); + if (handle == NULL) { + spprintf(err, 0, "Can't get handle of module %s (error %u)", crt_name, GetLastError()); + return FALSE; + } + return is_compatible(handle, FALSE, "'%s' %u.%u is not compatible with this PHP build linked with %d.%d", err); +#endif + return TRUE; }/*}}}*/ - diff --git a/win32/winutil.h b/win32/winutil.h index f2faa95fa8..cc3f115280 100644 --- a/win32/winutil.h +++ b/win32/winutil.h @@ -1,7 +1,5 @@ /* +----------------------------------------------------------------------+ - | PHP Version 7 | - +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | @@ -55,7 +53,7 @@ PHP_WINUTIL_API int php_win32_code_to_errno(unsigned long w32Err); PHP_WINUTIL_API char *php_win32_get_username(void); -PHP_WINUTIL_API BOOL php_win32_image_compatible(const char *img, char **err); -PHP_WINUTIL_API BOOL php_win32_crt_compatible(const char *img, char **err); +PHP_WINUTIL_API BOOL php_win32_image_compatible(HMODULE handle, char **err); +PHP_WINUTIL_API BOOL php_win32_crt_compatible(char **err); #endif |