]> granicus.if.org Git - php/commitdiff
added support functions for the apache_hooks SAPI
authorGeorge Schlossnagle <gschlossnagle@php.net>
Mon, 18 Nov 2002 00:59:23 +0000 (00:59 +0000)
committerGeorge Schlossnagle <gschlossnagle@php.net>
Mon, 18 Nov 2002 00:59:23 +0000 (00:59 +0000)
main/SAPI.c
main/SAPI.h
main/main.c
main/php_main.h

index 08eec845eb8317859b72eadb18ec9852c9399ef9..91186311dbcee0ee1f4d1a10f2c6f47a3e218406 100644 (file)
@@ -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;
 }
 
 
index 7e0464ffeaff3e35df6bda4111a8ee722b3eab39..6b6365052f901966ff38e257f0ead5659319c2cd 100644 (file)
@@ -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;
 
 
index 5cf1ac2ef2e0a345fbf51ab81360111890dfc944..1f9f045a517cd658522b99b2ab7835e84a7554ce 100644 (file)
@@ -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)
index dcf249020e4020e7a376d6e165fd06a9ab8f2808..08c091e3b943958bfdb1fd40e76a2984b3f3f4b5 100644 (file)
@@ -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);