diff --git a/emulate_php_cli.c b/emulate_php_cli.c index 007dfb29..cb19e5f4 100644 --- a/emulate_php_cli.c +++ b/emulate_php_cli.c @@ -14,6 +14,29 @@ #include #include #include +#include +#include +#include +#include +#include +#include +#include +#if defined(__linux__) +#include +#elif defined(__FreeBSD__) || defined(__OpenBSD__) +#include +#endif + +typedef struct { + char *script; + int argc; + char **argv; + bool eval; +} cli_exec_args_t; +cli_exec_args_t *cli_args; + +/* Function declaration to avoid implicit declaration error */ +void register_server_variable_filtered(const char *key, char **val, size_t *val_len, zval *track_vars_array); /* * CLI code is adapted from @@ -71,7 +94,7 @@ static void cli_register_file_handles(bool no_close) /* {{{ */ static void sapi_cli_register_variables(zval *track_vars_array) /* {{{ */ { - size_t len = strlen(cli_script); + size_t len = strlen(cli_args->script); char *docroot = ""; /* @@ -81,15 +104,15 @@ static void sapi_cli_register_variables(zval *track_vars_array) /* {{{ */ php_import_environment_variables(track_vars_array); /* Build the special-case PHP_SELF variable for the CLI version */ - register_server_variable_filtered("PHP_SELF", &cli_script, &len, + register_server_variable_filtered("PHP_SELF", &cli_args->script, &len, track_vars_array); - register_server_variable_filtered("SCRIPT_NAME", &cli_script, &len, + register_server_variable_filtered("SCRIPT_NAME", &cli_args->script, &len, track_vars_array); /* filenames are empty for stdin */ - register_server_variable_filtered("SCRIPT_FILENAME", &cli_script, &len, + register_server_variable_filtered("SCRIPT_FILENAME", &cli_args->script, &len, track_vars_array); - register_server_variable_filtered("PATH_TRANSLATED", &cli_script, &len, + register_server_variable_filtered("PATH_TRANSLATED", &cli_args->script, &len, track_vars_array); /* just make it available */ @@ -101,7 +124,9 @@ static void sapi_cli_register_variables(zval *track_vars_array) /* {{{ */ void *emulate_script_cli(void *arg) { void *exit_status; - bool eval = (bool)arg; + cli_exec_args_t* args = arg; + cli_args = args; + bool eval = args->eval; /* * The SAPI name "cli" is hardcoded into too many programs... let's usurp it. @@ -110,16 +135,16 @@ void *emulate_script_cli(void *arg) { php_embed_module.pretty_name = "PHP CLI embedded in FrankenPHP"; php_embed_module.register_server_variables = sapi_cli_register_variables; - php_embed_init(cli_argc, cli_argv); + php_embed_init(cli_args->argc, cli_args->argv); cli_register_file_handles(false); zend_first_try { if (eval) { - /* evaluate the cli_script as literal PHP code (php-cli -r "...") */ - zend_eval_string_ex(cli_script, NULL, "Command line code", 1); + /* evaluate the cli_args->script as literal PHP code (php-cli -r "...") */ + zend_eval_string_ex(cli_args->script, NULL, "Command line code", 1); } else { zend_file_handle file_handle; - zend_stream_init_filename(&file_handle, cli_script); + zend_stream_init_filename(&file_handle, cli_args->script); CG(skip_shebang) = 1; php_execute_script(&file_handle); diff --git a/frankenphp.c b/frankenphp.c index 0545211b..f8d00853 100644 --- a/frankenphp.c +++ b/frankenphp.c @@ -755,7 +755,7 @@ void frankenphp_register_variable_safe(char *key, char *val, size_t val_len, } } -static inline void register_server_variable_filtered(const char *key, +void register_server_variable_filtered(const char *key, char **val, size_t *val_len, zval *track_vars_array) { @@ -1022,16 +1022,20 @@ int frankenphp_execute_script(char *file_name) { return status; } -/* Use global variables to store CLI arguments to prevent useless allocations */ -static char *cli_script; -static int cli_argc; -static char **cli_argv; +typedef struct { + char *script; + int argc; + char **argv; + bool eval; +} cli_exec_args_t; static void *execute_script_cli(void *arg) { + cli_exec_args_t *args = (cli_exec_args_t *)arg; + #if PHP_VERSION_ID >= 85000 - return (void *)(intptr_t)do_php_cli(cli_argc, cli_argv); + return (void *)(intptr_t)do_php_cli(args->argc, args->argv); #else - return emulate_php_cli(arg); + return (void *)(intptr_t)emulate_script_cli(args); #endif } @@ -1041,15 +1045,15 @@ int frankenphp_execute_script_cli(char *script, int argc, char **argv, int err; void *exit_status; - cli_script = script; - cli_argc = argc; - cli_argv = argv; + cli_exec_args_t args = { + .script = script, .argc = argc, .argv = argv, .eval = eval + }; /* * Start the script in a dedicated thread to prevent conflicts between Go and * PHP signal handlers */ - err = pthread_create(&thread, NULL, execute_script_cli, (void *)eval); + err = pthread_create(&thread, NULL, execute_script_cli, &args); if (err != 0) { return err; }