Skip to content

Commit dce590c

Browse files
committed
shuffle things to work
1 parent a8762a0 commit dce590c

2 files changed

Lines changed: 50 additions & 21 deletions

File tree

emulate_php_cli.c

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,29 @@
1414
#include <php_output.h>
1515
#include <php_variables.h>
1616
#include <php_version.h>
17+
#include <pthread.h>
18+
#include <sapi/embed/php_embed.h>
19+
#include <signal.h>
20+
#include <stdint.h>
21+
#include <stdio.h>
22+
#include <stdlib.h>
23+
#include <unistd.h>
24+
#if defined(__linux__)
25+
#include <sys/prctl.h>
26+
#elif defined(__FreeBSD__) || defined(__OpenBSD__)
27+
#include <pthread_np.h>
28+
#endif
29+
30+
typedef struct {
31+
char *script;
32+
int argc;
33+
char **argv;
34+
bool eval;
35+
} cli_exec_args_t;
36+
cli_exec_args_t *cli_args;
37+
38+
/* Function declaration to avoid implicit declaration error */
39+
void register_server_variable_filtered(const char *key, char **val, size_t *val_len, zval *track_vars_array);
1740

1841
/*
1942
* CLI code is adapted from
@@ -71,7 +94,7 @@ static void cli_register_file_handles(bool no_close) /* {{{ */
7194

7295
static void sapi_cli_register_variables(zval *track_vars_array) /* {{{ */
7396
{
74-
size_t len = strlen(cli_script);
97+
size_t len = strlen(cli_args->script);
7598
char *docroot = "";
7699

77100
/*
@@ -81,15 +104,15 @@ static void sapi_cli_register_variables(zval *track_vars_array) /* {{{ */
81104
php_import_environment_variables(track_vars_array);
82105

83106
/* Build the special-case PHP_SELF variable for the CLI version */
84-
register_server_variable_filtered("PHP_SELF", &cli_script, &len,
107+
register_server_variable_filtered("PHP_SELF", &cli_args->script, &len,
85108
track_vars_array);
86-
register_server_variable_filtered("SCRIPT_NAME", &cli_script, &len,
109+
register_server_variable_filtered("SCRIPT_NAME", &cli_args->script, &len,
87110
track_vars_array);
88111

89112
/* filenames are empty for stdin */
90-
register_server_variable_filtered("SCRIPT_FILENAME", &cli_script, &len,
113+
register_server_variable_filtered("SCRIPT_FILENAME", &cli_args->script, &len,
91114
track_vars_array);
92-
register_server_variable_filtered("PATH_TRANSLATED", &cli_script, &len,
115+
register_server_variable_filtered("PATH_TRANSLATED", &cli_args->script, &len,
93116
track_vars_array);
94117

95118
/* just make it available */
@@ -101,7 +124,9 @@ static void sapi_cli_register_variables(zval *track_vars_array) /* {{{ */
101124

102125
void *emulate_script_cli(void *arg) {
103126
void *exit_status;
104-
bool eval = (bool)arg;
127+
cli_exec_args_t* args = arg;
128+
cli_args = args;
129+
bool eval = args->eval;
105130

106131
/*
107132
* The SAPI name "cli" is hardcoded into too many programs... let's usurp it.
@@ -110,16 +135,16 @@ void *emulate_script_cli(void *arg) {
110135
php_embed_module.pretty_name = "PHP CLI embedded in FrankenPHP";
111136
php_embed_module.register_server_variables = sapi_cli_register_variables;
112137

113-
php_embed_init(cli_argc, cli_argv);
138+
php_embed_init(cli_args->argc, cli_args->argv);
114139

115140
cli_register_file_handles(false);
116141
zend_first_try {
117142
if (eval) {
118-
/* evaluate the cli_script as literal PHP code (php-cli -r "...") */
119-
zend_eval_string_ex(cli_script, NULL, "Command line code", 1);
143+
/* evaluate the cli_args->script as literal PHP code (php-cli -r "...") */
144+
zend_eval_string_ex(cli_args->script, NULL, "Command line code", 1);
120145
} else {
121146
zend_file_handle file_handle;
122-
zend_stream_init_filename(&file_handle, cli_script);
147+
zend_stream_init_filename(&file_handle, cli_args->script);
123148

124149
CG(skip_shebang) = 1;
125150
php_execute_script(&file_handle);

frankenphp.c

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -755,7 +755,7 @@ void frankenphp_register_variable_safe(char *key, char *val, size_t val_len,
755755
}
756756
}
757757

758-
static inline void register_server_variable_filtered(const char *key,
758+
void register_server_variable_filtered(const char *key,
759759
char **val,
760760
size_t *val_len,
761761
zval *track_vars_array) {
@@ -1022,16 +1022,20 @@ int frankenphp_execute_script(char *file_name) {
10221022
return status;
10231023
}
10241024

1025-
/* Use global variables to store CLI arguments to prevent useless allocations */
1026-
static char *cli_script;
1027-
static int cli_argc;
1028-
static char **cli_argv;
1025+
typedef struct {
1026+
char *script;
1027+
int argc;
1028+
char **argv;
1029+
bool eval;
1030+
} cli_exec_args_t;
10291031

10301032
static void *execute_script_cli(void *arg) {
1033+
cli_exec_args_t *args = (cli_exec_args_t *)arg;
1034+
10311035
#if PHP_VERSION_ID >= 85000
1032-
return (void *)(intptr_t)do_php_cli(cli_argc, cli_argv);
1036+
return (void *)(intptr_t)do_php_cli(args->argc, args->argv);
10331037
#else
1034-
return emulate_php_cli(arg);
1038+
return (void *)(intptr_t)emulate_script_cli(args);
10351039
#endif
10361040
}
10371041

@@ -1041,15 +1045,15 @@ int frankenphp_execute_script_cli(char *script, int argc, char **argv,
10411045
int err;
10421046
void *exit_status;
10431047

1044-
cli_script = script;
1045-
cli_argc = argc;
1046-
cli_argv = argv;
1048+
cli_exec_args_t args = {
1049+
.script = script, .argc = argc, .argv = argv, .eval = eval
1050+
};
10471051

10481052
/*
10491053
* Start the script in a dedicated thread to prevent conflicts between Go and
10501054
* PHP signal handlers
10511055
*/
1052-
err = pthread_create(&thread, NULL, execute_script_cli, (void *)eval);
1056+
err = pthread_create(&thread, NULL, execute_script_cli, &args);
10531057
if (err != 0) {
10541058
return err;
10551059
}

0 commit comments

Comments
 (0)