hi,

here's another shot of the current apache_hooks code.

there are some issues with startup and cleanup currently.
and the patch messes a bit with php's startup procedure.

still missing is access to array_header (think headers_in, headers_out,
headers_err) and table slot in request_rec, as is access to the
whole connection structure of the request.

but the string and int fields can be read and where appropriate written
to. and there are some methods that wrap the ap_ family.



regards,
  -lukas

PS: it's still not doing too useful things.

PPS: but if you configure your .htaccess appropriately you can use the access
handler.

,----->
| error_log('access handler');
| 
| $type = $request->auth_type();
| $name = $request->auth_name();
| $pw = "";
| $s = $request->basic_auth_pw(&$pw);
| 
| error_log("T $type; N $name; P $pw");
| if ($pw == "f0ofoo") return OK;
|
| return AUTH_REQUIRED;
`---->

Index: sapi/apache/mod_php4.c
===================================================================
RCS file: /repository/php4/sapi/apache/mod_php4.c,v
retrieving revision 1.138
diff -u -r1.138 mod_php4.c
--- sapi/apache/mod_php4.c      19 Aug 2002 15:52:21 -0000      1.138
+++ sapi/apache/mod_php4.c      26 Aug 2002 09:26:53 -0000
@@ -34,6 +34,7 @@
 /* {{{ Prototypes
  */
 int apache_php_module_main(request_rec *r, int display_source_mode TSRMLS_DC);
+int apache_php_module_hook(request_rec *r, char *filename, zval **ret TSRMLS_DC);
 void php_save_umask(void);
 void php_restore_umask(void);
 int sapi_apache_read_post(char *buffer, uint count_bytes TSRMLS_DC);
@@ -45,6 +46,7 @@
 static int send_parsed_php_source(request_rec * r);
 int php_xbithack_handler(request_rec * r);
 void php_init_handler(server_rec *s, pool *p);
+
 /* }}} */
 
 #if MODULE_MAGIC_NUMBER >= 19970728
@@ -70,6 +72,7 @@
 module MODULE_VAR_EXPORT php4_module;
 
 int saved_umask;
+//static int setup_env = 0;
 static unsigned char apache_php_initialized;
 
 typedef struct _php_per_dir_entry {
@@ -296,6 +299,9 @@
                AP(in_request) = 0;
                php_request_shutdown(dummy);
        }
+    if(AP(setup_env)) {
+        AP(setup_env) = 0;
+    }
 }
 /* }}} */
 
@@ -649,13 +655,13 @@
 static void *php_create_dir(pool *p, char *dummy)
 {
        HashTable *per_dir_info;
-
        per_dir_info = (HashTable *) malloc(sizeof(HashTable));
        zend_hash_init_ex(per_dir_info, 5, NULL, (void (*)(void *)) 
destroy_per_dir_entry, 1, 0);
        register_cleanup(p, (void *) per_dir_info, (void (*)(void *)) 
php_destroy_per_dir_info, (void (*)(void *)) zend_hash_destroy);
 
        return per_dir_info;
 }
+
 /* }}} */
 
 /* {{{ php_merge_dir
@@ -668,6 +674,7 @@
 }
 /* }}} */
 
+
 /* {{{ php_apache_value_handler_ex
  */
 CONST_PREFIX char *php_apache_value_handler_ex(cmd_parms *cmd, HashTable *conf, char 
*arg1, char *arg2, int mode)
@@ -835,6 +842,82 @@
 }
 /* }}} */
 
+static int php_run_hook(request_rec *r, char *handler)
+{
+       zval *ret = NULL;
+       HashTable *conf;
+
+       TSRMLS_FETCH();
+
+       if (!AP(apache_config_loaded)) {
+               conf = (HashTable *) get_module_config(r->per_dir_config, 
+&php4_module);
+               if (conf)
+                      zend_hash_apply((HashTable *)conf, (apply_func_t) 
+php_apache_alter_ini_entries TSRMLS_CC);
+               AP(apache_config_loaded) = 1;
+       }
+
+       if (!handler)
+               return DECLINED;
+       
+       hard_timeout("send", r);
+       SG(server_context) = r;
+       php_save_umask();
+       if (!AP(setup_env)) {
+               add_common_vars(r);
+               add_cgi_vars(r);
+               AP(setup_env) = 1;
+       }
+       init_request_info(TSRMLS_C);
+       apache_php_module_hook(r, handler, &ret TSRMLS_CC);
+       php_restore_umask();
+       kill_timeout(r);
+       
+       if (ret) {
+               convert_to_long(ret);
+               return Z_LVAL_P(ret);
+       }
+
+       return HTTP_INTERNAL_SERVER_ERROR;
+}
+
+
+static int php_uri_translation(request_rec *r)
+{
+       fprintf(stderr, "HOOK: %s\n", __FUNCTION__);
+       return php_run_hook(r, AP(uri_handler));
+}
+
+static int php_auth_hook(request_rec *r)
+{
+       fprintf(stderr, "HOOK: %s\n", __FUNCTION__);
+       return php_run_hook(r, AP(auth_handler));
+}
+
+static int php_access_hook(request_rec *r)
+{
+       fprintf(stderr, "HOOK: %s\n", __FUNCTION__);
+       return php_run_hook(r, AP(access_handler));
+}
+
+static int php_type_hook(request_rec *r)
+{
+       fprintf(stderr, "HOOK: %s\n", __FUNCTION__);
+       return php_run_hook(r, AP(type_handler));
+}
+
+static int php_fixup_hook(request_rec *r)
+{
+       fprintf(stderr, "HOOK: %s\n", __FUNCTION__);
+       return php_run_hook(r, AP(fixup_handler));
+}
+
+static int php_logger_hook(request_rec *r)
+{
+       fprintf(stderr, "HOOK: %s\n", __FUNCTION__);
+       return php_run_hook(r, AP(logger_handler));
+}
+ 
+
 /* {{{ handler_rec php_handlers[]
  */
 handler_rec php_handlers[] =
@@ -858,7 +941,7 @@
 };
 /* }}} */
 
-/* {{{ odule MODULE_VAR_EXPORT php4_module
+/* {{{ module MODULE_VAR_EXPORT php4_module
  */
 module MODULE_VAR_EXPORT php4_module =
 {
@@ -870,13 +953,13 @@
        NULL,                                           /* merge server config */
        php_commands,                           /* command table */
        php_handlers,                           /* handlers */
-       NULL,                                           /* filename translation */
+       php_uri_translation,            /* filename translation */
        NULL,                                           /* check_user_id */
-       NULL,                                           /* check auth */
-       NULL,                                           /* check access */
-       NULL,                                           /* type_checker */
-       NULL,                                           /* fixups */
-       NULL                                            /* logger */
+       php_auth_hook,                          /* check auth */
+       php_access_hook,                        /* check access */
+       php_type_hook,                          /* type_checker */
+       php_fixup_hook,                         /* fixups */
+       php_logger_hook                         /* logger */
 #if MODULE_MAGIC_NUMBER >= 19970103
        , NULL                                          /* header parser */
 #endif
@@ -884,7 +967,7 @@
        , NULL                                  /* child_init */
 #endif
 #if MODULE_MAGIC_NUMBER >= 19970728
-       , php_child_exit_handler                /* child_exit */
+       , php_child_exit_handler        /* child_exit */
 #endif
 #if MODULE_MAGIC_NUMBER >= 19970902
        , NULL                                          /* post read-request */
Index: sapi/apache/mod_php4.h
===================================================================
RCS file: /repository/php4/sapi/apache/mod_php4.h,v
retrieving revision 1.17
diff -u -r1.17 mod_php4.h
--- sapi/apache/mod_php4.h      28 Feb 2002 08:27:19 -0000      1.17
+++ sapi/apache/mod_php4.h      26 Aug 2002 09:26:53 -0000
@@ -31,7 +31,15 @@
        long last_modified;
        long xbithack;
        long terminate_child;
+       long setup_env;
        zend_bool in_request;
+       zend_bool apache_config_loaded;
+       char *uri_handler;
+       char *auth_handler;
+       char *access_handler;
+       char *type_handler;
+       char *fixup_handler;
+       char *logger_handler;
 } php_apache_info_struct;
 
 extern zend_module_entry apache_module_entry;
Index: sapi/apache/php_apache.c
===================================================================
RCS file: /repository/php4/sapi/apache/php_apache.c,v
retrieving revision 1.66
diff -u -r1.66 php_apache.c
--- sapi/apache/php_apache.c    13 Aug 2002 04:03:20 -0000      1.66
+++ sapi/apache/php_apache.c    26 Aug 2002 09:26:53 -0000
@@ -37,6 +37,8 @@
 #define SECTION(name)  PUTS("<H2 align=\"center\">" name "</H2>\n")
 
 extern module *top_module;
+static int le_apachereq;
+static zend_class_entry *apacherequest_class_entry;
 
 PHP_FUNCTION(virtual);
 PHP_FUNCTION(apache_request_headers);
@@ -49,6 +51,7 @@
 
 PHP_MINFO_FUNCTION(apache);
 
+
 function_entry apache_functions[] = {
        PHP_FE(virtual,                                                                
 NULL)
        PHP_FE(apache_request_headers,                                  NULL)
@@ -61,15 +64,22 @@
        {NULL, NULL, NULL}
 };
 
-
+/* {{{ php_apache ini entries
+ */
 PHP_INI_BEGIN()
        STD_PHP_INI_ENTRY("xbithack",                   "0",                           
 PHP_INI_ALL,            OnUpdateInt,            xbithack, php_apache_info_struct, 
php_apache_info)
        STD_PHP_INI_ENTRY("engine",                             "1",                   
         PHP_INI_ALL,            OnUpdateInt,            engine, 
php_apache_info_struct, php_apache_info)
        STD_PHP_INI_ENTRY("last_modified",              "0",                           
 PHP_INI_ALL,            OnUpdateInt,            last_modified, 
php_apache_info_struct, php_apache_info)
        STD_PHP_INI_ENTRY("child_terminate",    "0",                            
PHP_INI_ALL,            OnUpdateInt,            terminate_child, 
php_apache_info_struct, php_apache_info)
-PHP_INI_END()
-
+       STD_PHP_INI_ENTRY("uri_handler",                NULL,                          
+ PHP_INI_ALL,            OnUpdateString,         uri_handler, php_apache_info_struct, 
+php_apache_info)
+       STD_PHP_INI_ENTRY("auth_handler",               NULL,                          
+ PHP_INI_ALL,            OnUpdateString,         auth_handler, 
+php_apache_info_struct, php_apache_info)
+       STD_PHP_INI_ENTRY("access_handler",             NULL,                          
+ PHP_INI_ALL,            OnUpdateString,         access_handler, 
+php_apache_info_struct, php_apache_info)
+       STD_PHP_INI_ENTRY("type_handler",               NULL,                          
+ PHP_INI_ALL,            OnUpdateString,         type_handler, 
+php_apache_info_struct, php_apache_info)
+       STD_PHP_INI_ENTRY("fixup_handler",              NULL,                          
+ PHP_INI_ALL,            OnUpdateString,         fixup_handler, 
+php_apache_info_struct, php_apache_info)
+       STD_PHP_INI_ENTRY("logger_handler",             NULL,                          
+ PHP_INI_ALL,            OnUpdateString,         logger_handler, 
+php_apache_info_struct, php_apache_info)
 
+PHP_INI_END()
+/* }}} */
 
 static void php_apache_globals_ctor(php_apache_info_struct *apache_globals TSRMLS_DC)
 {
@@ -77,14 +87,875 @@
 }
 
 
+#define APREQ_GET_THIS(ZVAL)           if (NULL == (ZVAL = getThis())) { \
+                                                                               
+php_error(E_WARNING, "%s(): underlying ApacheRequest object missing", \
+                                                                                      
+ get_active_function_name(TSRMLS_C)); \
+                                                                               
+RETURN_FALSE; \
+                                                                       }
+#define APREQ_GET_REQUEST(ZVAL, R)     APREQ_GET_THIS(ZVAL); \
+                                                                       R = 
+get_apache_request(ZVAL)
+
+static void php_apache_request_free(zend_rsrc_list_entry *rsrc TSRMLS_DC)
+{
+       zval *z = (zval *)rsrc->ptr;
+       fprintf(stderr, "%s() %p\n", __FUNCTION__, z);
+       zval_ptr_dtor(&z);
+}
+
+static request_rec *get_apache_request(zval *z)
+{
+       request_rec *r;
+       zval **addr;
+
+       if (NULL == z) {
+               php_error(E_WARNING, "get_apache_request() invalid wrapper passed");
+               return NULL;
+       }
+
+       if (Z_TYPE_P(z) != IS_OBJECT) {
+               php_error(E_WARNING, "%s(): wrapper is not an object", 
+get_active_function_name(TSRMLS_C));
+               return NULL;
+       }
+
+       if (zend_hash_index_find(Z_OBJPROP_P(z), 0, (void **)&addr) == FAILURE) {
+               php_error(E_WARNING, "%s(): underlying object missing", 
+get_active_function_name(TSRMLS_C));
+               return NULL;
+       }
+
+       r = (request_rec *)Z_LVAL_PP(addr);
+       if (!r) {
+               php_error(E_WARNING, "%s(): request_rec invalid", 
+get_active_function_name(TSRMLS_C));
+               return NULL;
+       }
+
+       return r;
+}
+
+/* {{{
+ */
+PHPAPI zval *php_apache_request_new(request_rec *r)
+{
+       zval *req;
+       zval *addr;
+
+       MAKE_STD_ZVAL(addr);
+       Z_TYPE_P(addr) = IS_LONG;
+       Z_LVAL_P(addr) = (int) r;
+
+       MAKE_STD_ZVAL(req);
+       object_init_ex(req, apacherequest_class_entry);
+       zend_hash_index_update(Z_OBJPROP_P(req), 0, &addr, sizeof(zval *), NULL);
+
+       return req;
+}
+/* }}} */
+
+/* {{{ apache_request_read_string_slot()
+ */
+static void apache_request_read_string_slot(int offset, INTERNAL_FUNCTION_PARAMETERS)
+{
+       zval *id, **new_value;
+       request_rec *r;
+       char *s;
+
+       if (ZEND_NUM_ARGS() > 0) {
+               WRONG_PARAM_COUNT;
+       }
+
+       APREQ_GET_REQUEST(id, r);
+
+       s = *(char **)((char*)r + offset);
+
+       if (s)
+               RETURN_STRING(s, 1);
+
+       RETURN_EMPTY_STRING();
+}
+/* }}} */
+
+
+/* {{{ apache_request_string_slot()
+ */
+static void apache_request_string_slot(int offset, INTERNAL_FUNCTION_PARAMETERS)
+{
+       zval *id, **new_value;
+       request_rec *r;
+       char *old_value;
+       char **target;
+
+       APREQ_GET_REQUEST(id, r);
+
+       target = (char **)((char*)r + offset);
+       old_value = *target;
+
+       switch (ZEND_NUM_ARGS()) {
+               case 0:
+                       break;
+               case 1:
+                       if (zend_get_parameters_ex(1, &new_value) == FAILURE) {
+                               RETURN_FALSE;
+                       }
+                       convert_to_string_ex(new_value);
+                       *target = ap_pstrdup(r->pool, Z_STRVAL_PP(new_value));
+                       break;
+               default:
+                       WRONG_PARAM_COUNT;
+                       break;
+       }
+
+       if (old_value)
+               RETURN_STRING(old_value, 1);
+
+       RETURN_EMPTY_STRING();
+}
+/* }}} */
+
+/* {{{ apache_request_read_int_slot()
+ */
+static void apache_request_read_int_slot(int offset, INTERNAL_FUNCTION_PARAMETERS)
+{
+       zval *id;
+       request_rec *r;
+       long l;
+
+       if (ZEND_NUM_ARGS() > 0) {
+               WRONG_PARAM_COUNT;
+       }
+
+       APREQ_GET_REQUEST(id, r);
+
+       l = *(long *)((char*)r + offset);
+
+       RETURN_LONG(l);
+}
+/* }}} */
+
+/* {{{ apache_request_int_slot()
+ */
+static void apache_request_int_slot(int offset, INTERNAL_FUNCTION_PARAMETERS)
+{
+       zval *id, **new_value;
+       request_rec *r;
+       long old_value;
+       long *target;
+
+       APREQ_GET_REQUEST(id, r);
+
+       target = (long *)((char*)r + offset);
+       old_value = *target;
+
+       switch (ZEND_NUM_ARGS()) {
+               case 0:
+                       break;
+               case 1:
+                       if (zend_get_parameters_ex(1, &new_value) == FAILURE) {
+                               RETURN_FALSE;
+                       }
+                       convert_to_long_ex(new_value);
+                       *target = Z_LVAL_PP(new_value);
+                       break;
+               default:
+                       WRONG_PARAM_COUNT;
+                       break;
+       }
+
+       RETURN_LONG(old_value);
+}
+/* }}} */
+
+
+/* {{{ access string slots of request rec
+ */
+
+/* {{{ proto string $request->filename([string new_filename])
+ */
+PHP_FUNCTION(apache_request_filename)
+{
+       apache_request_string_slot(offsetof(request_rec, filename), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+/* {{{ proto string $request->uri([string new_uri])
+ */
+PHP_FUNCTION(apache_request_uri)
+{
+       apache_request_string_slot(offsetof(request_rec, uri), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+/* {{{ proto string $request->unparsed_uri([string new_unparsed_uri])
+ */
+PHP_FUNCTION(apache_request_unparsed_uri)
+{
+       apache_request_string_slot(offsetof(request_rec, unparsed_uri), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+/* {{{ proto string $request->path_info([string new_path_info])
+ */
+PHP_FUNCTION(apache_request_path_info)
+{
+       apache_request_string_slot(offsetof(request_rec, path_info), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+/* {{{ proto string $request->args([string new_args])
+ */
+PHP_FUNCTION(apache_request_args)
+{
+       apache_request_string_slot(offsetof(request_rec, args), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+/* {{{ proto string $request->boundary()
+ */
+PHP_FUNCTION(apache_request_boundary)
+{
+       apache_request_read_string_slot(offsetof(request_rec, boundary), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+
+/* {{{ proto string $request->content_type([string new_type])
+ */
+PHP_FUNCTION(apache_request_content_type)
+{
+       apache_request_string_slot(offsetof(request_rec, content_type), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+/* {{{ proto string $request->content_encoding([string new_encoding])
+ */
+PHP_FUNCTION(apache_request_content_encoding)
+{
+       apache_request_string_slot(offsetof(request_rec, content_encoding), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+/* {{{ proto string $request->handler([string new_handler])
+ */
+PHP_FUNCTION(apache_request_handler)
+{
+       apache_request_string_slot(offsetof(request_rec, handler), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+/* {{{ proto string $request->the_request()
+ */
+PHP_FUNCTION(apache_request_the_request)
+{
+       apache_request_read_string_slot(offsetof(request_rec, the_request), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+/* {{{ proto string $request->protocol()
+ */
+PHP_FUNCTION(apache_request_protocol)
+{
+       apache_request_read_string_slot(offsetof(request_rec, protocol), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+/* {{{ proto string $request->hostname()
+ */
+PHP_FUNCTION(apache_request_hostname)
+{
+       apache_request_read_string_slot(offsetof(request_rec, hostname), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+/* {{{ proto string $request->status_line([string new_status_line])
+ */
+PHP_FUNCTION(apache_request_status_line)
+{
+       apache_request_string_slot(offsetof(request_rec, status_line), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+/* {{{ proto string $request->method()
+ */
+PHP_FUNCTION(apache_request_method)
+{
+       apache_request_read_string_slot(offsetof(request_rec, method), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+/* }}} access string slots of request rec */
+
+/* {{{ access int slots of request_rec
+ */
+
+/* {{{ proto int $request->proto_num()
+ */
+PHP_FUNCTION(apache_request_proto_num)
+{
+       apache_request_read_int_slot(offsetof(request_rec, proto_num), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+/* {{{ proto int $request->assbackwards()
+ */
+PHP_FUNCTION(apache_request_assbackwards)
+{
+       apache_request_read_int_slot(offsetof(request_rec, assbackwards), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+
+/* {{{ proto int $request->proxyreq([int new_proxyreq])
+ */
+PHP_FUNCTION(apache_request_proxyreq)
+{
+       apache_request_int_slot(offsetof(request_rec, proxyreq), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+/* {{{ proto int $request->chunked()
+ */
+PHP_FUNCTION(apache_request_chunked)
+{
+       apache_request_read_int_slot(offsetof(request_rec, chunked), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+
+/* {{{ proto int $request->header_only()
+ */
+PHP_FUNCTION(apache_request_header_only)
+{
+       apache_request_read_int_slot(offsetof(request_rec, header_only), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+/* {{{ proto int $request->request_time()
+ */
+PHP_FUNCTION(apache_request_request_time)
+{
+       apache_request_read_int_slot(offsetof(request_rec, request_time), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+/* {{{ proto int $request->status([int new_status])
+ */
+PHP_FUNCTION(apache_request_status)
+{
+       apache_request_int_slot(offsetof(request_rec, status), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+/* {{{ proto int $request->method_number([int method_number])
+ */
+PHP_FUNCTION(apache_request_method_number)
+{
+       apache_request_read_int_slot(offsetof(request_rec, method_number), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+/* {{{ proto int $request->allowed([int allowed])
+ */
+PHP_FUNCTION(apache_request_allowed)
+{
+       apache_request_int_slot(offsetof(request_rec, allowed), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+/* {{{ proto int $request->bytes_sent()
+ */
+PHP_FUNCTION(apache_request_bytes_sent)
+{
+       apache_request_read_int_slot(offsetof(request_rec, bytes_sent), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+/* {{{ proto int $request->mtime()
+ */
+PHP_FUNCTION(apache_request_mtime)
+{
+       apache_request_read_int_slot(offsetof(request_rec, mtime), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+/* {{{ proto int $request->content_length([int new_content_length])
+ */
+PHP_FUNCTION(apache_request_content_length)
+{
+       zval *id, **zlen;
+       request_rec *r;
+
+       if (ZEND_NUM_ARGS() == 0) {
+               apache_request_read_int_slot(offsetof(request_rec, clength), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+       }
+       else if (ZEND_NUM_ARGS() > 1) {
+               WRONG_PARAM_COUNT;
+       }
+       else {
+               if (zend_get_parameters_ex(1, &zlen) == FAILURE) {
+                       RETURN_FALSE;
+               }
+
+               APREQ_GET_REQUEST(id, r);
+
+               convert_to_long_ex(zlen);
+               (void)ap_set_content_length(r, Z_LVAL_PP(zlen));
+               RETURN_TRUE;
+       }
+}
+/* }}} */
+
+/* {{{ proto int $request->remaining()
+ */
+PHP_FUNCTION(apache_request_remaining)
+{
+       apache_request_read_int_slot(offsetof(request_rec, remaining), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+/* {{{ proto int $request->no_cache()
+ */
+PHP_FUNCTION(apache_request_no_cache)
+{
+       apache_request_int_slot(offsetof(request_rec, no_cache), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+/* {{{ proto int $request->no_local_copy()
+ */
+PHP_FUNCTION(apache_request_no_local_copy)
+{
+       apache_request_int_slot(offsetof(request_rec, no_local_copy), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+/* {{{ proto int $request->read_body()
+ */
+PHP_FUNCTION(apache_request_read_body)
+{
+       apache_request_int_slot(offsetof(request_rec, read_body), 
+INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
+
+/* }}} access int slots of request_rec */
+
+/* {{{ proxy functions for the ap_* functions family
+ */
+
+/* {{{ proto int apache_request_server_port()
+ */
+PHP_FUNCTION(apache_request_server_port)
+{
+       zval *id;
+       request_rec *r;
+
+       if (ZEND_NUM_ARGS() > 0) {
+               WRONG_PARAM_COUNT;
+       }
+
+       APREQ_GET_REQUEST(id, r);
+
+       RETURN_LONG(ap_get_server_port(r));
+}
+/* }}} */
+
+/* {{{ proto int apache_request_remote_host([int type])
+ */
+PHP_FUNCTION(apache_request_remote_host)
+{
+       zval *id, **ztype;
+       request_rec *r;
+       char *res;
+       int type = REMOTE_NAME;
+
+       switch (ZEND_NUM_ARGS()) {
+               case 0:
+                       break;
+               case 1:
+                       if (zend_get_parameters_ex(1, &ztype) == FAILURE) {
+                               RETURN_FALSE;
+                       }
+                       convert_to_long_ex(ztype);
+                       type = Z_LVAL_PP(ztype);
+                       break;
+               default:
+                       WRONG_PARAM_COUNT;
+                       break;
+       }
+
+
+       APREQ_GET_REQUEST(id, r);
+
+       res = (char *)ap_get_remote_host(r->connection, r->per_dir_config, type);
+       if (res)
+               RETURN_STRING(res, 1);
+
+       RETURN_EMPTY_STRING();
+}
+/* }}} */
+
+/* {{{ proto long apache_request_update_mtime([int dependency_mtime])
+ */
+PHP_FUNCTION(apache_request_update_mtime)
+{
+       zval *id, **zmtime;
+       request_rec *r;
+       int mtime = 0;
+
+       switch (ZEND_NUM_ARGS()) {
+               case 0:
+                       break;
+               case 1:
+                       if (zend_get_parameters_ex(1, &zmtime) == FAILURE) {
+                               RETURN_FALSE;
+                       }
+                       convert_to_long_ex(zmtime);
+                       mtime = Z_LVAL_PP(zmtime);
+                       break;
+               default:
+                       WRONG_PARAM_COUNT;
+                       break;
+       }
+
+
+       APREQ_GET_REQUEST(id, r);
+
+       RETURN_LONG(ap_update_mtime(r, mtime));
+}
+/* }}} */
+
+
+/* {{{ proto void apache_request_set_etag()
+ */
+PHP_FUNCTION(apache_request_set_etag)
+{
+       zval *id;
+       request_rec *r;
+
+       if (ZEND_NUM_ARGS() > 0) {
+               WRONG_PARAM_COUNT;
+       }
+
+       APREQ_GET_REQUEST(id, r);
+
+       ap_set_etag(r);
+       RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto void apache_request_set_last_modified()
+ */
+PHP_FUNCTION(apache_request_set_last_modified)
+{
+       zval *id;
+       request_rec *r;
+
+       if (ZEND_NUM_ARGS() > 0) {
+               WRONG_PARAM_COUNT;
+       }
+
+       APREQ_GET_REQUEST(id, r);
+
+       ap_set_last_modified(r);
+       RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto long apache_request_meets_conditions()
+ */
+PHP_FUNCTION(apache_request_meets_conditions)
+{
+       zval *id;
+       request_rec *r;
+
+       if (ZEND_NUM_ARGS() > 0) {
+               WRONG_PARAM_COUNT;
+       }
+
+       APREQ_GET_REQUEST(id, r);
+
+       RETURN_LONG(ap_meets_conditions(r));
+}
+/* }}} */
+
+/* {{{ proto long apache_request_discard_request_body()
+ */
+PHP_FUNCTION(apache_request_discard_request_body)
+{
+       zval *id;
+       request_rec *r;
+
+       if (ZEND_NUM_ARGS() > 0) {
+               WRONG_PARAM_COUNT;
+       }
+
+       APREQ_GET_REQUEST(id, r);
+
+       RETURN_LONG(ap_discard_request_body(r));
+}
+/* }}} */
+
+/* {{{ proto long apache_request_satisfies()
+ */
+PHP_FUNCTION(apache_request_satisfies)
+{
+       zval *id;
+       request_rec *r;
+
+       if (ZEND_NUM_ARGS() > 0) {
+               WRONG_PARAM_COUNT;
+       }
+
+       APREQ_GET_REQUEST(id, r);
+
+       RETURN_LONG(ap_satisfies(r));
+}
+/* }}} */
+
+
+/* {{{ proto bool apache_request_is_initial_req()
+ */
+PHP_FUNCTION(apache_request_is_initial_req)
+{
+       zval *id;
+       request_rec *r;
+
+       if (ZEND_NUM_ARGS() > 0) {
+               WRONG_PARAM_COUNT;
+       }
+
+       APREQ_GET_REQUEST(id, r);
+
+       RETURN_BOOL(ap_is_initial_req(r));
+}
+/* }}} */
+
+/* {{{ proto bool apache_request_some_auth_required()
+ */
+PHP_FUNCTION(apache_request_some_auth_required)
+{
+       zval *id;
+       request_rec *r;
+
+       if (ZEND_NUM_ARGS() > 0) {
+               WRONG_PARAM_COUNT;
+       }
+
+       APREQ_GET_REQUEST(id, r);
+
+       RETURN_BOOL(ap_some_auth_required(r));
+}
+/* }}} */
+
+/* {{{ proto string apache_request_auth_type()
+ */
+PHP_FUNCTION(apache_request_auth_type)
+{
+       zval *id;
+       request_rec *r;
+       char *t;
+
+       if (ZEND_NUM_ARGS() > 0) {
+               WRONG_PARAM_COUNT;
+       }
+
+       APREQ_GET_REQUEST(id, r);
+
+       t = (char *)ap_auth_type(r);
+       if (!t)
+               RETURN_NULL();
+
+       RETURN_STRING(t, 1);
+}
+/* }}} */
+
+/* {{{ proto string apache_request_auth_name()
+ */
+PHP_FUNCTION(apache_request_auth_name)
+{
+       zval *id;
+       request_rec *r;
+       char *t;
+
+       if (ZEND_NUM_ARGS() > 0) {
+               WRONG_PARAM_COUNT;
+       }
+
+       APREQ_GET_REQUEST(id, r);
+
+       t = (char *)ap_auth_name(r);
+       if (!t)
+               RETURN_NULL();
+
+       RETURN_STRING(t, 1);
+}
+/* }}} */
+
+/* {{{ proto apache_request_basic_auth_pw()
+ */
+PHP_FUNCTION(apache_request_basic_auth_pw)
+{
+       zval *id, *zpw;
+       request_rec *r;
+       const char *pw;
+       long status;
+
+       if (ZEND_NUM_ARGS() != 1) {
+               WRONG_PARAM_COUNT;
+       }
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &zpw) == FAILURE) {
+           RETURN_NULL();
+       }
+
+       if (!PZVAL_IS_REF(zpw)) {
+           zend_error(E_WARNING, "Parameter wasn't passed by reference");
+           RETURN_NULL();
+       }
+
+
+       APREQ_GET_REQUEST(id, r);
+
+       pw = NULL;
+       status = ap_get_basic_auth_pw(r, &pw);
+       if (status == OK && pw) {
+               ZVAL_STRING(zpw, (char *)pw, 1);
+       }
+       else
+               ZVAL_NULL(zpw);
+       RETURN_LONG(status);
+}
+/* }}} */
+
+
+
+
+/* }}} */
+
+/* {{{ php_apache_request_class_functions
+ */
+static function_entry php_apache_request_class_functions[] = {
+       /* string slots */
+       PHP_FALIAS(args,                                                
+apache_request_args,                            NULL)
+       PHP_FALIAS(boundary,                                    
+apache_request_boundary,                        NULL)
+       PHP_FALIAS(content_encoding,                    
+apache_request_content_encoding,        NULL)
+       PHP_FALIAS(content_type,                                
+apache_request_content_type,            NULL)
+       PHP_FALIAS(filename,                                    
+apache_request_filename,                        NULL)
+       PHP_FALIAS(handler,                                             
+apache_request_handler,                         NULL)
+       PHP_FALIAS(hostname,                                    
+apache_request_hostname,                        NULL)
+       PHP_FALIAS(method,                                              
+apache_request_method,                          NULL)
+       PHP_FALIAS(path_info,                                   
+apache_request_path_info,                       NULL)
+       PHP_FALIAS(protocol,                                    
+apache_request_protocol,                        NULL)
+       PHP_FALIAS(status_line,                                 
+apache_request_status_line,                     NULL)
+       PHP_FALIAS(the_request,                                 
+apache_request_the_request,                     NULL)
+       PHP_FALIAS(unparsed_uri,                                
+apache_request_unparsed_uri,            NULL)
+       PHP_FALIAS(uri,                                                 
+apache_request_uri,                                     NULL)
+
+       /* int slots */
+       PHP_FALIAS(allowed,                                             
+apache_request_allowed,                         NULL)
+       PHP_FALIAS(bytes_sent,                                  
+apache_request_bytes_sent,                      NULL)
+       PHP_FALIAS(chunked,                                             
+apache_request_chunked,                         NULL)
+       PHP_FALIAS(content_length,                              
+apache_request_content_length,          NULL)
+       PHP_FALIAS(header_only,                                 
+apache_request_header_only,                     NULL)
+       PHP_FALIAS(method_number,                               
+apache_request_method_number,           NULL)
+       PHP_FALIAS(mtime,                                               
+apache_request_mtime,                           NULL)
+       PHP_FALIAS(no_cache,                                    
+apache_request_no_cache,                        NULL)
+       PHP_FALIAS(no_local_copy,                               
+apache_request_no_local_copy,           NULL)
+       PHP_FALIAS(proto_num,                                   
+apache_request_proto_num,                       NULL)
+       PHP_FALIAS(proxyreq,                                    
+apache_request_proxyreq,                        NULL)
+       PHP_FALIAS(read_body,                                   
+apache_request_read_body,                       NULL)
+       PHP_FALIAS(remaining,                                   
+apache_request_remaining,                       NULL)
+       PHP_FALIAS(request_time,                                
+apache_request_request_time,            NULL)
+       PHP_FALIAS(status,                                              
+apache_request_status,                          NULL)
+
+       /* proxy functions for the ap_* functions family */
+#undef auth_name
+#undef auth_type
+#undef discard_request_body
+#undef is_initial_req
+#undef meets_conditions
+#undef satisfies
+#undef set_etag
+#undef set_last_modified
+#undef some_auth_required
+#undef update_mtime
+       PHP_FALIAS(auth_name,                                   
+apache_request_auth_name,                               NULL)
+       PHP_FALIAS(auth_type,                                   
+apache_request_auth_type,                               NULL)
+       PHP_FALIAS(basic_auth_pw,                               
+apache_request_basic_auth_pw,                   NULL)
+       PHP_FALIAS(discard_request_body,                
+apache_request_discard_request_body,    NULL)
+       PHP_FALIAS(is_initial_req,                              
+apache_request_is_initial_req,                  NULL)
+       PHP_FALIAS(meets_conditions,                    
+apache_request_meets_conditions,                NULL)
+       PHP_FALIAS(remote_host,                                 
+apache_request_remote_host,                             NULL)
+       PHP_FALIAS(satisfies,                                   
+apache_request_satisfies,                               NULL)
+       PHP_FALIAS(server_port,                                 
+apache_request_server_port,                             NULL)
+       PHP_FALIAS(set_etag,                                    
+apache_request_set_etag,                                NULL)
+       PHP_FALIAS(set_last_modified,                   
+apache_request_set_last_modified,               NULL)
+       PHP_FALIAS(some_auth_required,                  
+apache_request_some_auth_required,              NULL)
+       PHP_FALIAS(update_mtime,                                
+apache_request_update_mtime,                    NULL)
+
+       { NULL, NULL, NULL }
+};
+/* }}} */
+
+
 static PHP_MINIT_FUNCTION(apache)
 {
+       zend_class_entry ce;
+
 #ifdef ZTS
        ts_allocate_id(&php_apache_info_id, sizeof(php_apache_info_struct), 
(ts_allocate_ctor) php_apache_globals_ctor, NULL);
 #else
        php_apache_globals_ctor(&php_apache_info TSRMLS_CC);
 #endif
        REGISTER_INI_ENTRIES();
+
+
+       le_apachereq = zend_register_list_destructors_ex(php_apache_request_free, 
+NULL, "ApacheRequest", module_number);
+       INIT_OVERLOADED_CLASS_ENTRY(ce, "ApacheRequest", 
+php_apache_request_class_functions, NULL, NULL, NULL);
+       apacherequest_class_entry = zend_register_internal_class_ex(&ce, NULL, NULL 
+TSRMLS_CC);
+
+       REGISTER_LONG_CONSTANT("OK",                            OK,                    
+                 CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("DECLINED",                      DECLINED,              
+         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("FORBIDDEN",                     FORBIDDEN,             
+         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("AUTH_REQUIRED",         AUTH_REQUIRED,          
+CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("DONE",                          DONE,                  
+         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("SERVER_ERROR",          SERVER_ERROR,           
+CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("REDIRECT",                      REDIRECT,              
+         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("BAD_REQUEST",           BAD_REQUEST,            
+CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("NOT_FOUND",                     NOT_FOUND,             
+         CONST_CS | CONST_PERSISTENT);
+
+       REGISTER_LONG_CONSTANT("M_GET",                         M_GET,                 
+         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("M_PUT",                         M_PUT,                 
+         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("M_POST",                        M_POST,                
+         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("M_DELETE",                      M_DELETE,              
+         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("M_CONNECT",                     M_CONNECT,             
+         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("M_OPTIONS",                     M_OPTIONS,             
+         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("M_TRACE",                       M_TRACE,               
+         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("M_PATCH",                       M_PATCH,               
+         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("M_PROPFIND",            M_PROPFIND,                    
+ CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("M_PROPPATCH",           M_PROPPATCH,            
+CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("M_MKCOL",                       M_MKCOL,               
+         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("M_COPY",                        M_COPY,                
+         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("M_MOVE",                        M_MOVE,                
+         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("M_LOCK",                        M_LOCK,                
+         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("M_UNLOCK",                      M_UNLOCK,              
+         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("M_INVALID",                     M_INVALID,             
+         CONST_CS | CONST_PERSISTENT);
+
+       /* Possible values for request_rec.read_body (set by handling module):
+        *    REQUEST_NO_BODY          Send 413 error if message has any body
+        *    REQUEST_CHUNKED_ERROR    Send 411 error if body without Content-Length
+        *    REQUEST_CHUNKED_DECHUNK  If chunked, remove the chunks for me.
+        *    REQUEST_CHUNKED_PASS     Pass the chunks to me without removal.
+        */
+       REGISTER_LONG_CONSTANT("REQUEST_NO_BODY",                       
+REQUEST_NO_BODY,                        CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("REQUEST_CHUNKED_ERROR",         REQUEST_CHUNKED_ERROR, 
+         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("REQUEST_CHUNKED_DECHUNK",       
+REQUEST_CHUNKED_DECHUNK,        CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("REQUEST_CHUNKED_PASS",          REQUEST_CHUNKED_PASS,  
+         CONST_CS | CONST_PERSISTENT);
+       
+       /* resolve types for remote_host() */
+       REGISTER_LONG_CONSTANT("REMOTE_HOST",                   REMOTE_HOST,           
+         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("REMOTE_NAME",                   REMOTE_NAME,           
+         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("REMOTE_NOLOOKUP",               REMOTE_NOLOOKUP,       
+         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("REMOTE_DOUBLE_REV",             REMOTE_DOUBLE_REV,     
+         CONST_CS | CONST_PERSISTENT);
+       
        return SUCCESS;
 }
 
Index: sapi/apache/php_apache_http.h
===================================================================
RCS file: /repository/php4/sapi/apache/php_apache_http.h,v
retrieving revision 1.3
diff -u -r1.3 php_apache_http.h
--- sapi/apache/php_apache_http.h       31 May 2002 04:47:19 -0000      1.3
+++ sapi/apache/php_apache_http.h       26 Aug 2002 09:26:53 -0000
@@ -36,3 +36,7 @@
 #include "ext/standard/php_standard.h"
 
 #include "mod_php4.h"
+
+
+PHPAPI zval *php_apache_request_new(request_rec *r);
+
Index: sapi/apache/sapi_apache.c
===================================================================
RCS file: /repository/php4/sapi/apache/sapi_apache.c,v
retrieving revision 1.40
diff -u -r1.40 sapi_apache.c
--- sapi/apache/sapi_apache.c   23 Apr 2002 03:01:30 -0000      1.40
+++ sapi/apache/sapi_apache.c   26 Aug 2002 09:26:53 -0000
@@ -65,6 +65,50 @@
 }
 /* }}} */
 
+/* {{{ apache_php_module_hook
+ */
+int apache_php_module_hook(request_rec *r, char *filename, zval **ret TSRMLS_DC)
+{
+       zend_file_handle file_handle;
+       zval *req;
+
+#if PHP_SIGCHILD
+       signal(SIGCHLD, sigchld_handler);
+#endif
+
+       if (AP(setup_env) != 2) {
+               fprintf(stderr, "REQUEST STARTUP\n");
+
+               if (php_request_startup(TSRMLS_C) == FAILURE)
+                       return FAILURE;
+               AP(setup_env) = 2;
+       }
+
+       /* Add PHP_SELF_HOOK - Absolute path */
+       php_register_variable("PHP_SELF_HOOK", filename, 
+PG(http_globals)[TRACK_VARS_SERVER] TSRMLS_CC);
+
+       req = php_apache_request_new(r);
+       php_register_variable_ex("request", req, NULL TSRMLS_CC);
+
+       memset(&file_handle, 0, sizeof(file_handle));
+       file_handle.type = ZEND_HANDLE_FILENAME;
+       file_handle.filename = filename;
+
+       (void) php_execute_simple_script(&file_handle, ret TSRMLS_CC);
+
+       zval_dtor(&req);
+       AP(in_request) = 0;
+
+//     zend_try {
+//             php_request_shutdown_for_hook(NULL);
+//     } zend_end_try();
+
+       return OK;
+}
+
+/* }}} */
+
+
 /*
  * Local variables:
  * tab-width: 4
Index: main/main.c
===================================================================
RCS file: /repository/php4/main/main.c,v
retrieving revision 1.481
diff -u -r1.481 main.c
--- main/main.c 20 Aug 2002 19:49:37 -0000      1.481
+++ main/main.c 26 Aug 2002 09:26:58 -0000
@@ -865,6 +865,35 @@
 }
 /* }}} */
 
+/* {{{ php_request_startup_for_hook
+ */
+int php_request_startup_for_hook(TSRMLS_D)
+{
+       int retval = SUCCESS;
+
+#if PHP_SIGCHLD
+       signal(SIGCHLD, sigchld_handler);
+#endif
+
+       zend_try {
+               PG(during_request_startup) = 1;
+               PG(modules_activated) = 0;
+               PG(header_is_being_sent) = 0;
+               PG(connection_status) = PHP_CONNECTION_NORMAL;
+               zend_activate(TSRMLS_C);
+               sapi_activate(TSRMLS_C);
+               zend_set_timeout(EG(timeout_seconds));
+               php_hash_environment(TSRMLS_C);
+               zend_activate_modules(TSRMLS_C);
+               PG(modules_activated) = 1;
+       } zend_catch {
+               retval = FAILURE;
+       } zend_end_try();
+
+       return retval;
+}
+/* }}} */
+
 /* {{{ php_request_shutdown_for_exec
  */
 void php_request_shutdown_for_exec(void *dummy)
@@ -877,6 +906,45 @@
 }
 /* }}} */
 
+/* {{{ 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)
@@ -1528,6 +1596,41 @@
        }
        free_alloca(old_cwd);
        return retval;
+}
+/* }}} */
+
+/* {{{ 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);
 }
 /* }}} */
 
Index: main/php_main.h
===================================================================
RCS file: /repository/php4/main/php_main.h,v
retrieving revision 1.22
diff -u -r1.22 php_main.h
--- main/php_main.h     2 Aug 2002 06:53:48 -0000       1.22
+++ main/php_main.h     26 Aug 2002 09:26:58 -0000
@@ -29,7 +29,9 @@
 #include "SAPI.h"
 
 PHPAPI int php_request_startup(TSRMLS_D);
+PHPAPI int php_request_startup_for_hook(TSRMLS_D);
 PHPAPI void php_request_shutdown(void *dummy);
+PHPAPI void php_request_shutdown_for_hook(void *dummy);
 PHPAPI void php_request_shutdown_for_exec(void *dummy);
 PHPAPI int php_module_startup(sapi_module_struct *sf);
 PHPAPI void php_module_shutdown(TSRMLS_D);
@@ -39,6 +41,7 @@
 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);
 

-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to