|
|
|
@ -668,495 +668,498 @@ static int do_cli(int argc, char **argv TSRMLS_DC) /* {{{ */ |
|
|
|
const char *param_error=NULL; |
|
|
|
int hide_argv = 0; |
|
|
|
|
|
|
|
CG(in_compilation) = 0; /* not initialized but needed for several options */ |
|
|
|
EG(uninitialized_zval_ptr) = NULL; |
|
|
|
zend_try { |
|
|
|
|
|
|
|
CG(in_compilation) = 0; /* not initialized but needed for several options */ |
|
|
|
EG(uninitialized_zval_ptr) = NULL; |
|
|
|
|
|
|
|
while ((c = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 0, 2)) != -1) { |
|
|
|
switch (c) { |
|
|
|
while ((c = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 0, 2)) != -1) { |
|
|
|
switch (c) { |
|
|
|
|
|
|
|
case 'i': /* php info & quit */ |
|
|
|
if (php_request_startup(TSRMLS_C)==FAILURE) { |
|
|
|
goto err; |
|
|
|
} |
|
|
|
request_started = 1; |
|
|
|
php_print_info(0xFFFFFFFF TSRMLS_CC); |
|
|
|
php_output_end_all(TSRMLS_C); |
|
|
|
exit_status = (c == '?' && argc > 1 && !strchr(argv[1], c)); |
|
|
|
goto out; |
|
|
|
case 'i': /* php info & quit */ |
|
|
|
if (php_request_startup(TSRMLS_C)==FAILURE) { |
|
|
|
goto err; |
|
|
|
} |
|
|
|
request_started = 1; |
|
|
|
php_print_info(0xFFFFFFFF TSRMLS_CC); |
|
|
|
php_output_end_all(TSRMLS_C); |
|
|
|
exit_status = (c == '?' && argc > 1 && !strchr(argv[1], c)); |
|
|
|
goto out; |
|
|
|
|
|
|
|
case 'v': /* show php version & quit */ |
|
|
|
php_printf("PHP %s (%s) (built: %s %s) %s\nCopyright (c) 1997-2011 The PHP Group\n%s", |
|
|
|
PHP_VERSION, cli_sapi_module.name, __DATE__, __TIME__, |
|
|
|
case 'v': /* show php version & quit */ |
|
|
|
php_printf("PHP %s (%s) (built: %s %s) %s\nCopyright (c) 1997-2011 The PHP Group\n%s", |
|
|
|
PHP_VERSION, cli_sapi_module.name, __DATE__, __TIME__, |
|
|
|
#if ZEND_DEBUG && defined(HAVE_GCOV) |
|
|
|
"(DEBUG GCOV)", |
|
|
|
"(DEBUG GCOV)", |
|
|
|
#elif ZEND_DEBUG |
|
|
|
"(DEBUG)", |
|
|
|
"(DEBUG)", |
|
|
|
#elif defined(HAVE_GCOV) |
|
|
|
"(GCOV)", |
|
|
|
"(GCOV)", |
|
|
|
#else |
|
|
|
"", |
|
|
|
"", |
|
|
|
#endif |
|
|
|
get_zend_version() |
|
|
|
); |
|
|
|
sapi_deactivate(TSRMLS_C); |
|
|
|
goto out; |
|
|
|
get_zend_version() |
|
|
|
); |
|
|
|
sapi_deactivate(TSRMLS_C); |
|
|
|
goto out; |
|
|
|
|
|
|
|
case 'm': /* list compiled in modules */ |
|
|
|
if (php_request_startup(TSRMLS_C)==FAILURE) { |
|
|
|
goto err; |
|
|
|
} |
|
|
|
request_started = 1; |
|
|
|
php_printf("[PHP Modules]\n"); |
|
|
|
print_modules(TSRMLS_C); |
|
|
|
php_printf("\n[Zend Modules]\n"); |
|
|
|
print_extensions(TSRMLS_C); |
|
|
|
php_printf("\n"); |
|
|
|
php_output_end_all(TSRMLS_C); |
|
|
|
exit_status=0; |
|
|
|
goto out; |
|
|
|
case 'm': /* list compiled in modules */ |
|
|
|
if (php_request_startup(TSRMLS_C)==FAILURE) { |
|
|
|
goto err; |
|
|
|
} |
|
|
|
request_started = 1; |
|
|
|
php_printf("[PHP Modules]\n"); |
|
|
|
print_modules(TSRMLS_C); |
|
|
|
php_printf("\n[Zend Modules]\n"); |
|
|
|
print_extensions(TSRMLS_C); |
|
|
|
php_printf("\n"); |
|
|
|
php_output_end_all(TSRMLS_C); |
|
|
|
exit_status=0; |
|
|
|
goto out; |
|
|
|
|
|
|
|
default: |
|
|
|
break; |
|
|
|
default: |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/* Set some CLI defaults */ |
|
|
|
SG(options) |= SAPI_OPTION_NO_CHDIR; |
|
|
|
/* Set some CLI defaults */ |
|
|
|
SG(options) |= SAPI_OPTION_NO_CHDIR; |
|
|
|
|
|
|
|
php_optind = orig_optind; |
|
|
|
php_optarg = orig_optarg; |
|
|
|
while ((c = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 0, 2)) != -1) { |
|
|
|
switch (c) { |
|
|
|
php_optind = orig_optind; |
|
|
|
php_optarg = orig_optarg; |
|
|
|
while ((c = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 0, 2)) != -1) { |
|
|
|
switch (c) { |
|
|
|
|
|
|
|
case 'a': /* interactive mode */ |
|
|
|
if (!interactive) { |
|
|
|
if (behavior != PHP_MODE_STANDARD) { |
|
|
|
param_error = param_mode_conflict; |
|
|
|
break; |
|
|
|
} |
|
|
|
case 'a': /* interactive mode */ |
|
|
|
if (!interactive) { |
|
|
|
if (behavior != PHP_MODE_STANDARD) { |
|
|
|
param_error = param_mode_conflict; |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
interactive=1; |
|
|
|
} |
|
|
|
break; |
|
|
|
interactive=1; |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
case 'C': /* don't chdir to the script directory */ |
|
|
|
/* This is default so NOP */ |
|
|
|
break; |
|
|
|
case 'C': /* don't chdir to the script directory */ |
|
|
|
/* This is default so NOP */ |
|
|
|
break; |
|
|
|
|
|
|
|
case 'F': |
|
|
|
if (behavior == PHP_MODE_PROCESS_STDIN) { |
|
|
|
if (exec_run || script_file) { |
|
|
|
param_error = "You can use -R or -F only once.\n"; |
|
|
|
case 'F': |
|
|
|
if (behavior == PHP_MODE_PROCESS_STDIN) { |
|
|
|
if (exec_run || script_file) { |
|
|
|
param_error = "You can use -R or -F only once.\n"; |
|
|
|
break; |
|
|
|
} |
|
|
|
} else if (behavior != PHP_MODE_STANDARD) { |
|
|
|
param_error = param_mode_conflict; |
|
|
|
break; |
|
|
|
} |
|
|
|
} else if (behavior != PHP_MODE_STANDARD) { |
|
|
|
param_error = param_mode_conflict; |
|
|
|
behavior=PHP_MODE_PROCESS_STDIN; |
|
|
|
script_file = php_optarg; |
|
|
|
break; |
|
|
|
} |
|
|
|
behavior=PHP_MODE_PROCESS_STDIN; |
|
|
|
script_file = php_optarg; |
|
|
|
break; |
|
|
|
|
|
|
|
case 'f': /* parse file */ |
|
|
|
if (behavior == PHP_MODE_CLI_DIRECT || behavior == PHP_MODE_PROCESS_STDIN) { |
|
|
|
param_error = param_mode_conflict; |
|
|
|
break; |
|
|
|
} else if (script_file) { |
|
|
|
param_error = "You can use -f only once.\n"; |
|
|
|
case 'f': /* parse file */ |
|
|
|
if (behavior == PHP_MODE_CLI_DIRECT || behavior == PHP_MODE_PROCESS_STDIN) { |
|
|
|
param_error = param_mode_conflict; |
|
|
|
break; |
|
|
|
} else if (script_file) { |
|
|
|
param_error = "You can use -f only once.\n"; |
|
|
|
break; |
|
|
|
} |
|
|
|
script_file = php_optarg; |
|
|
|
break; |
|
|
|
} |
|
|
|
script_file = php_optarg; |
|
|
|
break; |
|
|
|
|
|
|
|
case 'l': /* syntax check mode */ |
|
|
|
if (behavior != PHP_MODE_STANDARD) { |
|
|
|
case 'l': /* syntax check mode */ |
|
|
|
if (behavior != PHP_MODE_STANDARD) { |
|
|
|
break; |
|
|
|
} |
|
|
|
behavior=PHP_MODE_LINT; |
|
|
|
break; |
|
|
|
} |
|
|
|
behavior=PHP_MODE_LINT; |
|
|
|
break; |
|
|
|
|
|
|
|
#if 0 /* not yet operational, see also below ... */ |
|
|
|
case '': /* generate indented source mode*/ |
|
|
|
if (behavior == PHP_MODE_CLI_DIRECT || behavior == PHP_MODE_PROCESS_STDIN) { |
|
|
|
param_error = "Source indenting only works for files.\n"; |
|
|
|
case '': /* generate indented source mode*/ |
|
|
|
if (behavior == PHP_MODE_CLI_DIRECT || behavior == PHP_MODE_PROCESS_STDIN) { |
|
|
|
param_error = "Source indenting only works for files.\n"; |
|
|
|
break; |
|
|
|
} |
|
|
|
behavior=PHP_MODE_INDENT; |
|
|
|
break; |
|
|
|
} |
|
|
|
behavior=PHP_MODE_INDENT; |
|
|
|
break; |
|
|
|
#endif |
|
|
|
|
|
|
|
case 'q': /* do not generate HTTP headers */ |
|
|
|
/* This is default so NOP */ |
|
|
|
break; |
|
|
|
case 'q': /* do not generate HTTP headers */ |
|
|
|
/* This is default so NOP */ |
|
|
|
break; |
|
|
|
|
|
|
|
case 'r': /* run code from command line */ |
|
|
|
if (behavior == PHP_MODE_CLI_DIRECT) { |
|
|
|
if (exec_direct || script_file) { |
|
|
|
param_error = "You can use -r only once.\n"; |
|
|
|
case 'r': /* run code from command line */ |
|
|
|
if (behavior == PHP_MODE_CLI_DIRECT) { |
|
|
|
if (exec_direct || script_file) { |
|
|
|
param_error = "You can use -r only once.\n"; |
|
|
|
break; |
|
|
|
} |
|
|
|
} else if (behavior != PHP_MODE_STANDARD || interactive) { |
|
|
|
param_error = param_mode_conflict; |
|
|
|
break; |
|
|
|
} |
|
|
|
} else if (behavior != PHP_MODE_STANDARD || interactive) { |
|
|
|
param_error = param_mode_conflict; |
|
|
|
behavior=PHP_MODE_CLI_DIRECT; |
|
|
|
exec_direct=php_optarg; |
|
|
|
break; |
|
|
|
} |
|
|
|
behavior=PHP_MODE_CLI_DIRECT; |
|
|
|
exec_direct=php_optarg; |
|
|
|
break; |
|
|
|
|
|
|
|
case 'R': |
|
|
|
if (behavior == PHP_MODE_PROCESS_STDIN) { |
|
|
|
if (exec_run || script_file) { |
|
|
|
param_error = "You can use -R or -F only once.\n"; |
|
|
|
|
|
|
|
case 'R': |
|
|
|
if (behavior == PHP_MODE_PROCESS_STDIN) { |
|
|
|
if (exec_run || script_file) { |
|
|
|
param_error = "You can use -R or -F only once.\n"; |
|
|
|
break; |
|
|
|
} |
|
|
|
} else if (behavior != PHP_MODE_STANDARD) { |
|
|
|
param_error = param_mode_conflict; |
|
|
|
break; |
|
|
|
} |
|
|
|
} else if (behavior != PHP_MODE_STANDARD) { |
|
|
|
param_error = param_mode_conflict; |
|
|
|
behavior=PHP_MODE_PROCESS_STDIN; |
|
|
|
exec_run=php_optarg; |
|
|
|
break; |
|
|
|
} |
|
|
|
behavior=PHP_MODE_PROCESS_STDIN; |
|
|
|
exec_run=php_optarg; |
|
|
|
break; |
|
|
|
|
|
|
|
case 'B': |
|
|
|
if (behavior == PHP_MODE_PROCESS_STDIN) { |
|
|
|
if (exec_begin) { |
|
|
|
param_error = "You can use -B only once.\n"; |
|
|
|
case 'B': |
|
|
|
if (behavior == PHP_MODE_PROCESS_STDIN) { |
|
|
|
if (exec_begin) { |
|
|
|
param_error = "You can use -B only once.\n"; |
|
|
|
break; |
|
|
|
} |
|
|
|
} else if (behavior != PHP_MODE_STANDARD || interactive) { |
|
|
|
param_error = param_mode_conflict; |
|
|
|
break; |
|
|
|
} |
|
|
|
} else if (behavior != PHP_MODE_STANDARD || interactive) { |
|
|
|
param_error = param_mode_conflict; |
|
|
|
behavior=PHP_MODE_PROCESS_STDIN; |
|
|
|
exec_begin=php_optarg; |
|
|
|
break; |
|
|
|
} |
|
|
|
behavior=PHP_MODE_PROCESS_STDIN; |
|
|
|
exec_begin=php_optarg; |
|
|
|
break; |
|
|
|
|
|
|
|
case 'E': |
|
|
|
if (behavior == PHP_MODE_PROCESS_STDIN) { |
|
|
|
if (exec_end) { |
|
|
|
param_error = "You can use -E only once.\n"; |
|
|
|
case 'E': |
|
|
|
if (behavior == PHP_MODE_PROCESS_STDIN) { |
|
|
|
if (exec_end) { |
|
|
|
param_error = "You can use -E only once.\n"; |
|
|
|
break; |
|
|
|
} |
|
|
|
} else if (behavior != PHP_MODE_STANDARD || interactive) { |
|
|
|
param_error = param_mode_conflict; |
|
|
|
break; |
|
|
|
} |
|
|
|
} else if (behavior != PHP_MODE_STANDARD || interactive) { |
|
|
|
param_error = param_mode_conflict; |
|
|
|
behavior=PHP_MODE_PROCESS_STDIN; |
|
|
|
exec_end=php_optarg; |
|
|
|
break; |
|
|
|
} |
|
|
|
behavior=PHP_MODE_PROCESS_STDIN; |
|
|
|
exec_end=php_optarg; |
|
|
|
break; |
|
|
|
|
|
|
|
case 's': /* generate highlighted HTML from source */ |
|
|
|
if (behavior == PHP_MODE_CLI_DIRECT || behavior == PHP_MODE_PROCESS_STDIN) { |
|
|
|
param_error = "Source highlighting only works for files.\n"; |
|
|
|
case 's': /* generate highlighted HTML from source */ |
|
|
|
if (behavior == PHP_MODE_CLI_DIRECT || behavior == PHP_MODE_PROCESS_STDIN) { |
|
|
|
param_error = "Source highlighting only works for files.\n"; |
|
|
|
break; |
|
|
|
} |
|
|
|
behavior=PHP_MODE_HIGHLIGHT; |
|
|
|
break; |
|
|
|
} |
|
|
|
behavior=PHP_MODE_HIGHLIGHT; |
|
|
|
break; |
|
|
|
|
|
|
|
case 'w': |
|
|
|
if (behavior == PHP_MODE_CLI_DIRECT || behavior == PHP_MODE_PROCESS_STDIN) { |
|
|
|
param_error = "Source stripping only works for files.\n"; |
|
|
|
case 'w': |
|
|
|
if (behavior == PHP_MODE_CLI_DIRECT || behavior == PHP_MODE_PROCESS_STDIN) { |
|
|
|
param_error = "Source stripping only works for files.\n"; |
|
|
|
break; |
|
|
|
} |
|
|
|
behavior=PHP_MODE_STRIP; |
|
|
|
break; |
|
|
|
} |
|
|
|
behavior=PHP_MODE_STRIP; |
|
|
|
break; |
|
|
|
|
|
|
|
case 'z': /* load extension file */ |
|
|
|
zend_load_extension(php_optarg); |
|
|
|
break; |
|
|
|
case 'H': |
|
|
|
hide_argv = 1; |
|
|
|
break; |
|
|
|
case 10: |
|
|
|
behavior=PHP_MODE_REFLECTION_FUNCTION; |
|
|
|
reflection_what = php_optarg; |
|
|
|
break; |
|
|
|
case 11: |
|
|
|
behavior=PHP_MODE_REFLECTION_CLASS; |
|
|
|
reflection_what = php_optarg; |
|
|
|
break; |
|
|
|
case 12: |
|
|
|
behavior=PHP_MODE_REFLECTION_EXTENSION; |
|
|
|
reflection_what = php_optarg; |
|
|
|
break; |
|
|
|
case 13: |
|
|
|
behavior=PHP_MODE_REFLECTION_ZEND_EXTENSION; |
|
|
|
reflection_what = php_optarg; |
|
|
|
break; |
|
|
|
case 14: |
|
|
|
behavior=PHP_MODE_REFLECTION_EXT_INFO; |
|
|
|
reflection_what = php_optarg; |
|
|
|
break; |
|
|
|
case 15: |
|
|
|
behavior = PHP_MODE_SHOW_INI_CONFIG; |
|
|
|
break; |
|
|
|
default: |
|
|
|
break; |
|
|
|
case 'z': /* load extension file */ |
|
|
|
zend_load_extension(php_optarg); |
|
|
|
break; |
|
|
|
case 'H': |
|
|
|
hide_argv = 1; |
|
|
|
break; |
|
|
|
case 10: |
|
|
|
behavior=PHP_MODE_REFLECTION_FUNCTION; |
|
|
|
reflection_what = php_optarg; |
|
|
|
break; |
|
|
|
case 11: |
|
|
|
behavior=PHP_MODE_REFLECTION_CLASS; |
|
|
|
reflection_what = php_optarg; |
|
|
|
break; |
|
|
|
case 12: |
|
|
|
behavior=PHP_MODE_REFLECTION_EXTENSION; |
|
|
|
reflection_what = php_optarg; |
|
|
|
break; |
|
|
|
case 13: |
|
|
|
behavior=PHP_MODE_REFLECTION_ZEND_EXTENSION; |
|
|
|
reflection_what = php_optarg; |
|
|
|
break; |
|
|
|
case 14: |
|
|
|
behavior=PHP_MODE_REFLECTION_EXT_INFO; |
|
|
|
reflection_what = php_optarg; |
|
|
|
break; |
|
|
|
case 15: |
|
|
|
behavior = PHP_MODE_SHOW_INI_CONFIG; |
|
|
|
break; |
|
|
|
default: |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (param_error) { |
|
|
|
PUTS(param_error); |
|
|
|
exit_status=1; |
|
|
|
goto err; |
|
|
|
} |
|
|
|
if (param_error) { |
|
|
|
PUTS(param_error); |
|
|
|
exit_status=1; |
|
|
|
goto err; |
|
|
|
} |
|
|
|
|
|
|
|
if (interactive) { |
|
|
|
if (interactive) { |
|
|
|
#if (HAVE_LIBREADLINE || HAVE_LIBEDIT) && !defined(COMPILE_DL_READLINE) |
|
|
|
printf("Interactive shell\n\n"); |
|
|
|
printf("Interactive shell\n\n"); |
|
|
|
#else |
|
|
|
printf("Interactive mode enabled\n\n"); |
|
|
|
printf("Interactive mode enabled\n\n"); |
|
|
|
#endif |
|
|
|
fflush(stdout); |
|
|
|
} |
|
|
|
|
|
|
|
CG(interactive) = interactive; |
|
|
|
|
|
|
|
/* only set script_file if not set already and not in direct mode and not at end of parameter list */ |
|
|
|
if (argc > php_optind |
|
|
|
&& !script_file |
|
|
|
&& behavior!=PHP_MODE_CLI_DIRECT |
|
|
|
&& behavior!=PHP_MODE_PROCESS_STDIN |
|
|
|
&& strcmp(argv[php_optind-1],"--")) |
|
|
|
{ |
|
|
|
script_file=argv[php_optind]; |
|
|
|
php_optind++; |
|
|
|
} |
|
|
|
if (script_file) { |
|
|
|
if (cli_seek_file_begin(&file_handle, script_file, &lineno TSRMLS_CC) != SUCCESS) { |
|
|
|
goto err; |
|
|
|
fflush(stdout); |
|
|
|
} |
|
|
|
script_filename = script_file; |
|
|
|
} else { |
|
|
|
/* We could handle PHP_MODE_PROCESS_STDIN in a different manner */ |
|
|
|
/* here but this would make things only more complicated. And it */ |
|
|
|
/* is consitent with the way -R works where the stdin file handle*/ |
|
|
|
/* is also accessible. */ |
|
|
|
file_handle.filename = "-"; |
|
|
|
file_handle.handle.fp = stdin; |
|
|
|
} |
|
|
|
file_handle.type = ZEND_HANDLE_FP; |
|
|
|
file_handle.opened_path = NULL; |
|
|
|
file_handle.free_filename = 0; |
|
|
|
php_self = file_handle.filename; |
|
|
|
|
|
|
|
/* before registering argv to module exchange the *new* argv[0] */ |
|
|
|
/* we can achieve this without allocating more memory */ |
|
|
|
SG(request_info).argc=argc-php_optind+1; |
|
|
|
arg_excp = argv+php_optind-1; |
|
|
|
arg_free = argv[php_optind-1]; |
|
|
|
SG(request_info).path_translated = file_handle.filename; |
|
|
|
argv[php_optind-1] = file_handle.filename; |
|
|
|
SG(request_info).argv=argv+php_optind-1; |
|
|
|
|
|
|
|
if (php_request_startup(TSRMLS_C)==FAILURE) { |
|
|
|
*arg_excp = arg_free; |
|
|
|
fclose(file_handle.handle.fp); |
|
|
|
PUTS("Could not startup.\n"); |
|
|
|
goto err; |
|
|
|
} |
|
|
|
request_started = 1; |
|
|
|
CG(start_lineno) = lineno; |
|
|
|
*arg_excp = arg_free; /* reconstuct argv */ |
|
|
|
|
|
|
|
if (hide_argv) { |
|
|
|
int i; |
|
|
|
for (i = 1; i < argc; i++) { |
|
|
|
memset(argv[i], 0, strlen(argv[i])); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
zend_is_auto_global("_SERVER", sizeof("_SERVER")-1 TSRMLS_CC); |
|
|
|
CG(interactive) = interactive; |
|
|
|
|
|
|
|
PG(during_request_startup) = 0; |
|
|
|
switch (behavior) { |
|
|
|
case PHP_MODE_STANDARD: |
|
|
|
if (strcmp(file_handle.filename, "-")) { |
|
|
|
cli_register_file_handles(TSRMLS_C); |
|
|
|
/* only set script_file if not set already and not in direct mode and not at end of parameter list */ |
|
|
|
if (argc > php_optind |
|
|
|
&& !script_file |
|
|
|
&& behavior!=PHP_MODE_CLI_DIRECT |
|
|
|
&& behavior!=PHP_MODE_PROCESS_STDIN |
|
|
|
&& strcmp(argv[php_optind-1],"--")) |
|
|
|
{ |
|
|
|
script_file=argv[php_optind]; |
|
|
|
php_optind++; |
|
|
|
} |
|
|
|
|
|
|
|
if (interactive && cli_shell_callbacks.cli_shell_run) { |
|
|
|
exit_status = cli_shell_callbacks.cli_shell_run(TSRMLS_C); |
|
|
|
if (script_file) { |
|
|
|
if (cli_seek_file_begin(&file_handle, script_file, &lineno TSRMLS_CC) != SUCCESS) { |
|
|
|
goto err; |
|
|
|
} |
|
|
|
script_filename = script_file; |
|
|
|
} else { |
|
|
|
php_execute_script(&file_handle TSRMLS_CC); |
|
|
|
exit_status = EG(exit_status); |
|
|
|
/* We could handle PHP_MODE_PROCESS_STDIN in a different manner */ |
|
|
|
/* here but this would make things only more complicated. And it */ |
|
|
|
/* is consitent with the way -R works where the stdin file handle*/ |
|
|
|
/* is also accessible. */ |
|
|
|
file_handle.filename = "-"; |
|
|
|
file_handle.handle.fp = stdin; |
|
|
|
} |
|
|
|
break; |
|
|
|
case PHP_MODE_LINT: |
|
|
|
exit_status = php_lint_script(&file_handle TSRMLS_CC); |
|
|
|
if (exit_status==SUCCESS) { |
|
|
|
zend_printf("No syntax errors detected in %s\n", file_handle.filename); |
|
|
|
} else { |
|
|
|
zend_printf("Errors parsing %s\n", file_handle.filename); |
|
|
|
file_handle.type = ZEND_HANDLE_FP; |
|
|
|
file_handle.opened_path = NULL; |
|
|
|
file_handle.free_filename = 0; |
|
|
|
php_self = file_handle.filename; |
|
|
|
|
|
|
|
/* before registering argv to module exchange the *new* argv[0] */ |
|
|
|
/* we can achieve this without allocating more memory */ |
|
|
|
SG(request_info).argc=argc-php_optind+1; |
|
|
|
arg_excp = argv+php_optind-1; |
|
|
|
arg_free = argv[php_optind-1]; |
|
|
|
SG(request_info).path_translated = file_handle.filename; |
|
|
|
argv[php_optind-1] = file_handle.filename; |
|
|
|
SG(request_info).argv=argv+php_optind-1; |
|
|
|
|
|
|
|
if (php_request_startup(TSRMLS_C)==FAILURE) { |
|
|
|
*arg_excp = arg_free; |
|
|
|
fclose(file_handle.handle.fp); |
|
|
|
PUTS("Could not startup.\n"); |
|
|
|
goto err; |
|
|
|
} |
|
|
|
break; |
|
|
|
case PHP_MODE_STRIP: |
|
|
|
if (open_file_for_scanning(&file_handle TSRMLS_CC)==SUCCESS) { |
|
|
|
zend_strip(TSRMLS_C); |
|
|
|
request_started = 1; |
|
|
|
CG(start_lineno) = lineno; |
|
|
|
*arg_excp = arg_free; /* reconstuct argv */ |
|
|
|
|
|
|
|
if (hide_argv) { |
|
|
|
int i; |
|
|
|
for (i = 1; i < argc; i++) { |
|
|
|
memset(argv[i], 0, strlen(argv[i])); |
|
|
|
} |
|
|
|
} |
|
|
|
goto out; |
|
|
|
break; |
|
|
|
case PHP_MODE_HIGHLIGHT: |
|
|
|
{ |
|
|
|
zend_syntax_highlighter_ini syntax_highlighter_ini; |
|
|
|
|
|
|
|
zend_is_auto_global("_SERVER", sizeof("_SERVER")-1 TSRMLS_CC); |
|
|
|
|
|
|
|
PG(during_request_startup) = 0; |
|
|
|
switch (behavior) { |
|
|
|
case PHP_MODE_STANDARD: |
|
|
|
if (strcmp(file_handle.filename, "-")) { |
|
|
|
cli_register_file_handles(TSRMLS_C); |
|
|
|
} |
|
|
|
|
|
|
|
if (interactive && cli_shell_callbacks.cli_shell_run) { |
|
|
|
exit_status = cli_shell_callbacks.cli_shell_run(TSRMLS_C); |
|
|
|
} else { |
|
|
|
php_execute_script(&file_handle TSRMLS_CC); |
|
|
|
exit_status = EG(exit_status); |
|
|
|
} |
|
|
|
break; |
|
|
|
case PHP_MODE_LINT: |
|
|
|
exit_status = php_lint_script(&file_handle TSRMLS_CC); |
|
|
|
if (exit_status==SUCCESS) { |
|
|
|
zend_printf("No syntax errors detected in %s\n", file_handle.filename); |
|
|
|
} else { |
|
|
|
zend_printf("Errors parsing %s\n", file_handle.filename); |
|
|
|
} |
|
|
|
break; |
|
|
|
case PHP_MODE_STRIP: |
|
|
|
if (open_file_for_scanning(&file_handle TSRMLS_CC)==SUCCESS) { |
|
|
|
php_get_highlight_struct(&syntax_highlighter_ini); |
|
|
|
zend_highlight(&syntax_highlighter_ini TSRMLS_CC); |
|
|
|
zend_strip(TSRMLS_C); |
|
|
|
} |
|
|
|
goto out; |
|
|
|
} |
|
|
|
break; |
|
|
|
#if 0 |
|
|
|
/* Zeev might want to do something with this one day */ |
|
|
|
case PHP_MODE_INDENT: |
|
|
|
open_file_for_scanning(&file_handle TSRMLS_CC); |
|
|
|
zend_indent(); |
|
|
|
zend_file_handle_dtor(file_handle.handle TSRMLS_CC); |
|
|
|
goto out; |
|
|
|
break; |
|
|
|
#endif |
|
|
|
case PHP_MODE_CLI_DIRECT: |
|
|
|
cli_register_file_handles(TSRMLS_C); |
|
|
|
if (zend_eval_string_ex(exec_direct, NULL, "Command line code", 1 TSRMLS_CC) == FAILURE) { |
|
|
|
exit_status=254; |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
case PHP_MODE_PROCESS_STDIN: |
|
|
|
{ |
|
|
|
char *input; |
|
|
|
size_t len, index = 0; |
|
|
|
zval *argn, *argi; |
|
|
|
|
|
|
|
cli_register_file_handles(TSRMLS_C); |
|
|
|
break; |
|
|
|
case PHP_MODE_HIGHLIGHT: |
|
|
|
{ |
|
|
|
zend_syntax_highlighter_ini syntax_highlighter_ini; |
|
|
|
|
|
|
|
if (exec_begin && zend_eval_string_ex(exec_begin, NULL, "Command line begin code", 1 TSRMLS_CC) == FAILURE) { |
|
|
|
exit_status=254; |
|
|
|
} |
|
|
|
ALLOC_ZVAL(argi); |
|
|
|
Z_TYPE_P(argi) = IS_LONG; |
|
|
|
Z_LVAL_P(argi) = index; |
|
|
|
INIT_PZVAL(argi); |
|
|
|
zend_hash_update(&EG(symbol_table), "argi", sizeof("argi"), &argi, sizeof(zval *), NULL); |
|
|
|
while (exit_status == SUCCESS && (input=php_stream_gets(s_in_process, NULL, 0)) != NULL) { |
|
|
|
len = strlen(input); |
|
|
|
while (len-- && (input[len]=='\n' || input[len]=='\r')) { |
|
|
|
input[len] = '\0'; |
|
|
|
if (open_file_for_scanning(&file_handle TSRMLS_CC)==SUCCESS) { |
|
|
|
php_get_highlight_struct(&syntax_highlighter_ini); |
|
|
|
zend_highlight(&syntax_highlighter_ini TSRMLS_CC); |
|
|
|
} |
|
|
|
ALLOC_ZVAL(argn); |
|
|
|
Z_TYPE_P(argn) = IS_STRING; |
|
|
|
Z_STRLEN_P(argn) = ++len; |
|
|
|
Z_STRVAL_P(argn) = estrndup(input, len); |
|
|
|
INIT_PZVAL(argn); |
|
|
|
zend_hash_update(&EG(symbol_table), "argn", sizeof("argn"), &argn, sizeof(zval *), NULL); |
|
|
|
Z_LVAL_P(argi) = ++index; |
|
|
|
if (exec_run) { |
|
|
|
if (zend_eval_string_ex(exec_run, NULL, "Command line run code", 1 TSRMLS_CC) == FAILURE) { |
|
|
|
exit_status=254; |
|
|
|
} |
|
|
|
} else { |
|
|
|
if (script_file) { |
|
|
|
if (cli_seek_file_begin(&file_handle, script_file, &lineno TSRMLS_CC) != SUCCESS) { |
|
|
|
exit_status = 1; |
|
|
|
} else { |
|
|
|
CG(start_lineno) = lineno; |
|
|
|
php_execute_script(&file_handle TSRMLS_CC); |
|
|
|
exit_status = EG(exit_status); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
efree(input); |
|
|
|
goto out; |
|
|
|
} |
|
|
|
if (exec_end && zend_eval_string_ex(exec_end, NULL, "Command line end code", 1 TSRMLS_CC) == FAILURE) { |
|
|
|
break; |
|
|
|
#if 0 |
|
|
|
/* Zeev might want to do something with this one day */ |
|
|
|
case PHP_MODE_INDENT: |
|
|
|
open_file_for_scanning(&file_handle TSRMLS_CC); |
|
|
|
zend_indent(); |
|
|
|
zend_file_handle_dtor(file_handle.handle TSRMLS_CC); |
|
|
|
goto out; |
|
|
|
break; |
|
|
|
#endif |
|
|
|
case PHP_MODE_CLI_DIRECT: |
|
|
|
cli_register_file_handles(TSRMLS_C); |
|
|
|
if (zend_eval_string_ex(exec_direct, NULL, "Command line code", 1 TSRMLS_CC) == FAILURE) { |
|
|
|
exit_status=254; |
|
|
|
} |
|
|
|
|
|
|
|
break; |
|
|
|
} |
|
|
|
case PHP_MODE_REFLECTION_FUNCTION: |
|
|
|
case PHP_MODE_REFLECTION_CLASS: |
|
|
|
case PHP_MODE_REFLECTION_EXTENSION: |
|
|
|
case PHP_MODE_REFLECTION_ZEND_EXTENSION: |
|
|
|
|
|
|
|
case PHP_MODE_PROCESS_STDIN: |
|
|
|
{ |
|
|
|
zend_class_entry *pce = NULL; |
|
|
|
zval *arg, *ref; |
|
|
|
zend_execute_data execute_data; |
|
|
|
char *input; |
|
|
|
size_t len, index = 0; |
|
|
|
zval *argn, *argi; |
|
|
|
|
|
|
|
switch (behavior) { |
|
|
|
default: |
|
|
|
break; |
|
|
|
case PHP_MODE_REFLECTION_FUNCTION: |
|
|
|
if (strstr(reflection_what, "::")) { |
|
|
|
pce = reflection_method_ptr; |
|
|
|
} else { |
|
|
|
pce = reflection_function_ptr; |
|
|
|
cli_register_file_handles(TSRMLS_C); |
|
|
|
|
|
|
|
if (exec_begin && zend_eval_string_ex(exec_begin, NULL, "Command line begin code", 1 TSRMLS_CC) == FAILURE) { |
|
|
|
exit_status=254; |
|
|
|
} |
|
|
|
ALLOC_ZVAL(argi); |
|
|
|
Z_TYPE_P(argi) = IS_LONG; |
|
|
|
Z_LVAL_P(argi) = index; |
|
|
|
INIT_PZVAL(argi); |
|
|
|
zend_hash_update(&EG(symbol_table), "argi", sizeof("argi"), &argi, sizeof(zval *), NULL); |
|
|
|
while (exit_status == SUCCESS && (input=php_stream_gets(s_in_process, NULL, 0)) != NULL) { |
|
|
|
len = strlen(input); |
|
|
|
while (len-- && (input[len]=='\n' || input[len]=='\r')) { |
|
|
|
input[len] = '\0'; |
|
|
|
} |
|
|
|
ALLOC_ZVAL(argn); |
|
|
|
Z_TYPE_P(argn) = IS_STRING; |
|
|
|
Z_STRLEN_P(argn) = ++len; |
|
|
|
Z_STRVAL_P(argn) = estrndup(input, len); |
|
|
|
INIT_PZVAL(argn); |
|
|
|
zend_hash_update(&EG(symbol_table), "argn", sizeof("argn"), &argn, sizeof(zval *), NULL); |
|
|
|
Z_LVAL_P(argi) = ++index; |
|
|
|
if (exec_run) { |
|
|
|
if (zend_eval_string_ex(exec_run, NULL, "Command line run code", 1 TSRMLS_CC) == FAILURE) { |
|
|
|
exit_status=254; |
|
|
|
} |
|
|
|
break; |
|
|
|
case PHP_MODE_REFLECTION_CLASS: |
|
|
|
pce = reflection_class_ptr; |
|
|
|
break; |
|
|
|
case PHP_MODE_REFLECTION_EXTENSION: |
|
|
|
pce = reflection_extension_ptr; |
|
|
|
break; |
|
|
|
case PHP_MODE_REFLECTION_ZEND_EXTENSION: |
|
|
|
pce = reflection_zend_extension_ptr; |
|
|
|
break; |
|
|
|
} else { |
|
|
|
if (script_file) { |
|
|
|
if (cli_seek_file_begin(&file_handle, script_file, &lineno TSRMLS_CC) != SUCCESS) { |
|
|
|
exit_status = 1; |
|
|
|
} else { |
|
|
|
CG(start_lineno) = lineno; |
|
|
|
php_execute_script(&file_handle TSRMLS_CC); |
|
|
|
exit_status = EG(exit_status); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
efree(input); |
|
|
|
} |
|
|
|
|
|
|
|
MAKE_STD_ZVAL(arg); |
|
|
|
ZVAL_STRING(arg, reflection_what, 1); |
|
|
|
ALLOC_ZVAL(ref); |
|
|
|
object_init_ex(ref, pce); |
|
|
|
INIT_PZVAL(ref); |
|
|
|
|
|
|
|
memset(&execute_data, 0, sizeof(zend_execute_data)); |
|
|
|
EG(current_execute_data) = &execute_data; |
|
|
|
EX(function_state).function = pce->constructor; |
|
|
|
zend_call_method_with_1_params(&ref, pce, &pce->constructor, "__construct", NULL, arg); |
|
|
|
|
|
|
|
if (EG(exception)) { |
|
|
|
zval *msg = zend_read_property(zend_exception_get_default(TSRMLS_C), EG(exception), "message", sizeof("message")-1, 0 TSRMLS_CC); |
|
|
|
zend_printf("Exception: %s\n", Z_STRVAL_P(msg)); |
|
|
|
zval_ptr_dtor(&EG(exception)); |
|
|
|
EG(exception) = NULL; |
|
|
|
} else { |
|
|
|
zend_call_method_with_1_params(NULL, reflection_ptr, NULL, "export", NULL, ref); |
|
|
|
if (exec_end && zend_eval_string_ex(exec_end, NULL, "Command line end code", 1 TSRMLS_CC) == FAILURE) { |
|
|
|
exit_status=254; |
|
|
|
} |
|
|
|
zval_ptr_dtor(&ref); |
|
|
|
zval_ptr_dtor(&arg); |
|
|
|
|
|
|
|
break; |
|
|
|
} |
|
|
|
case PHP_MODE_REFLECTION_EXT_INFO: |
|
|
|
{ |
|
|
|
int len = strlen(reflection_what); |
|
|
|
char *lcname = zend_str_tolower_dup(reflection_what, len); |
|
|
|
zend_module_entry *module; |
|
|
|
case PHP_MODE_REFLECTION_FUNCTION: |
|
|
|
case PHP_MODE_REFLECTION_CLASS: |
|
|
|
case PHP_MODE_REFLECTION_EXTENSION: |
|
|
|
case PHP_MODE_REFLECTION_ZEND_EXTENSION: |
|
|
|
{ |
|
|
|
zend_class_entry *pce = NULL; |
|
|
|
zval *arg, *ref; |
|
|
|
zend_execute_data execute_data; |
|
|
|
|
|
|
|
switch (behavior) { |
|
|
|
default: |
|
|
|
break; |
|
|
|
case PHP_MODE_REFLECTION_FUNCTION: |
|
|
|
if (strstr(reflection_what, "::")) { |
|
|
|
pce = reflection_method_ptr; |
|
|
|
} else { |
|
|
|
pce = reflection_function_ptr; |
|
|
|
} |
|
|
|
break; |
|
|
|
case PHP_MODE_REFLECTION_CLASS: |
|
|
|
pce = reflection_class_ptr; |
|
|
|
break; |
|
|
|
case PHP_MODE_REFLECTION_EXTENSION: |
|
|
|
pce = reflection_extension_ptr; |
|
|
|
break; |
|
|
|
case PHP_MODE_REFLECTION_ZEND_EXTENSION: |
|
|
|
pce = reflection_zend_extension_ptr; |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
MAKE_STD_ZVAL(arg); |
|
|
|
ZVAL_STRING(arg, reflection_what, 1); |
|
|
|
ALLOC_ZVAL(ref); |
|
|
|
object_init_ex(ref, pce); |
|
|
|
INIT_PZVAL(ref); |
|
|
|
|
|
|
|
memset(&execute_data, 0, sizeof(zend_execute_data)); |
|
|
|
EG(current_execute_data) = &execute_data; |
|
|
|
EX(function_state).function = pce->constructor; |
|
|
|
zend_call_method_with_1_params(&ref, pce, &pce->constructor, "__construct", NULL, arg); |
|
|
|
|
|
|
|
if (EG(exception)) { |
|
|
|
zval *msg = zend_read_property(zend_exception_get_default(TSRMLS_C), EG(exception), "message", sizeof("message")-1, 0 TSRMLS_CC); |
|
|
|
zend_printf("Exception: %s\n", Z_STRVAL_P(msg)); |
|
|
|
zval_ptr_dtor(&EG(exception)); |
|
|
|
EG(exception) = NULL; |
|
|
|
} else { |
|
|
|
zend_call_method_with_1_params(NULL, reflection_ptr, NULL, "export", NULL, ref); |
|
|
|
} |
|
|
|
zval_ptr_dtor(&ref); |
|
|
|
zval_ptr_dtor(&arg); |
|
|
|
|
|
|
|
if (zend_hash_find(&module_registry, lcname, len+1, (void**)&module) == FAILURE) { |
|
|
|
if (!strcmp(reflection_what, "main")) { |
|
|
|
display_ini_entries(NULL); |
|
|
|
break; |
|
|
|
} |
|
|
|
case PHP_MODE_REFLECTION_EXT_INFO: |
|
|
|
{ |
|
|
|
int len = strlen(reflection_what); |
|
|
|
char *lcname = zend_str_tolower_dup(reflection_what, len); |
|
|
|
zend_module_entry *module; |
|
|
|
|
|
|
|
if (zend_hash_find(&module_registry, lcname, len+1, (void**)&module) == FAILURE) { |
|
|
|
if (!strcmp(reflection_what, "main")) { |
|
|
|
display_ini_entries(NULL); |
|
|
|
} else { |
|
|
|
zend_printf("Extension '%s' not present.\n", reflection_what); |
|
|
|
exit_status = 1; |
|
|
|
} |
|
|
|
} else { |
|
|
|
zend_printf("Extension '%s' not present.\n", reflection_what); |
|
|
|
exit_status = 1; |
|
|
|
php_info_print_module(module TSRMLS_CC); |
|
|
|
} |
|
|
|
} else { |
|
|
|
php_info_print_module(module TSRMLS_CC); |
|
|
|
|
|
|
|
efree(lcname); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
efree(lcname); |
|
|
|
break; |
|
|
|
} |
|
|
|
case PHP_MODE_SHOW_INI_CONFIG: |
|
|
|
{ |
|
|
|
zend_printf("Configuration File (php.ini) Path: %s\n", PHP_CONFIG_FILE_PATH); |
|
|
|
zend_printf("Loaded Configuration File: %s\n", php_ini_opened_path ? php_ini_opened_path : "(none)"); |
|
|
|
zend_printf("Scan for additional .ini files in: %s\n", php_ini_scanned_path ? php_ini_scanned_path : "(none)"); |
|
|
|
zend_printf("Additional .ini files parsed: %s\n", php_ini_scanned_files ? php_ini_scanned_files : "(none)"); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
case PHP_MODE_SHOW_INI_CONFIG: |
|
|
|
{ |
|
|
|
zend_printf("Configuration File (php.ini) Path: %s\n", PHP_CONFIG_FILE_PATH); |
|
|
|
zend_printf("Loaded Configuration File: %s\n", php_ini_opened_path ? php_ini_opened_path : "(none)"); |
|
|
|
zend_printf("Scan for additional .ini files in: %s\n", php_ini_scanned_path ? php_ini_scanned_path : "(none)"); |
|
|
|
zend_printf("Additional .ini files parsed: %s\n", php_ini_scanned_files ? php_ini_scanned_files : "(none)"); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} zend_end_try(); |
|
|
|
|
|
|
|
out: |
|
|
|
if (exit_status == 0) { |
|
|
|
|