diff options
author | George Schlossnagle <gschlossnagle@php.net> | 2002-11-18 00:59:23 +0000 |
---|---|---|
committer | George Schlossnagle <gschlossnagle@php.net> | 2002-11-18 00:59:23 +0000 |
commit | 99c7ddc3a8f9ecf1a3968f6e59dc9d95106bb0c7 (patch) | |
tree | 9f8c0a9c6624eebc713f72d18e09ec311a22aef2 /main | |
parent | a3e9ae20d9b4d2d96becc2f4a94d3a876fe2b3a2 (diff) | |
download | php-git-99c7ddc3a8f9ecf1a3968f6e59dc9d95106bb0c7.tar.gz |
added support functions for the apache_hooks SAPI
Diffstat (limited to 'main')
-rw-r--r-- | main/SAPI.c | 35 | ||||
-rw-r--r-- | main/SAPI.h | 2 | ||||
-rw-r--r-- | main/main.c | 154 | ||||
-rw-r--r-- | main/php_main.h | 1 |
4 files changed, 192 insertions, 0 deletions
diff --git a/main/SAPI.c b/main/SAPI.c index 08eec845eb..91186311db 100644 --- a/main/SAPI.c +++ b/main/SAPI.c @@ -278,10 +278,42 @@ SAPI_API size_t sapi_apply_default_charset(char **mimetype, size_t len TSRMLS_DC return 0; } +SAPI_API void sapi_activate_headers_only(TSRMLS_D) +{ + if (SG(request_info).headers_read == 1) + return; + SG(request_info).headers_read = 1; + zend_llist_init(&SG(sapi_headers).headers, sizeof(sapi_header_struct), (void (*)(void *)) sapi_free_header, 0); + SG(sapi_headers).send_default_content_type = 1; + + /* + SG(sapi_headers).http_response_code = 200; + */ + SG(sapi_headers).http_status_line = NULL; + SG(request_info).current_user = NULL; + SG(request_info).current_user_length = 0; + SG(request_info).no_headers = 0; + + /* It's possible to override this general case in the activate() callback, if + * necessary. + */ + if (SG(request_info).request_method && !strcmp(SG(request_info).request_method, "HEAD")) { + SG(request_info).headers_only = 1; + } else { + SG(request_info).headers_only = 0; + } + if (SG(server_context)) { + SG(request_info).cookie_data = sapi_module.read_cookies(TSRMLS_C); + if (sapi_module.activate) { + sapi_module.activate(TSRMLS_C); + } + } +} /* * Called from php_request_startup() for every request. */ + SAPI_API void sapi_activate(TSRMLS_D) { zend_llist_init(&SG(sapi_headers).headers, sizeof(sapi_header_struct), (void (*)(void *)) sapi_free_header, 0); @@ -389,6 +421,9 @@ SAPI_API void sapi_deactivate(TSRMLS_D) SG(sapi_headers).mimetype = NULL; } sapi_send_headers_free(TSRMLS_C); + SG(sapi_started) = 0; + SG(headers_sent) = 0; + SG(request_info).headers_read = 0; } diff --git a/main/SAPI.h b/main/SAPI.h index 7e0464ffea..6b6365052f 100644 --- a/main/SAPI.h +++ b/main/SAPI.h @@ -83,6 +83,7 @@ typedef struct { zend_bool headers_only; zend_bool no_headers; + zend_bool headers_read; sapi_post_entry *post_entry; @@ -117,6 +118,7 @@ typedef struct _sapi_globals_struct { HashTable *rfc1867_uploaded_files; long post_max_size; int options; + zend_bool sapi_started; } sapi_globals_struct; diff --git a/main/main.c b/main/main.c index 5cf1ac2ef2..1f9f045a51 100644 --- a/main/main.c +++ b/main/main.c @@ -811,8 +811,39 @@ static void sigchld_handler(int apar) static int php_hash_environment(TSRMLS_D); +/* {{{ php_start_sapi() + */ +static int php_start_sapi() +{ + int retval = SUCCESS; + + if(!SG(sapi_started)) { + zend_try { + PG(during_request_startup) = 1; + + /* initialize global variables */ + PG(modules_activated) = 0; + PG(header_is_being_sent) = 0; + PG(connection_status) = PHP_CONNECTION_NORMAL; + + zend_activate(TSRMLS_C); + zend_set_timeout(EG(timeout_seconds)); + zend_activate_modules(TSRMLS_C); + PG(modules_activated)=1; + } zend_catch { + retval = FAILURE; + } zend_end_try(); + + SG(sapi_started) = 1; + } + return retval; +} + +/* }}} */ + /* {{{ php_request_startup */ + #ifndef APACHE_HOOKS int php_request_startup(TSRMLS_D) { int retval = SUCCESS; @@ -868,6 +899,56 @@ int php_request_startup(TSRMLS_D) return retval; } +# else +int php_request_startup(TSRMLS_D) +{ + int retval = SUCCESS; + +#if PHP_SIGCHILD + signal(SIGCHLD, sigchld_handler); +#endif + + if (php_start_sapi() == FAILURE) + return FAILURE; + + php_output_activate(TSRMLS_C); + sapi_activate(TSRMLS_C); + php_hash_environment(TSRMLS_C); + + zend_try { + PG(during_request_startup) = 1; + php_output_activate(TSRMLS_C); + if (PG(expose_php)) { + sapi_add_header(SAPI_PHP_VERSION_HEADER, sizeof(SAPI_PHP_VERSION_HEADER)-1, 1); + } + } zend_catch { + retval = FAILURE; + } zend_end_try(); + + return retval; +} +# endif +/* }}} */ + +/* {{{ php_request_startup_for_hook + */ +int php_request_startup_for_hook(TSRMLS_D) +{ + int retval = SUCCESS; + +#if PHP_SIGCHLD + signal(SIGCHLD, sigchld_handler); +#endif + + if (php_start_sapi() == FAILURE) + return FAILURE; + + php_output_activate(TSRMLS_C); + sapi_activate_headers_only(TSRMLS_C); + php_hash_environment(TSRMLS_C); + + return retval; +} /* }}} */ /* {{{ php_request_shutdown_for_exec @@ -882,6 +963,44 @@ void php_request_shutdown_for_exec(void *dummy) } /* }}} */ +/* {{{ php_request_shutdown_for_hook + */ +void php_request_shutdown_for_hook(void *dummy) +{ + TSRMLS_FETCH(); + if (PG(modules_activated)) zend_try { + php_call_shutdown_functions(); + } zend_end_try(); + + if (PG(modules_activated)) { + zend_deactivate_modules(TSRMLS_C); + } + + zend_try { + int i; + + for (i = 0; i < NUM_TRACK_VARS; i++) { + zval_ptr_dtor(&PG(http_globals)[i]); + } + } zend_end_try(); + + zend_deactivate(TSRMLS_C); + + zend_try { + sapi_deactivate(TSRMLS_C); + } zend_end_try(); + + zend_try { + shutdown_memory_manager(CG(unclean_shutdown), 0); + } zend_end_try(); + + zend_try { + zend_unset_timeout(TSRMLS_C); + } zend_end_try(); +} + +/* }}} */ + /* {{{ php_request_shutdown */ void php_request_shutdown(void *dummy) @@ -1562,6 +1681,41 @@ PHPAPI int php_execute_script(zend_file_handle *primary_file TSRMLS_DC) } /* }}} */ +/* {{{ php_execute_simple_script + */ +PHPAPI int php_execute_simple_script(zend_file_handle *primary_file, zval **ret TSRMLS_DC) +{ + char *old_cwd; + + EG(exit_status) = 0; +#define OLD_CWD_SIZE 4096 + old_cwd = do_alloca(OLD_CWD_SIZE); + old_cwd[0] = '\0'; + + zend_try { +#ifdef PHP_WIN32 + UpdateIniFromRegistry(primary_file->filename TSRMLS_CC); +#endif + + PG(during_request_startup) = 0; + + if (primary_file->type == ZEND_HANDLE_FILENAME + && primary_file->filename) { + VCWD_GETCWD(old_cwd, OLD_CWD_SIZE-1); + VCWD_CHDIR_FILE(primary_file->filename); + } + zend_execute_scripts(ZEND_REQUIRE TSRMLS_CC, ret, 1, primary_file); + } zend_end_try(); + + if (old_cwd[0] != '\0') { + VCWD_CHDIR(old_cwd); + } + + free_alloca(old_cwd); + return EG(exit_status); +} +/* }}} */ + /* {{{ php_handle_aborted_connection */ PHPAPI void php_handle_aborted_connection(void) diff --git a/main/php_main.h b/main/php_main.h index dcf249020e..08c091e3b9 100644 --- a/main/php_main.h +++ b/main/php_main.h @@ -39,6 +39,7 @@ PHPAPI int php_module_shutdown_wrapper(sapi_module_struct *sapi_globals); PHPAPI int php_startup_extensions(zend_module_entry **ptr, int count); PHPAPI int php_execute_script(zend_file_handle *primary_file TSRMLS_DC); +PHPAPI int php_execute_simple_script(zend_file_handle *primary_file, zval **ret TSRMLS_DC); PHPAPI int php_handle_special_queries(TSRMLS_D); PHPAPI int php_lint_script(zend_file_handle *file TSRMLS_DC); |