diff options
Diffstat (limited to 'sapi/cli')
42 files changed, 270 insertions, 104 deletions
diff --git a/sapi/cli/cli.h b/sapi/cli/cli.h index 130da133f1..0a76895c58 100644 --- a/sapi/cli/cli.h +++ b/sapi/cli/cli.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 7 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2017 The PHP Group | + | Copyright (c) 1997-2018 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 | diff --git a/sapi/cli/config.w32 b/sapi/cli/config.w32 index 664394c8a6..7d0e5954ff 100644 --- a/sapi/cli/config.w32 +++ b/sapi/cli/config.w32 @@ -8,10 +8,16 @@ ARG_ENABLE('cli-win32', 'Build console-less CLI version of PHP', 'no'); if (PHP_CLI == "yes") { SAPI('cli', 'php_cli.c php_http_parser.c php_cli_server.c php_cli_process_title.c ps_title.c', 'php.exe', '/DZEND_ENABLE_STATIC_TSRMLS_CACHE=1'); ADD_FLAG("LIBS_CLI", "ws2_32.lib"); + ADD_FLAG("LIBS_CLI", "shell32.lib"); if (PHP_CRT_DEBUG == "yes") { ADD_FLAG("CFLAGS_CLI", "/D PHP_WIN32_DEBUG_HEAP"); } ADD_FLAG("LDFLAGS_CLI", "/stack:67108864"); + + if (CHECK_LIB("edit_a.lib;edit.lib", "cli", PHP_CLI) && + CHECK_HEADER_ADD_INCLUDE("editline/readline.h", "CFLAGS_CLI")) { + ADD_FLAG("CFLAGS_CLI", "/D HAVE_LIBEDIT"); + } } if (PHP_CLI_WIN32 == "yes") { diff --git a/sapi/cli/generate_mime_type_map.php b/sapi/cli/generate_mime_type_map.php index 7abedf97d2..13ae59dc0c 100644 --- a/sapi/cli/generate_mime_type_map.php +++ b/sapi/cli/generate_mime_type_map.php @@ -44,7 +44,7 @@ foreach($additional_mime_maps as $ext => $mime) { +----------------------------------------------------------------------+ | PHP Version 7 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2017 The PHP Group | + | Copyright (c) 1997-2018 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 | diff --git a/sapi/cli/mime_type_map.h b/sapi/cli/mime_type_map.h index 1dddc952d3..b937b6b96b 100644 --- a/sapi/cli/mime_type_map.h +++ b/sapi/cli/mime_type_map.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 7 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2017 The PHP Group | + | Copyright (c) 1997-2018 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 | diff --git a/sapi/cli/php.1.in b/sapi/cli/php.1.in index f5fccfc7f7..5d82093c0a 100644 --- a/sapi/cli/php.1.in +++ b/sapi/cli/php.1.in @@ -1,4 +1,4 @@ -.TH @program_prefix@php 1 "2017" "The PHP Group" "Scripting Language" +.TH @program_prefix@php 1 "2018" "The PHP Group" "Scripting Language" .SH NAME @program_prefix@php \- PHP Command Line Interface 'CLI' .P @@ -454,7 +454,7 @@ contributors all around the world. .SH VERSION INFORMATION This manpage describes \fBphp\fP, version @PHP_VERSION@. .SH COPYRIGHT -Copyright \(co 1997\-2017 The PHP Group +Copyright \(co 1997\-2018 The PHP Group .LP 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 diff --git a/sapi/cli/php_cli.c b/sapi/cli/php_cli.c index 1ae15e96ab..617539c155 100644 --- a/sapi/cli/php_cli.c +++ b/sapi/cli/php_cli.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 7 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2017 The PHP Group | + | Copyright (c) 1997-2018 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 | @@ -39,6 +39,7 @@ #include "win32/time.h" #include "win32/signal.h" #include <process.h> +#include <shellapi.h> #endif #if HAVE_SYS_TIME_H #include <sys/time.h> @@ -102,9 +103,12 @@ PHPAPI extern char *php_ini_opened_path; PHPAPI extern char *php_ini_scanned_path; PHPAPI extern char *php_ini_scanned_files; -#if defined(PHP_WIN32) && defined(ZTS) +#if defined(PHP_WIN32) +#if defined(ZTS) ZEND_TSRMLS_CACHE_DEFINE() #endif +static DWORD orig_cp = 0; +#endif #ifndef O_BINARY #define O_BINARY 0 @@ -218,8 +222,9 @@ static int print_extension_info(zend_extension *ext, void *arg) /* {{{ */ static int extension_name_cmp(const zend_llist_element **f, const zend_llist_element **s) /* {{{ */ { - return strcmp(((zend_extension *)(*f)->data)->name, - ((zend_extension *)(*s)->data)->name); + zend_extension *fe = (zend_extension*)(*f)->data; + zend_extension *se = (zend_extension*)(*s)->data; + return strcmp(fe->name, se->name); } /* }}} */ @@ -267,11 +272,7 @@ PHP_CLI_API size_t sapi_cli_single_write(const char *str, size_t str_length) /* #endif if (cli_shell_callbacks.cli_shell_write) { - size_t shell_wrote; - shell_wrote = cli_shell_callbacks.cli_shell_write(str, str_length); - if (shell_wrote > -1) { - return shell_wrote; - } + cli_shell_callbacks.cli_shell_write(str, str_length); } #ifdef PHP_WRITE_STDOUT @@ -376,7 +377,7 @@ static void sapi_cli_register_variables(zval *track_vars_array) /* {{{ */ } /* }}} */ -static void sapi_cli_log_message(char *message) /* {{{ */ +static void sapi_cli_log_message(char *message, int syslog_type_int) /* {{{ */ { fprintf(stderr, "%s\n", message); #ifdef PHP_WIN32 @@ -490,7 +491,7 @@ static const zend_function_entry additional_functions[] = { ZEND_FE(dl, arginfo_dl) PHP_FE(cli_set_process_title, arginfo_cli_set_process_title) PHP_FE(cli_get_process_title, arginfo_cli_get_process_title) - {NULL, NULL, NULL} + PHP_FE_END }; /* {{{ php_cli_usage @@ -560,7 +561,6 @@ static php_stream *s_in_process = NULL; static void cli_register_file_handles(void) /* {{{ */ { - zval zin, zout, zerr; php_stream *s_in, *s_out, *s_err; php_stream_context *sc_in=NULL, *sc_out=NULL, *sc_err=NULL; zend_constant ic, oc, ec; @@ -584,23 +584,20 @@ static void cli_register_file_handles(void) /* {{{ */ s_in_process = s_in; - php_stream_to_zval(s_in, &zin); - php_stream_to_zval(s_out, &zout); - php_stream_to_zval(s_err, &zerr); + php_stream_to_zval(s_in, &ic.value); + php_stream_to_zval(s_out, &oc.value); + php_stream_to_zval(s_err, &ec.value); - ZVAL_COPY_VALUE(&ic.value, &zin); ic.flags = CONST_CS; ic.name = zend_string_init("STDIN", sizeof("STDIN")-1, 1); ic.module_number = 0; zend_register_constant(&ic); - ZVAL_COPY_VALUE(&oc.value, &zout); oc.flags = CONST_CS; oc.name = zend_string_init("STDOUT", sizeof("STDOUT")-1, 1); oc.module_number = 0; zend_register_constant(&oc); - ZVAL_COPY_VALUE(&ec.value, &zerr); ec.flags = CONST_CS; ec.name = zend_string_init("STDERR", sizeof("STDERR")-1, 1); ec.module_number = 0; @@ -649,6 +646,17 @@ static int cli_seek_file_begin(zend_file_handle *file_handle, char *script_file, } /* }}} */ +/*{{{ php_cli_win32_ctrl_handler */ +#if defined(PHP_WIN32) && !defined(PHP_CLI_WIN32_NO_CONSOLE) +BOOL WINAPI php_cli_win32_ctrl_handler(DWORD sig) +{ + (void)php_win32_cp_cli_do_restore(orig_cp); + + return FALSE; +} +#endif +/*}}}*/ + static int do_cli(int argc, char **argv) /* {{{ */ { int c; @@ -685,13 +693,21 @@ static int do_cli(int argc, char **argv) /* {{{ */ goto out; case 'v': /* show php version & quit */ - php_printf("PHP %s (%s) (built: %s %s) ( %s)\nCopyright (c) 1997-2017 The PHP Group\n%s", + php_printf("PHP %s (%s) (built: %s %s) ( %s)\nCopyright (c) 1997-2018 The PHP Group\n%s", PHP_VERSION, cli_sapi_module.name, __DATE__, __TIME__, #if ZTS "ZTS " #else "NTS " #endif +#ifdef COMPILER + COMPILER + " " +#endif +#ifdef ARCHITECTURE + ARCHITECTURE + " " +#endif #if ZEND_DEBUG "DEBUG " #endif @@ -1166,9 +1182,16 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine int main(int argc, char *argv[]) #endif { -#ifdef PHP_CLI_WIN32_NO_CONSOLE +#if defined(PHP_WIN32) +# ifdef PHP_CLI_WIN32_NO_CONSOLE int argc = __argc; char **argv = __argv; +# else + int num_args; + wchar_t **argv_wide; + char **argv_save = argv; + BOOL using_wide_argv = 0; +# endif #endif int c; @@ -1225,9 +1248,7 @@ int main(int argc, char *argv[]) ZEND_TSRMLS_CACHE_UPDATE(); #endif -#ifdef ZEND_SIGNALS zend_signal_startup(); -#endif #ifdef PHP_WIN32 _fmode = _O_BINARY; /*sets default for file streams to binary */ @@ -1335,6 +1356,19 @@ exit_loop: } module_started = 1; +#if defined(PHP_WIN32) && !defined(PHP_CLI_WIN32_NO_CONSOLE) + php_win32_cp_cli_setup(); + orig_cp = (php_win32_cp_get_orig())->id; + /* Ignore the delivered argv and argc, read from W API. This place + might be too late though, but this is the earliest place ATW + we can access the internal charset information from PHP. */ + argv_wide = CommandLineToArgvW(GetCommandLineW(), &num_args); + PHP_WIN32_CP_W_TO_ANY_ARRAY(argv_wide, num_args, argv, argc) + using_wide_argv = 1; + + SetConsoleCtrlHandler(php_cli_win32_ctrl_handler, TRUE); +#endif + /* -e option */ if (use_extended_info) { CG(compiler_options) |= ZEND_COMPILE_EXTENDED_INFO; @@ -1368,6 +1402,15 @@ out: tsrm_shutdown(); #endif +#if defined(PHP_WIN32) && !defined(PHP_CLI_WIN32_NO_CONSOLE) + (void)php_win32_cp_cli_restore(); + + if (using_wide_argv) { + PHP_WIN32_CP_FREE_ARRAY(argv, argc); + LocalFree(argv_wide); + } + argv = argv_save; +#endif /* * Do not move this de-initialization. It needs to happen right before * exiting. diff --git a/sapi/cli/php_cli_process_title.c b/sapi/cli/php_cli_process_title.c index a11ac5a301..a24fbbb69e 100644 --- a/sapi/cli/php_cli_process_title.c +++ b/sapi/cli/php_cli_process_title.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 7 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2017 The PHP Group | + | Copyright (c) 1997-2018 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 | diff --git a/sapi/cli/php_cli_process_title.h b/sapi/cli/php_cli_process_title.h index 83be01e5a5..854dec6165 100644 --- a/sapi/cli/php_cli_process_title.h +++ b/sapi/cli/php_cli_process_title.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 7 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2017 The PHP Group | + | Copyright (c) 1997-2018 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 | diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c index 4c1d443d61..5844cdfe8e 100644 --- a/sapi/cli/php_cli_server.c +++ b/sapi/cli/php_cli_server.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 7 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2017 The PHP Group | + | Copyright (c) 1997-2018 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 | @@ -96,6 +96,7 @@ #include "ext/standard/html.h" #include "ext/standard/url.h" /* for php_raw_url_decode() */ #include "ext/standard/php_string.h" /* for php_dirname() */ +#include "ext/date/php_date.h" /* for php_format_date() */ #include "php_network.h" #include "php_http_parser.h" @@ -344,15 +345,24 @@ static void append_http_status_line(smart_str *buffer, int protocol_version, int static void append_essential_headers(smart_str* buffer, php_cli_server_client *client, int persistent) /* {{{ */ { - { - char *val; - if (NULL != (val = zend_hash_str_find_ptr(&client->request.headers, "host", sizeof("host")-1))) { - smart_str_appendl_ex(buffer, "Host", sizeof("Host") - 1, persistent); - smart_str_appendl_ex(buffer, ": ", sizeof(": ") - 1, persistent); - smart_str_appends_ex(buffer, val, persistent); - smart_str_appendl_ex(buffer, "\r\n", 2, persistent); - } + char *val; + struct timeval tv = {0}; + + if (NULL != (val = zend_hash_str_find_ptr(&client->request.headers, "host", sizeof("host")-1))) { + smart_str_appendl_ex(buffer, "Host", sizeof("Host") - 1, persistent); + smart_str_appendl_ex(buffer, ": ", sizeof(": ") - 1, persistent); + smart_str_appends_ex(buffer, val, persistent); + smart_str_appendl_ex(buffer, "\r\n", 2, persistent); + } + + if (!gettimeofday(&tv, NULL)) { + zend_string *dt = php_format_date("r", 1, tv.tv_sec, 1); + smart_str_appendl_ex(buffer, "Date: ", 6, persistent); + smart_str_appends_ex(buffer, dt->val, persistent); + smart_str_appendl_ex(buffer, "\r\n", 2, persistent); + zend_string_release(dt); } + smart_str_appendl_ex(buffer, "Connection: close\r\n", sizeof("Connection: close\r\n") - 1, persistent); } /* }}} */ @@ -477,7 +487,7 @@ const zend_function_entry server_additional_functions[] = { PHP_FE(apache_request_headers, arginfo_no_args) PHP_FE(apache_response_headers, arginfo_no_args) PHP_FALIAS(getallheaders, apache_request_headers, arginfo_no_args) - {NULL, NULL, NULL} + PHP_FE_END }; static int sapi_cli_server_startup(sapi_module_struct *sapi_module) /* {{{ */ @@ -684,7 +694,7 @@ static void sapi_cli_server_register_variables(zval *track_vars_array) /* {{{ */ zend_hash_apply_with_arguments(&client->request.headers, (apply_func_args_t)sapi_cli_server_register_entry_cb, 1, track_vars_array); } /* }}} */ -static void sapi_cli_server_log_message(char *msg) /* {{{ */ +static void sapi_cli_server_log_message(char *msg, int syslog_type_int) /* {{{ */ { char buf[52]; @@ -997,7 +1007,11 @@ static int php_cli_server_content_sender_send(php_cli_server_content_sender *sen if (nbytes_sent < 0) { *nbytes_sent_total = _nbytes_sent_total; return php_socket_errno(); +#ifdef PHP_WIN32 } else if (nbytes_sent == chunk->data.heap.len) { +#else + } else if (nbytes_sent == (ssize_t)chunk->data.heap.len) { +#endif php_cli_server_chunk_dtor(chunk); pefree(chunk, 1); sender->buffer.first = next; @@ -1020,7 +1034,11 @@ static int php_cli_server_content_sender_send(php_cli_server_content_sender *sen if (nbytes_sent < 0) { *nbytes_sent_total = _nbytes_sent_total; return php_socket_errno(); +#ifdef PHP_WIN32 } else if (nbytes_sent == chunk->data.immortal.len) { +#else + } else if (nbytes_sent == (ssize_t)chunk->data.immortal.len) { +#endif php_cli_server_chunk_dtor(chunk); pefree(chunk, 1); sender->buffer.first = next; @@ -1171,7 +1189,7 @@ static void php_cli_server_logf(const char *format, ...) /* {{{ */ } if (sapi_module.log_message) { - sapi_module.log_message(buf); + sapi_module.log_message(buf, -1); } efree(buf); @@ -1387,7 +1405,7 @@ static void php_cli_server_request_translate_vpath(php_cli_server_request *reque *p = '\0'; q = p; while (q > buf) { - if (!zend_stat(buf, &sb)) { + if (!php_sys_stat(buf, &sb)) { if (sb.st_mode & S_IFDIR) { const char **file = index_files; if (q[-1] != DEFAULT_SLASH) { @@ -1396,7 +1414,7 @@ static void php_cli_server_request_translate_vpath(php_cli_server_request *reque while (*file) { size_t l = strlen(*file); memmove(q, *file, l + 1); - if (!zend_stat(buf, &sb) && (sb.st_mode & S_IFREG)) { + if (!php_sys_stat(buf, &sb) && (sb.st_mode & S_IFREG)) { q += l; break; } @@ -1750,7 +1768,7 @@ static int php_cli_server_client_read_request(php_cli_server_client *client, cha } client->parser.data = client; nbytes_consumed = php_http_parser_execute(&client->parser, &settings, buf, nbytes_read); - if (nbytes_consumed != nbytes_read) { + if (nbytes_consumed != (size_t)nbytes_read) { if (buf[0] & 0x80 /* SSLv2 */ || buf[0] == 0x16 /* SSLv3/TLSv1 */) { *errstr = estrdup("Unsupported SSL request"); } else { @@ -1907,7 +1925,7 @@ static int php_cli_server_send_error_page(php_cli_server *server, php_cli_server if (!chunk) { goto fail; } - snprintf(chunk->data.heap.p, chunk->data.heap.len, prologue_template, status, status_string, ZSTR_VAL(escaped_request_uri)); + snprintf(chunk->data.heap.p, chunk->data.heap.len, prologue_template, status, status_string); chunk->data.heap.len = strlen(chunk->data.heap.p); php_cli_server_buffer_append(&client->content_sender.buffer, chunk); } @@ -2026,9 +2044,11 @@ static int php_cli_server_begin_send_static(php_cli_server *server, php_cli_serv ' ' == client->request.path_translated[client->request.path_translated_len-1])) { return php_cli_server_send_error_page(server, client, 500); } -#endif + fd = client->request.path_translated ? php_win32_ioutil_open(client->request.path_translated, O_RDONLY): -1; +#else fd = client->request.path_translated ? open(client->request.path_translated, O_RDONLY): -1; +#endif if (fd < 0) { return php_cli_server_send_error_page(server, client, 404); } @@ -2108,6 +2128,12 @@ static int php_cli_server_dispatch_router(php_cli_server *server, php_cli_server { int decline = 0; zend_file_handle zfd; + char *old_cwd; + + ALLOCA_FLAG(use_heap) + old_cwd = do_alloca(MAXPATHLEN, use_heap); + old_cwd[0] = '\0'; + php_ignore_value(VCWD_GETCWD(old_cwd, MAXPATHLEN - 1)); zfd.type = ZEND_HANDLE_FILENAME; zfd.filename = server->router; @@ -2129,6 +2155,12 @@ static int php_cli_server_dispatch_router(php_cli_server *server, php_cli_server } } zend_end_try(); + if (old_cwd[0] != '\0') { + php_ignore_value(VCWD_CHDIR(old_cwd)); + } + + free_alloca(old_cwd, use_heap); + return decline; } /* }}} */ @@ -2320,20 +2352,10 @@ static int php_cli_server_ctor(php_cli_server *server, const char *addr, const c if (router) { size_t router_len = strlen(router); - if (!IS_ABSOLUTE_PATH(router, router_len)) { - _router = pemalloc(server->document_root_len + router_len + 2, 1); - if (!_router) { - retval = FAILURE; - goto out; - } - snprintf(_router, - server->document_root_len + router_len + 2, "%s%c%s", server->document_root, DEFAULT_SLASH, router); - } else { - _router = pestrndup(router, router_len, 1); - if (!_router) { - retval = FAILURE; - goto out; - } + _router = pestrndup(router, router_len, 1); + if (!_router) { + retval = FAILURE; + goto out; } server->router = _router; server->router_len = router_len; @@ -2534,6 +2556,10 @@ int do_cli_server(int argc, char **argv) /* {{{ */ const char *server_bind_address = NULL; extern const opt_struct OPTIONS[]; const char *document_root = NULL; +#ifdef PHP_WIN32 + char document_root_tmp[MAXPATHLEN]; + size_t k; +#endif const char *router = NULL; char document_root_buf[MAXPATHLEN]; @@ -2543,7 +2569,23 @@ int do_cli_server(int argc, char **argv) /* {{{ */ server_bind_address = php_optarg; break; case 't': +#ifndef PHP_WIN32 document_root = php_optarg; +#else + k = strlen(php_optarg); + if (k + 1 > MAXPATHLEN) { + fprintf(stderr, "Document root path is too long.\n"); + return 1; + } + memmove(document_root_tmp, php_optarg, k + 1); + /* Clean out any trailing garbage that might have been passed + from a batch script. */ + do { + document_root_tmp[k] = '\0'; + k--; + } while ('"' == document_root_tmp[k] || ' ' == document_root_tmp[k]); + document_root = document_root_tmp; +#endif break; } } @@ -2551,7 +2593,7 @@ int do_cli_server(int argc, char **argv) /* {{{ */ if (document_root) { zend_stat_t sb; - if (zend_stat(document_root, &sb)) { + if (php_sys_stat(document_root, &sb)) { fprintf(stderr, "Directory %s does not exist.\n", document_root); return 1; } @@ -2598,6 +2640,7 @@ int do_cli_server(int argc, char **argv) /* {{{ */ #if defined(HAVE_SIGNAL_H) && defined(SIGINT) signal(SIGINT, php_cli_server_sigint_handler); + zend_signal_init(); #endif php_cli_server_do_event_loop(&server); php_cli_server_dtor(&server); diff --git a/sapi/cli/php_cli_server.h b/sapi/cli/php_cli_server.h index 1bb0d40f17..e6d528cedb 100644 --- a/sapi/cli/php_cli_server.h +++ b/sapi/cli/php_cli_server.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 7 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2017 The PHP Group | + | Copyright (c) 1997-2018 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 | diff --git a/sapi/cli/php_http_parser.c b/sapi/cli/php_http_parser.c index 82c74e93c2..63769c15ac 100644 --- a/sapi/cli/php_http_parser.c +++ b/sapi/cli/php_http_parser.c @@ -1470,7 +1470,7 @@ size_t php_http_parser_execute (php_http_parser *parser, p += to_read - 1; } - if (to_read == parser->content_length) { + if (to_read == (size_t)parser->content_length) { state = s_chunk_data_almost_done; } diff --git a/sapi/cli/ps_title.c b/sapi/cli/ps_title.c index 15ab0445d8..7b00348be6 100644 --- a/sapi/cli/ps_title.c +++ b/sapi/cli/ps_title.c @@ -28,25 +28,27 @@ * The following code is adopted from the PostgreSQL's ps_status(.h/.c). */ +#ifdef PHP_WIN32 +#include "config.w32.h" +#include <windows.h> +#include <process.h> +#include "win32/codepage.h" +#else +#include "php_config.h" +extern char** environ; +#endif + #include "ps_title.h" #include <stdio.h> #ifdef HAVE_UNISTD_H +#include <sys/types.h> #include <unistd.h> #endif #include <string.h> #include <stdlib.h> -#ifdef PHP_WIN32 -#include "config.w32.h" -#include <windows.h> -#include <process.h> -#else -#include "php_config.h" -extern char** environ; -#endif - #ifdef HAVE_SYS_PSTAT_H #include <sys/pstat.h> /* for HP-UX */ #endif @@ -109,8 +111,6 @@ extern char** environ; static char windows_error_details[64]; static char ps_buffer[MAX_PATH]; static const size_t ps_buffer_size = MAX_PATH; -typedef BOOL (WINAPI *MySetConsoleTitle)(LPCTSTR); -typedef DWORD (WINAPI *MyGetConsoleTitle)(LPTSTR, DWORD); #elif defined(PS_USE_CLOBBER_ARGV) static char *ps_buffer; /* will point to argv area */ static size_t ps_buffer_size; /* space determined at run time */ @@ -225,9 +225,9 @@ char** save_ps_args(int argc, char** argv) { new_argv[i] = strdup(argv[i]); if (!new_argv[i]) { - free(new_argv); + free(new_argv); goto clobber_error; - } + } } new_argv[argc] = NULL; @@ -371,22 +371,13 @@ int set_ps_title(const char* title) #ifdef PS_USE_WIN32 { - MySetConsoleTitle set_title = NULL; - HMODULE hMod = LoadLibrary("kernel32.dll"); + wchar_t *ps_buffer_w = php_win32_cp_any_to_w(ps_buffer); - if (!hMod) { + if (!ps_buffer_w || !SetConsoleTitleW(ps_buffer_w)) { return PS_TITLE_WINDOWS_ERROR; } - /* NOTE we don't use _UNICODE*/ - set_title = (MySetConsoleTitle)GetProcAddress(hMod, "SetConsoleTitleA"); - if (!set_title) { - return PS_TITLE_WINDOWS_ERROR; - } - - if (!set_title(ps_buffer)) { - return PS_TITLE_WINDOWS_ERROR; - } + free(ps_buffer_w); } #endif /* PS_USE_WIN32 */ @@ -407,22 +398,22 @@ int get_ps_title(int *displen, const char** string) #ifdef PS_USE_WIN32 { - MyGetConsoleTitle get_title = NULL; - HMODULE hMod = LoadLibrary("kernel32.dll"); + wchar_t ps_buffer_w[MAX_PATH]; + char *tmp; - if (!hMod) { + if (!(ps_buffer_cur_len = GetConsoleTitleW(ps_buffer_w, (DWORD)sizeof(ps_buffer_w)))) { return PS_TITLE_WINDOWS_ERROR; } - /* NOTE we don't use _UNICODE*/ - get_title = (MyGetConsoleTitle)GetProcAddress(hMod, "GetConsoleTitleA"); - if (!get_title) { + tmp = php_win32_cp_conv_w_to_any(ps_buffer_w, PHP_WIN32_CP_IGNORE_LEN, &ps_buffer_cur_len); + if (!tmp) { return PS_TITLE_WINDOWS_ERROR; } - if (!(ps_buffer_cur_len = get_title(ps_buffer, (DWORD)ps_buffer_size))) { - return PS_TITLE_WINDOWS_ERROR; - } + ps_buffer_cur_len = ps_buffer_cur_len > sizeof(ps_buffer)-1 ? sizeof(ps_buffer)-1 : ps_buffer_cur_len; + + memmove(ps_buffer, tmp, ps_buffer_cur_len); + free(tmp); } #endif *displen = (int)ps_buffer_cur_len; diff --git a/sapi/cli/ps_title.h b/sapi/cli/ps_title.h index 33035d138f..69e791061c 100644 --- a/sapi/cli/ps_title.h +++ b/sapi/cli/ps_title.h @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 7 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2017 The PHP Group | + | Copyright (c) 1997-2018 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 | diff --git a/sapi/cli/tests/017.phpt b/sapi/cli/tests/017.phpt index efaf977db4..dbddb283a4 100644 --- a/sapi/cli/tests/017.phpt +++ b/sapi/cli/tests/017.phpt @@ -6,6 +6,9 @@ include "skipif.inc"; if (!extension_loaded('readline') || readline_info('done') !== NULL) { die ("skip need readline support using libedit"); } +if(substr(PHP_OS, 0, 3) == 'WIN' ) { + die('skip not for Windows'); +} ?> --FILE-- <?php diff --git a/sapi/cli/tests/argv_mb.phpt b/sapi/cli/tests/argv_mb.phpt new file mode 100644 index 0000000000..e8c47f0972 --- /dev/null +++ b/sapi/cli/tests/argv_mb.phpt @@ -0,0 +1,38 @@ +--TEST-- +Test basic argv multibyte API integration +--SKIPIF-- +<?php +include "skipif.inc"; +if (substr(PHP_OS, 0, 3) != 'WIN') { + die ("skip only for Windows"); +} +?> +--FILE-- +<?php + +$php = getenv('TEST_PHP_EXECUTABLE'); + +$argv_fl = dirname(__FILE__) . DIRECTORY_SEPARATOR . "argv_test.php"; +file_put_contents($argv_fl, "<?php var_dump(\$argv); ?>"); + +var_dump(`$php -n $argv_fl 多字节字符串 マルチバイト文字列 многобайтоваястрока flerbytesträng`); + +@unlink($argv_fl); + +?> +==DONE== +--EXPECTF-- +string(%d) "array(%d) { + [0]=> + string(%d) "%sargv_test.php" + [1]=> + string(18) "多字节字符串" + [2]=> + string(27) "マルチバイト文字列" + [3]=> + string(38) "многобайтоваястрока" + [4]=> + string(15) "flerbytesträng" +} +" +==DONE== diff --git a/sapi/cli/tests/bug43177.phpt b/sapi/cli/tests/bug43177.phpt index 23af545908..e475fb09b4 100644 --- a/sapi/cli/tests/bug43177.phpt +++ b/sapi/cli/tests/bug43177.phpt @@ -61,6 +61,7 @@ HEADER --EXPECTF-- HTTP/1.1 200 OK Host: localhost +Date: %s Connection: close X-Powered-By: %s Content-type: text/html; charset=UTF-8 @@ -68,18 +69,21 @@ Content-type: text/html; charset=UTF-8 OK HTTP/1.0 500 Internal Server Error Host: localhost +Date: %s Connection: close X-Powered-By: %s Content-type: text/html; charset=UTF-8 HTTP/1.0 500 Internal Server Error Host: localhost +Date: %s Connection: close X-Powered-By: %s Content-type: text/html; charset=UTF-8 HTTP/1.0 500 Internal Server Error Host: localhost +Date: %s Connection: close X-Powered-By: %s Content-type: text/html; charset=UTF-8 diff --git a/sapi/cli/tests/bug65066_100.phpt b/sapi/cli/tests/bug65066_100.phpt index 901ba188fd..34381d8e96 100644 --- a/sapi/cli/tests/bug65066_100.phpt +++ b/sapi/cli/tests/bug65066_100.phpt @@ -34,6 +34,7 @@ HEADER --EXPECTF-- HTTP/1.1 100 Continue Host: %s +Date: %s Connection: close X-Powered-By: PHP/%s Content-type: text/html; charset=UTF-8 diff --git a/sapi/cli/tests/bug65066_422.phpt b/sapi/cli/tests/bug65066_422.phpt index 4e5d31c7a7..f25ddfbca6 100644 --- a/sapi/cli/tests/bug65066_422.phpt +++ b/sapi/cli/tests/bug65066_422.phpt @@ -34,6 +34,7 @@ HEADER --EXPECTF-- HTTP/1.1 422 Unknown Status Code Host: %s +Date: %s Connection: close X-Powered-By: PHP/%s Content-type: text/html; charset=UTF-8 diff --git a/sapi/cli/tests/bug65066_511.phpt b/sapi/cli/tests/bug65066_511.phpt index a0b4eae393..27c9f9755a 100644 --- a/sapi/cli/tests/bug65066_511.phpt +++ b/sapi/cli/tests/bug65066_511.phpt @@ -34,6 +34,7 @@ HEADER --EXPECTF-- HTTP/1.1 511 Network Authentication Required Host: %s +Date: %s Connection: close X-Powered-By: PHP/%s Content-type: text/html; charset=UTF-8 diff --git a/sapi/cli/tests/bug65633.phpt b/sapi/cli/tests/bug65633.phpt index 456436b1f7..2e9f2796e8 100644 --- a/sapi/cli/tests/bug65633.phpt +++ b/sapi/cli/tests/bug65633.phpt @@ -37,6 +37,7 @@ fclose($fp); ?> --EXPECTF-- HTTP/1.1 200 OK +Date: %s Connection: close X-Powered-By: %s Content-type: text/html; charset=UTF-8 diff --git a/sapi/cli/tests/bug66606_2.phpt b/sapi/cli/tests/bug66606_2.phpt index 9f539873e1..c47b7736c0 100644 --- a/sapi/cli/tests/bug66606_2.phpt +++ b/sapi/cli/tests/bug66606_2.phpt @@ -38,6 +38,7 @@ fclose($fp); --EXPECTF-- HTTP/1.1 200 OK Host: %s +Date: %s Connection: close X-Powered-By: PHP/%s Content-type: text/html; charset=UTF-8 diff --git a/sapi/cli/tests/bug66830.phpt b/sapi/cli/tests/bug66830.phpt index 58c07e031a..b21b33627e 100644 --- a/sapi/cli/tests/bug66830.phpt +++ b/sapi/cli/tests/bug66830.phpt @@ -37,6 +37,7 @@ fclose($fp); --EXPECTF-- HTTP/1.1 200 OK Host: %s +Date: %s Connection: close X-Powered-By: %s Content-type: text/html; charset=UTF-8 diff --git a/sapi/cli/tests/bug67429.phpt b/sapi/cli/tests/bug67429.phpt index 1c861be899..2e0b6ad627 100644 --- a/sapi/cli/tests/bug67429.phpt +++ b/sapi/cli/tests/bug67429.phpt @@ -43,11 +43,13 @@ HEADER ?> --EXPECTF-- HTTP/1.1 308 Permanent Redirect +Date: %s Connection: close X-Powered-By: %s Content-type: text/html; charset=UTF-8 HTTP/1.1 426 Upgrade Required +Date: %s Connection: close X-Powered-By: %s Content-type: text/html; charset=UTF-8 diff --git a/sapi/cli/tests/bug68745.phpt b/sapi/cli/tests/bug68745.phpt index 733d7d0900..4cdfe0ae4e 100644 --- a/sapi/cli/tests/bug68745.phpt +++ b/sapi/cli/tests/bug68745.phpt @@ -27,6 +27,7 @@ fclose($fp); ?> --EXPECTF-- HTTP/1.1 200 OK +Date: %s Connection: close X-Powered-By: %s Content-type: text/html; charset=UTF-8 diff --git a/sapi/cli/tests/bug71005.phpt b/sapi/cli/tests/bug71005.phpt index 3a60dcf42f..f02f261fbf 100644 --- a/sapi/cli/tests/bug71005.phpt +++ b/sapi/cli/tests/bug71005.phpt @@ -39,6 +39,7 @@ HEADER --EXPECTF-- HTTP/1.1 200 OK Host: %s +Date: %s Connection: close X-Powered-By: PHP/%s Content-type: text/html; charset=UTF-8 diff --git a/sapi/cli/tests/php_cli_server.inc b/sapi/cli/tests/php_cli_server.inc index 5ee3887957..2a21ba35d0 100644 --- a/sapi/cli/tests/php_cli_server.inc +++ b/sapi/cli/tests/php_cli_server.inc @@ -11,13 +11,13 @@ function php_cli_server_start($code = 'echo "Hello world";', $router = 'index.ph file_put_contents($doc_root . '/' . ($router ?: 'index.php'), '<?php ' . $code . ' ?>'); } - $descriptorspec = array( - 0 => STDIN, - 1 => STDOUT, - 2 => STDERR, - ); - if (substr(PHP_OS, 0, 3) == 'WIN') { + $descriptorspec = array( + 0 => STDIN, + 1 => STDOUT, + 2 => array("pipe", "w"), + ); + $cmd = "{$php_executable} -t {$doc_root} -n {$cmd_args} -S " . PHP_CLI_SERVER_ADDRESS; if (!is_null($router)) { $cmd .= " {$router}"; @@ -25,6 +25,12 @@ function php_cli_server_start($code = 'echo "Hello world";', $router = 'index.ph $handle = proc_open(addslashes($cmd), $descriptorspec, $pipes, $doc_root, NULL, array("bypass_shell" => true, "suppress_errors" => true)); } else { + $descriptorspec = array( + 0 => STDIN, + 1 => STDOUT, + 2 => STDERR, + ); + $cmd = "exec {$php_executable} -t {$doc_root} -n {$cmd_args} -S " . PHP_CLI_SERVER_ADDRESS; if (!is_null($router)) { $cmd .= " {$router}"; diff --git a/sapi/cli/tests/php_cli_server_004.phpt b/sapi/cli/tests/php_cli_server_004.phpt index 8b913f6596..5e3bbec18f 100644 --- a/sapi/cli/tests/php_cli_server_004.phpt +++ b/sapi/cli/tests/php_cli_server_004.phpt @@ -38,6 +38,7 @@ HEADER --EXPECTF-- HTTP/1.1 200 OK Host: %s +Date: %s Connection: close X-Powered-By: PHP/%s Content-type: text/html; charset=UTF-8 diff --git a/sapi/cli/tests/php_cli_server_005.phpt b/sapi/cli/tests/php_cli_server_005.phpt index cdd0ae902f..3f9078c8ae 100644 --- a/sapi/cli/tests/php_cli_server_005.phpt +++ b/sapi/cli/tests/php_cli_server_005.phpt @@ -50,6 +50,7 @@ HEADER --EXPECTF-- HTTP/1.1 200 OK Host: %s +Date: %s Connection: close X-Powered-By: PHP/%s Content-type: text/html; charset=UTF-8 diff --git a/sapi/cli/tests/php_cli_server_006.phpt b/sapi/cli/tests/php_cli_server_006.phpt index ad6d6c9598..c68f1e51b0 100644 --- a/sapi/cli/tests/php_cli_server_006.phpt +++ b/sapi/cli/tests/php_cli_server_006.phpt @@ -34,6 +34,7 @@ HEADER --EXPECTF-- HTTP/1.1 200 OK Host: %s +Date: %s Connection: close X-Powered-By: PHP/%s Content-type: text/html; charset=UTF-8 diff --git a/sapi/cli/tests/php_cli_server_007.phpt b/sapi/cli/tests/php_cli_server_007.phpt index 6420ff5a41..b588b9ee2e 100644 --- a/sapi/cli/tests/php_cli_server_007.phpt +++ b/sapi/cli/tests/php_cli_server_007.phpt @@ -34,6 +34,7 @@ HEADER --EXPECTF-- HTTP/1.1 401 Unauthorized Host: %s +Date: %s Connection: close X-Powered-By: PHP/%s WWW-Authenticate: Digest realm="foo",qop="auth",nonce="XXXXX",opaque="acbd18db4cc2f85cedef654fccc4a4d8" diff --git a/sapi/cli/tests/php_cli_server_008.phpt b/sapi/cli/tests/php_cli_server_008.phpt index 01f825a746..58b2485db5 100644 --- a/sapi/cli/tests/php_cli_server_008.phpt +++ b/sapi/cli/tests/php_cli_server_008.phpt @@ -54,6 +54,7 @@ fclose($fp); --EXPECTF-- HTTP/1.1 200 OK Host: %s +Date: %s Connection: close X-Powered-By: PHP/%s Content-type: text/html; charset=UTF-8 @@ -61,6 +62,7 @@ Content-type: text/html; charset=UTF-8 string(8) "HTTP/1.1" HTTP/1.0 200 OK Host: %s +Date: %s Connection: close X-Powered-By: PHP/%s Content-type: text/html; charset=UTF-8 diff --git a/sapi/cli/tests/php_cli_server_009.phpt b/sapi/cli/tests/php_cli_server_009.phpt index 7f3009b9bd..d63c6abf28 100644 --- a/sapi/cli/tests/php_cli_server_009.phpt +++ b/sapi/cli/tests/php_cli_server_009.phpt @@ -78,6 +78,7 @@ fclose($fp); --EXPECTF-- HTTP/1.1 200 OK Host: %s +Date: %s Connection: close X-Powered-By: PHP/%s Content-type: text/html; charset=UTF-8 @@ -85,6 +86,7 @@ Content-type: text/html; charset=UTF-8 string(8) "/foo/bar" HTTP/1.0 200 OK Host: %s +Date: %s Connection: close X-Powered-By: PHP/%s Content-type: text/html; charset=UTF-8 diff --git a/sapi/cli/tests/php_cli_server_010.phpt b/sapi/cli/tests/php_cli_server_010.phpt index ce3abeb501..fe8f1a98ca 100644 --- a/sapi/cli/tests/php_cli_server_010.phpt +++ b/sapi/cli/tests/php_cli_server_010.phpt @@ -55,6 +55,7 @@ fclose($fp); --EXPECTF-- HTTP/1.1 200 OK Host: %s +Date: %s Connection: close X-Powered-By: PHP/%s Content-type: text/html; charset=UTF-8 @@ -65,6 +66,7 @@ string(8) "/foo/bar" string(7) "foo=bar" HTTP/1.0 200 OK Host: %s +Date: %s Connection: close X-Powered-By: PHP/%s Content-type: text/html; charset=UTF-8 diff --git a/sapi/cli/tests/php_cli_server_012.phpt b/sapi/cli/tests/php_cli_server_012.phpt index 302540f7e6..10b9cdbfe9 100644 --- a/sapi/cli/tests/php_cli_server_012.phpt +++ b/sapi/cli/tests/php_cli_server_012.phpt @@ -40,6 +40,7 @@ fclose($fp); --EXPECTF-- HTTP/1.1 200 OK Host: %s +Date: %s Connection: close X-Powered-By: PHP/%s Content-type: text/html; charset=UTF-8 diff --git a/sapi/cli/tests/php_cli_server_013.phpt b/sapi/cli/tests/php_cli_server_013.phpt index 3ea3ea9cad..23269580fb 100644 --- a/sapi/cli/tests/php_cli_server_013.phpt +++ b/sapi/cli/tests/php_cli_server_013.phpt @@ -83,6 +83,7 @@ fclose($fp); HTTP/1.1 404 Not Found Host: %s +Date: %s Connection: close Content-Type: text/html; charset=UTF-8 Content-Length: %d @@ -91,6 +92,7 @@ Content-Length: %d </head><body><h1>Not Found</h1><p>The requested resource <code class="url">/</code> was not found on this server.</p></body></html> HTTP/1.1 404 Not Found Host: %s +Date: %s Connection: close Content-Type: text/html; charset=UTF-8 Content-Length: %d @@ -99,6 +101,7 @@ Content-Length: %d </head><body><h1>Not Found</h1><p>The requested resource <code class="url">/main/style.css</code> was not found on this server.</p></body></html> HTTP/1.1 404 Not Found Host: %s +Date: %s Connection: close Content-Type: text/html; charset=UTF-8 Content-Length: %d diff --git a/sapi/cli/tests/php_cli_server_014.phpt b/sapi/cli/tests/php_cli_server_014.phpt index 4f812e2f63..7c50a5e30a 100644 --- a/sapi/cli/tests/php_cli_server_014.phpt +++ b/sapi/cli/tests/php_cli_server_014.phpt @@ -65,6 +65,7 @@ fclose($fp); HTTP/1.1 200 OK Host: %s +Date: %s Connection: close X-Powered-By: %s Content-type: %s @@ -72,6 +73,7 @@ Content-type: %s done HTTP/1.1 404 Not Found Host: %s +Date: %s Connection: close Content-Type: %s Content-Length: %d diff --git a/sapi/cli/tests/php_cli_server_015.phpt b/sapi/cli/tests/php_cli_server_015.phpt index af0a3f65a8..663268aea6 100644 --- a/sapi/cli/tests/php_cli_server_015.phpt +++ b/sapi/cli/tests/php_cli_server_015.phpt @@ -41,6 +41,7 @@ fclose($fp); --EXPECTF-- HTTP/1.1 200 OK Host: %s +Date: %s Connection: close X-Powered-By: PHP/%s Content-type: text/html; charset=UTF-8 diff --git a/sapi/cli/tests/php_cli_server_017.phpt b/sapi/cli/tests/php_cli_server_017.phpt index 34e7d5e289..28876dc52b 100644 --- a/sapi/cli/tests/php_cli_server_017.phpt +++ b/sapi/cli/tests/php_cli_server_017.phpt @@ -37,6 +37,7 @@ fclose($fp); --EXPECTF-- HTTP/1.1 200 OK Host: %s +Date: %s Connection: close X-Powered-By: %s Content-type: text/html; charset=UTF-8 diff --git a/sapi/cli/tests/php_cli_server_018.phpt b/sapi/cli/tests/php_cli_server_018.phpt index 44e1292934..acfb0f2ce3 100644 --- a/sapi/cli/tests/php_cli_server_018.phpt +++ b/sapi/cli/tests/php_cli_server_018.phpt @@ -37,6 +37,7 @@ fclose($fp); --EXPECTF-- HTTP/1.1 200 OK Host: %s +Date: %s Connection: close X-Powered-By: %s Content-type: text/html; charset=UTF-8 diff --git a/sapi/cli/tests/php_cli_server_019.phpt b/sapi/cli/tests/php_cli_server_019.phpt index aeb7a9f891..7be87a86c9 100644 --- a/sapi/cli/tests/php_cli_server_019.phpt +++ b/sapi/cli/tests/php_cli_server_019.phpt @@ -41,6 +41,7 @@ fclose($fp); --EXPECTF-- HTTP/1.1 200 OK Host: %s +Date: %s Connection: close X-Powered-By: %s Bar-Foo: Foo diff --git a/sapi/cli/tests/php_cli_server_020.phpt b/sapi/cli/tests/php_cli_server_020.phpt index 4ed673d380..766c666911 100644 --- a/sapi/cli/tests/php_cli_server_020.phpt +++ b/sapi/cli/tests/php_cli_server_020.phpt @@ -33,6 +33,7 @@ HEADER --EXPECTF-- HTTP/1.1 200 OK Host: %s +Date: %s Connection: close X-Powered-By: PHP/%s Content-type: text/html; charset=UTF-8 diff --git a/sapi/cli/tests/upload_2G.phpt b/sapi/cli/tests/upload_2G.phpt index bd36ad6cda..21dacb439a 100644 --- a/sapi/cli/tests/upload_2G.phpt +++ b/sapi/cli/tests/upload_2G.phpt @@ -81,6 +81,7 @@ Test HTTP/1.1 200 OK Host: %s +Date: %s Connection: close X-Powered-By: PHP/%s Content-type: text/html; charset=UTF-8 |
