1999-09-28 12:08:34 +00:00
/*
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2001-12-11 15:32:16 +00:00
| PHP Version 4 |
1999-09-28 12:08:34 +00:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2001-12-11 15:32:16 +00:00
| Copyright ( c ) 1997 - 2002 The PHP Group |
1999-09-28 12:08:34 +00:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2000-05-18 15:34:45 +00:00
| This source file is subject to version 2.02 of the PHP license , |
1999-09-28 12:08:34 +00:00
| that is bundled with this package in the file LICENSE , and is |
| available at through the world - wide - web at |
2000-05-18 15:34:45 +00:00
| http : //www.php.net/license/2_02.txt. |
1999-09-28 12:08:34 +00:00
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world - wide - web , please send a note to |
| license @ php . net so we can mail you a copy immediately . |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2000-04-19 15:21:22 +00:00
| Authors : Zeev Suraski < zeev @ zend . com > |
2002-02-28 08:29:35 +00:00
| Ben Mansell < ben @ zeus . com > ( Zeus Support ) |
1999-09-28 12:08:34 +00:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
*/
2000-02-18 17:59:44 +00:00
# ifdef PHP_WIN32
1999-09-28 12:08:34 +00:00
# include <windows.h>
2000-02-18 17:59:44 +00:00
# include <process.h>
# else
# define __try
# define __except(val)
2000-04-12 09:48:26 +00:00
# define __declspec(foo)
1999-09-28 12:08:34 +00:00
# endif
2000-02-18 17:59:44 +00:00
1999-09-27 16:34:28 +00:00
# include <httpext.h>
# include <httpfilt.h>
# include <httpext.h>
# include "php.h"
2000-06-05 23:24:42 +00:00
# include "php_main.h"
1999-09-27 16:34:28 +00:00
# include "SAPI.h"
# include "php_globals.h"
# include "ext/standard/info.h"
2000-01-28 17:24:53 +00:00
# include "php_variables.h"
2000-02-18 17:59:44 +00:00
# include "php_ini.h"
1999-09-27 16:34:28 +00:00
1999-11-14 19:46:31 +00:00
# ifdef WITH_ZEUS
2000-04-12 09:48:26 +00:00
# include "httpext.h"
# include <errno.h>
# define GetLastError() errno
1999-11-14 19:46:31 +00:00
# endif
1999-09-28 12:08:34 +00:00
2001-07-21 14:27:56 +00:00
# ifdef PHP_WIN32
# define PHP_ENABLE_SEH
# endif
2001-01-07 23:45:24 +00:00
/*
uncomment the following lines to turn off
exception trapping when running under a debugger
# ifdef _DEBUG
2001-07-21 14:27:56 +00:00
# undef PHP_ENABLE_SEH
2001-01-07 23:45:24 +00:00
# endif
*/
1999-09-27 16:34:28 +00:00
# define MAX_STATUS_LENGTH sizeof("xxxx LONGEST STATUS DESCRIPTION")
# define ISAPI_SERVER_VAR_BUF_SIZE 1024
# define ISAPI_POST_DATA_BUF 1024
2000-02-16 16:46:01 +00:00
static zend_bool bFilterLoaded = 0 ;
2001-08-13 00:36:16 +00:00
static zend_bool bTerminateThreadsOnError = 0 ;
1999-09-27 16:34:28 +00:00
2001-01-02 22:49:31 +00:00
static char * isapi_special_server_variable_names [ ] = {
1999-09-27 16:34:28 +00:00
" ALL_HTTP " ,
2001-01-02 22:49:31 +00:00
" HTTPS " ,
# ifndef WITH_ZEUS
" SCRIPT_NAME " ,
# endif
NULL
} ;
# define NUM_SPECIAL_VARS (sizeof(isapi_special_server_variable_names) / sizeof(char *))
# define SPECIAL_VAR_ALL_HTTP 0
# define SPECIAL_VAR_HTTPS 1
# define SPECIAL_VAR_PHP_SELF 2
static char * isapi_server_variable_names [ ] = {
1999-09-27 16:34:28 +00:00
" AUTH_PASSWORD " ,
" AUTH_TYPE " ,
2000-12-13 17:11:01 +00:00
" AUTH_USER " ,
1999-09-27 16:34:28 +00:00
" CONTENT_LENGTH " ,
" CONTENT_TYPE " ,
" PATH_TRANSLATED " ,
" QUERY_STRING " ,
" REMOTE_ADDR " ,
" REMOTE_HOST " ,
" REMOTE_USER " ,
" REQUEST_METHOD " ,
" SERVER_NAME " ,
" SERVER_PORT " ,
" SERVER_PROTOCOL " ,
" SERVER_SOFTWARE " ,
2000-09-19 17:43:11 +00:00
# ifndef WITH_ZEUS
" APPL_MD_PATH " ,
" APPL_PHYSICAL_PATH " ,
" INSTANCE_ID " ,
" INSTANCE_META_PATH " ,
" LOGON_USER " ,
2000-12-15 16:18:55 +00:00
" REQUEST_URI " ,
" URL " ,
2000-12-13 17:11:01 +00:00
# else
" DOCUMENT_ROOT " ,
2000-09-19 17:43:11 +00:00
# endif
1999-09-27 16:34:28 +00:00
NULL
} ;
2001-01-02 22:49:31 +00:00
static char * isapi_secure_server_variable_names [ ] = {
" CERT_COOKIE " ,
" CERT_FLAGS " ,
" CERT_ISSUER " ,
" CERT_KEYSIZE " ,
" CERT_SECRETKEYSIZE " ,
" CERT_SERIALNUMBER " ,
" CERT_SERVER_ISSUER " ,
" CERT_SERVER_SUBJECT " ,
" CERT_SUBJECT " ,
" HTTPS_KEYSIZE " ,
" HTTPS_SECRETKEYSIZE " ,
" HTTPS_SERVER_ISSUER " ,
" HTTPS_SERVER_SUBJECT " ,
" SERVER_PORT_SECURE " ,
2001-03-07 10:28:00 +00:00
# ifdef WITH_ZEUS
" SSL_CLIENT_CN " ,
" SSL_CLIENT_EMAIL " ,
" SSL_CLIENT_OU " ,
" SSL_CLIENT_O " ,
" SSL_CLIENT_L " ,
" SSL_CLIENT_ST " ,
" SSL_CLIENT_C " ,
" SSL_CLIENT_I_CN " ,
" SSL_CLIENT_I_EMAIL " ,
" SSL_CLIENT_I_OU " ,
" SSL_CLIENT_I_O " ,
" SSL_CLIENT_I_L " ,
" SSL_CLIENT_I_ST " ,
" SSL_CLIENT_I_C " ,
# endif
2001-01-02 22:49:31 +00:00
NULL
} ;
1999-09-27 16:34:28 +00:00
static void php_info_isapi ( ZEND_MODULE_INFO_FUNC_ARGS )
{
2001-01-02 22:49:31 +00:00
char * * p ;
1999-09-27 16:34:28 +00:00
char variable_buf [ ISAPI_SERVER_VAR_BUF_SIZE ] ;
DWORD variable_len ;
2001-01-02 22:49:31 +00:00
char * * all_variables [ ] = {
isapi_server_variable_names ,
isapi_special_server_variable_names ,
isapi_secure_server_variable_names ,
NULL
} ;
char * * * server_variable_names ;
1999-09-27 16:34:28 +00:00
LPEXTENSION_CONTROL_BLOCK lpECB ;
lpECB = ( LPEXTENSION_CONTROL_BLOCK ) SG ( server_context ) ;
2000-04-07 16:50:55 +00:00
php_info_print_table_start ( ) ;
1999-09-27 16:34:28 +00:00
php_info_print_table_header ( 2 , " Server Variable " , " Value " ) ;
2001-01-02 22:49:31 +00:00
server_variable_names = all_variables ;
while ( * server_variable_names ) {
p = * server_variable_names ;
while ( * p ) {
variable_len = ISAPI_SERVER_VAR_BUF_SIZE ;
if ( lpECB - > GetServerVariable ( lpECB - > ConnID , * p , variable_buf , & variable_len )
1999-09-27 16:34:28 +00:00
& & variable_buf [ 0 ] ) {
2001-01-02 22:49:31 +00:00
php_info_print_table_row ( 2 , * p , variable_buf ) ;
} else if ( GetLastError ( ) = = ERROR_INSUFFICIENT_BUFFER ) {
char * tmp_variable_buf ;
tmp_variable_buf = ( char * ) emalloc ( variable_len ) ;
if ( lpECB - > GetServerVariable ( lpECB - > ConnID , * p , tmp_variable_buf , & variable_len )
& & variable_buf [ 0 ] ) {
php_info_print_table_row ( 2 , * p , tmp_variable_buf ) ;
}
efree ( tmp_variable_buf ) ;
1999-09-27 16:34:28 +00:00
}
2001-01-02 22:49:31 +00:00
p + + ;
1999-09-27 16:34:28 +00:00
}
2001-01-02 22:49:31 +00:00
server_variable_names + + ;
1999-09-27 16:34:28 +00:00
}
2000-04-07 16:50:55 +00:00
php_info_print_table_end ( ) ;
1999-09-27 16:34:28 +00:00
}
static zend_module_entry php_isapi_module = {
2001-10-12 12:11:48 +00:00
STANDARD_MODULE_HEADER ,
1999-09-27 16:34:28 +00:00
" ISAPI " ,
NULL ,
NULL ,
NULL ,
NULL ,
NULL ,
php_info_isapi ,
2001-10-12 12:11:48 +00:00
NULL ,
1999-09-27 16:34:28 +00:00
STANDARD_MODULE_PROPERTIES
} ;
2001-08-05 15:29:47 +00:00
static int sapi_isapi_ub_write ( const char * str , uint str_length TSRMLS_DC )
1999-09-27 16:34:28 +00:00
{
DWORD num_bytes = str_length ;
LPEXTENSION_CONTROL_BLOCK ecb ;
ecb = ( LPEXTENSION_CONTROL_BLOCK ) SG ( server_context ) ;
2002-03-19 19:15:40 +00:00
if ( ecb - > WriteClient ( ecb - > ConnID , ( char * ) str , & num_bytes , HSE_IO_SYNC ) = = FALSE ) {
2000-10-29 16:14:27 +00:00
php_handle_aborted_connection ( ) ;
2000-02-16 13:34:07 +00:00
}
1999-09-27 16:34:28 +00:00
return num_bytes ;
}
2001-07-28 11:36:37 +00:00
static int sapi_isapi_header_handler ( sapi_header_struct * sapi_header , sapi_headers_struct * sapi_headers TSRMLS_DC )
1999-09-27 16:34:28 +00:00
{
return SAPI_HEADER_ADD ;
}
2001-07-31 04:53:54 +00:00
static void accumulate_header_length ( sapi_header_struct * sapi_header , uint * total_length TSRMLS_DC )
1999-09-27 16:34:28 +00:00
{
* total_length + = sapi_header - > header_len + 2 ;
}
2001-07-31 04:53:54 +00:00
static void concat_header ( sapi_header_struct * sapi_header , char * * combined_headers_ptr TSRMLS_DC )
1999-09-27 16:34:28 +00:00
{
memcpy ( * combined_headers_ptr , sapi_header - > header , sapi_header - > header_len ) ;
* combined_headers_ptr + = sapi_header - > header_len ;
* * combined_headers_ptr = ' \r ' ;
( * combined_headers_ptr ) + + ;
* * combined_headers_ptr = ' \n ' ;
( * combined_headers_ptr ) + + ;
}
2001-07-28 11:36:37 +00:00
static int sapi_isapi_send_headers ( sapi_headers_struct * sapi_headers TSRMLS_DC )
1999-09-27 16:34:28 +00:00
{
uint total_length = 2 ; /* account for the trailing \r\n */
char * combined_headers , * combined_headers_ptr ;
LPEXTENSION_CONTROL_BLOCK lpECB = ( LPEXTENSION_CONTROL_BLOCK ) SG ( server_context ) ;
HSE_SEND_HEADER_EX_INFO header_info ;
char status_buf [ MAX_STATUS_LENGTH ] ;
2000-02-26 05:03:41 +00:00
sapi_header_struct default_content_type ;
1999-09-27 16:34:28 +00:00
/* Obtain headers length */
if ( SG ( sapi_headers ) . send_default_content_type ) {
2001-07-28 11:36:37 +00:00
sapi_get_default_content_type_header ( & default_content_type TSRMLS_CC ) ;
2001-07-31 04:53:54 +00:00
accumulate_header_length ( & default_content_type , ( void * ) & total_length TSRMLS_CC ) ;
1999-09-27 16:34:28 +00:00
}
2001-07-31 04:53:54 +00:00
zend_llist_apply_with_argument ( & SG ( sapi_headers ) . headers , ( llist_apply_with_arg_func_t ) accumulate_header_length , ( void * ) & total_length TSRMLS_CC ) ;
1999-09-27 16:34:28 +00:00
/* Generate headers */
combined_headers = ( char * ) emalloc ( total_length + 1 ) ;
combined_headers_ptr = combined_headers ;
if ( SG ( sapi_headers ) . send_default_content_type ) {
2001-07-31 04:53:54 +00:00
concat_header ( & default_content_type , ( void * ) & combined_headers_ptr TSRMLS_CC ) ;
2000-02-26 05:03:41 +00:00
sapi_free_header ( & default_content_type ) ; /* we no longer need it */
1999-09-27 16:34:28 +00:00
}
2001-07-31 04:53:54 +00:00
zend_llist_apply_with_argument ( & SG ( sapi_headers ) . headers , ( llist_apply_with_arg_func_t ) concat_header , ( void * ) & combined_headers_ptr TSRMLS_CC ) ;
1999-09-27 16:34:28 +00:00
* combined_headers_ptr + + = ' \r ' ;
* combined_headers_ptr + + = ' \n ' ;
* combined_headers_ptr = 0 ;
switch ( SG ( sapi_headers ) . http_response_code ) {
case 200 :
header_info . pszStatus = " 200 OK " ;
break ;
case 302 :
header_info . pszStatus = " 302 Moved Temporarily " ;
break ;
case 401 :
header_info . pszStatus = " 401 Authorization Required " ;
break ;
default :
snprintf ( status_buf , MAX_STATUS_LENGTH , " %d Undescribed " , SG ( sapi_headers ) . http_response_code ) ;
header_info . pszStatus = status_buf ;
break ;
}
header_info . cchStatus = strlen ( header_info . pszStatus ) ;
header_info . pszHeader = combined_headers ;
header_info . cchHeader = total_length ;
2001-12-22 03:11:46 +00:00
header_info . fKeepConn = FALSE ;
1999-09-27 16:34:28 +00:00
lpECB - > dwHttpStatusCode = SG ( sapi_headers ) . http_response_code ;
lpECB - > ServerSupportFunction ( lpECB - > ConnID , HSE_REQ_SEND_RESPONSE_HEADER_EX , & header_info , NULL , NULL ) ;
efree ( combined_headers ) ;
return SAPI_HEADER_SENT_SUCCESSFULLY ;
}
static int php_isapi_startup ( sapi_module_struct * sapi_module )
{
if ( php_module_startup ( sapi_module ) = = FAILURE
2000-02-02 17:19:36 +00:00
| | zend_startup_module ( & php_isapi_module ) = = FAILURE ) {
1999-09-27 16:34:28 +00:00
return FAILURE ;
} else {
2001-08-13 00:36:16 +00:00
bTerminateThreadsOnError = ( zend_bool ) INI_INT ( " isapi.terminate_threads_on_error " ) ;
1999-09-27 16:34:28 +00:00
return SUCCESS ;
}
}
2001-07-28 11:36:37 +00:00
static int sapi_isapi_read_post ( char * buffer , uint count_bytes TSRMLS_DC )
1999-09-27 16:34:28 +00:00
{
LPEXTENSION_CONTROL_BLOCK lpECB = ( LPEXTENSION_CONTROL_BLOCK ) SG ( server_context ) ;
DWORD read_from_buf = 0 ;
DWORD read_from_input = 0 ;
DWORD total_read = 0 ;
2000-04-05 18:06:13 +00:00
if ( ( DWORD ) SG ( read_post_bytes ) < lpECB - > cbAvailable ) {
1999-09-27 16:34:28 +00:00
read_from_buf = MIN ( lpECB - > cbAvailable - SG ( read_post_bytes ) , count_bytes ) ;
memcpy ( buffer , lpECB - > lpbData + SG ( read_post_bytes ) , read_from_buf ) ;
total_read + = read_from_buf ;
}
if ( read_from_buf < count_bytes
& & ( SG ( read_post_bytes ) + read_from_buf ) < lpECB - > cbTotalBytes ) {
DWORD cbRead = 0 , cbSize ;
read_from_input = MIN ( count_bytes - read_from_buf , lpECB - > cbTotalBytes - SG ( read_post_bytes ) - read_from_buf ) ;
while ( cbRead < read_from_input ) {
cbSize = read_from_input - cbRead ;
if ( ! lpECB - > ReadClient ( lpECB - > ConnID , buffer + read_from_buf + cbRead , & cbSize ) | | cbSize = = 0 ) {
break ;
}
cbRead + = cbSize ;
}
total_read + = cbRead ;
}
return total_read ;
}
2001-07-28 11:36:37 +00:00
static char * sapi_isapi_read_cookies ( TSRMLS_D )
1999-09-27 16:34:28 +00:00
{
LPEXTENSION_CONTROL_BLOCK lpECB = ( LPEXTENSION_CONTROL_BLOCK ) SG ( server_context ) ;
char variable_buf [ ISAPI_SERVER_VAR_BUF_SIZE ] ;
DWORD variable_len = ISAPI_SERVER_VAR_BUF_SIZE ;
if ( lpECB - > GetServerVariable ( lpECB - > ConnID , " HTTP_COOKIE " , variable_buf , & variable_len ) ) {
return estrndup ( variable_buf , variable_len ) ;
} else if ( GetLastError ( ) = = ERROR_INSUFFICIENT_BUFFER ) {
char * tmp_variable_buf = ( char * ) emalloc ( variable_len + 1 ) ;
if ( lpECB - > GetServerVariable ( lpECB - > ConnID , " HTTP_COOKIE " , tmp_variable_buf , & variable_len ) ) {
tmp_variable_buf [ variable_len ] = 0 ;
return tmp_variable_buf ;
} else {
efree ( tmp_variable_buf ) ;
}
}
return NULL ;
}
2001-01-02 22:49:31 +00:00
# ifdef WITH_ZEUS
2001-03-07 10:28:00 +00:00
2001-07-28 11:36:37 +00:00
static void sapi_isapi_register_zeus_ssl_variables ( LPEXTENSION_CONTROL_BLOCK lpECB , zval * track_vars_array TSRMLS_DC )
2001-03-07 10:28:00 +00:00
{
char static_variable_buf [ ISAPI_SERVER_VAR_BUF_SIZE ] ;
DWORD variable_len = ISAPI_SERVER_VAR_BUF_SIZE ;
char static_cons_buf [ ISAPI_SERVER_VAR_BUF_SIZE ] ;
/*
* We need to construct the / C = . . . / ST = . . .
* DN ' s for SSL_CLIENT_DN and SSL_CLIENT_I_DN
*/
strcpy ( static_cons_buf , " /C= " ) ;
if ( lpECB - > GetServerVariable ( lpECB - > ConnID , " SSL_CLIENT_C " , static_variable_buf , & variable_len ) & & static_variable_buf [ 0 ] ) {
strcat ( static_cons_buf , static_variable_buf ) ;
}
strcat ( static_cons_buf , " /ST= " ) ;
variable_len = ISAPI_SERVER_VAR_BUF_SIZE ;
if ( lpECB - > GetServerVariable ( lpECB - > ConnID , " SSL_CLIENT_ST " , static_variable_buf , & variable_len ) & & static_variable_buf [ 0 ] ) {
strcat ( static_cons_buf , static_variable_buf ) ;
}
2001-07-28 11:36:37 +00:00
php_register_variable ( " SSL_CLIENT_DN " , static_cons_buf , track_vars_array TSRMLS_CC ) ;
2001-03-07 10:28:00 +00:00
strcpy ( static_cons_buf , " /C= " ) ;
variable_len = ISAPI_SERVER_VAR_BUF_SIZE ;
if ( lpECB - > GetServerVariable ( lpECB - > ConnID , " SSL_CLIENT_I_C " , static_variable_buf , & variable_len ) & & static_variable_buf [ 0 ] ) {
strcat ( static_cons_buf , static_variable_buf ) ;
}
strcat ( static_cons_buf , " /ST= " ) ;
variable_len = ISAPI_SERVER_VAR_BUF_SIZE ;
if ( lpECB - > GetServerVariable ( lpECB - > ConnID , " SSL_CLIENT_I_ST " , static_variable_buf , & variable_len ) & & static_variable_buf [ 0 ] ) {
strcat ( static_cons_buf , static_variable_buf ) ;
}
2001-07-28 11:36:37 +00:00
php_register_variable ( " SSL_CLIENT_I_DN " , static_cons_buf , track_vars_array TSRMLS_CC ) ;
2001-03-07 10:28:00 +00:00
}
2001-07-28 11:36:37 +00:00
static void sapi_isapi_register_zeus_variables ( LPEXTENSION_CONTROL_BLOCK lpECB , zval * track_vars_array TSRMLS_DC )
2000-01-28 17:24:53 +00:00
{
char static_variable_buf [ ISAPI_SERVER_VAR_BUF_SIZE ] ;
DWORD variable_len = ISAPI_SERVER_VAR_BUF_SIZE ;
2001-01-16 10:44:52 +00:00
DWORD scriptname_len = ISAPI_SERVER_VAR_BUF_SIZE ;
DWORD pathinfo_len = 0 ;
2000-01-28 17:24:53 +00:00
char * strtok_buf = NULL ;
2001-01-16 10:44:52 +00:00
/* Get SCRIPT_NAME, we use this to work out which bit of the URL
* belongs in PHP ' s version of PATH_INFO
*/
lpECB - > GetServerVariable ( lpECB - > ConnID , " SCRIPT_NAME " , static_variable_buf , & scriptname_len ) ;
/* Adjust Zeus' version of PATH_INFO, set PHP_SELF,
* and generate REQUEST_URI
*/
if ( lpECB - > GetServerVariable ( lpECB - > ConnID , " PATH_INFO " , static_variable_buf , & variable_len ) & & static_variable_buf [ 0 ] ) {
/* PHP_SELF is just PATH_INFO */
2001-07-28 11:36:37 +00:00
php_register_variable ( " PHP_SELF " , static_variable_buf , track_vars_array TSRMLS_CC ) ;
2001-01-16 10:44:52 +00:00
/* Chop off filename to get just the 'real' PATH_INFO' */
pathinfo_len = variable_len - scriptname_len ;
2001-07-28 11:36:37 +00:00
php_register_variable ( " PATH_INFO " , static_variable_buf + scriptname_len - 1 , track_vars_array TSRMLS_CC ) ;
2001-01-16 10:44:52 +00:00
/* append query string to give url... extra byte for '?' */
if ( strlen ( lpECB - > lpszQueryString ) + variable_len + 1 < ISAPI_SERVER_VAR_BUF_SIZE ) {
2000-12-15 16:18:55 +00:00
/* append query string only if it is present... */
if ( strlen ( lpECB - > lpszQueryString ) ) {
static_variable_buf [ variable_len - 1 ] = ' ? ' ;
strcpy ( static_variable_buf + variable_len , lpECB - > lpszQueryString ) ;
}
2001-07-28 11:36:37 +00:00
php_register_variable ( " URL " , static_variable_buf , track_vars_array TSRMLS_CC ) ;
php_register_variable ( " REQUEST_URI " , static_variable_buf , track_vars_array TSRMLS_CC ) ;
2001-01-16 10:44:52 +00:00
}
}
/* Get and adjust PATH_TRANSLATED to what PHP wants */
variable_len = ISAPI_SERVER_VAR_BUF_SIZE ;
if ( lpECB - > GetServerVariable ( lpECB - > ConnID , " PATH_TRANSLATED " , static_variable_buf , & variable_len ) & & static_variable_buf [ 0 ] ) {
static_variable_buf [ variable_len - pathinfo_len - 1 ] = ' \0 ' ;
2001-07-28 11:36:37 +00:00
php_register_variable ( " PATH_TRANSLATED " , static_variable_buf , track_vars_array TSRMLS_CC ) ;
2001-01-16 10:44:52 +00:00
}
2001-02-27 13:29:21 +00:00
/* Bring in the AUTHENTICATION stuff as needed */
variable_len = ISAPI_SERVER_VAR_BUF_SIZE ;
if ( lpECB - > GetServerVariable ( lpECB - > ConnID , " AUTH_USER " , static_variable_buf , & variable_len ) & & static_variable_buf [ 0 ] ) {
2001-07-28 11:36:37 +00:00
php_register_variable ( " PHP_AUTH_USER " , static_variable_buf , track_vars_array TSRMLS_CC ) ;
2001-02-27 13:29:21 +00:00
}
variable_len = ISAPI_SERVER_VAR_BUF_SIZE ;
if ( lpECB - > GetServerVariable ( lpECB - > ConnID , " AUTH_PASSWORD " , static_variable_buf , & variable_len ) & & static_variable_buf [ 0 ] ) {
2001-07-28 11:36:37 +00:00
php_register_variable ( " PHP_AUTH_PW " , static_variable_buf , track_vars_array TSRMLS_CC ) ;
2001-02-27 13:29:21 +00:00
}
variable_len = ISAPI_SERVER_VAR_BUF_SIZE ;
if ( lpECB - > GetServerVariable ( lpECB - > ConnID , " AUTH_TYPE " , static_variable_buf , & variable_len ) & & static_variable_buf [ 0 ] ) {
2001-07-28 11:36:37 +00:00
php_register_variable ( " PHP_AUTH_TYPE " , static_variable_buf , track_vars_array TSRMLS_CC ) ;
2001-02-27 13:29:21 +00:00
}
2001-03-07 10:28:00 +00:00
/* And now, for the SSL variables (if applicable) */
variable_len = ISAPI_SERVER_VAR_BUF_SIZE ;
if ( lpECB - > GetServerVariable ( lpECB - > ConnID , " CERT_COOKIE " , static_variable_buf , & variable_len ) & & static_variable_buf [ 0 ] ) {
2001-07-28 11:36:37 +00:00
sapi_isapi_register_zeus_ssl_variables ( lpECB , track_vars_array TSRMLS_CC ) ;
2001-03-07 10:28:00 +00:00
}
/* Copy some of the variables we need to meet Apache specs */
variable_len = ISAPI_SERVER_VAR_BUF_SIZE ;
if ( lpECB - > GetServerVariable ( lpECB - > ConnID , " SERVER_SOFTWARE " , static_variable_buf , & variable_len ) & & static_variable_buf [ 0 ] ) {
2001-07-28 11:36:37 +00:00
php_register_variable ( " SERVER_SIGNATURE " , static_variable_buf , track_vars_array TSRMLS_CC ) ;
2001-03-07 10:28:00 +00:00
}
2001-01-02 22:49:31 +00:00
}
2000-12-15 16:18:55 +00:00
# endif
2000-02-13 01:14:45 +00:00
2001-07-28 11:36:37 +00:00
static void sapi_isapi_register_server_variables2 ( char * * server_variables , LPEXTENSION_CONTROL_BLOCK lpECB , zval * track_vars_array , char * * recorded_values TSRMLS_DC )
2001-01-02 22:49:31 +00:00
{
char * * p = server_variables ;
DWORD variable_len ;
char static_variable_buf [ ISAPI_SERVER_VAR_BUF_SIZE ] ;
char * variable_buf ;
2000-02-13 01:14:45 +00:00
2001-01-02 22:49:31 +00:00
while ( * p ) {
variable_len = ISAPI_SERVER_VAR_BUF_SIZE ;
if ( lpECB - > GetServerVariable ( lpECB - > ConnID , * p , static_variable_buf , & variable_len )
& & static_variable_buf [ 0 ] ) {
2001-07-28 11:36:37 +00:00
php_register_variable ( * p , static_variable_buf , track_vars_array TSRMLS_CC ) ;
2001-01-02 22:49:31 +00:00
if ( recorded_values ) {
recorded_values [ p - server_variables ] = estrndup ( static_variable_buf , variable_len ) ;
}
} else if ( GetLastError ( ) = = ERROR_INSUFFICIENT_BUFFER ) {
2002-04-18 22:51:23 +00:00
variable_buf = ( char * ) emalloc ( variable_len + 1 ) ;
2001-01-02 22:49:31 +00:00
if ( lpECB - > GetServerVariable ( lpECB - > ConnID , * p , variable_buf , & variable_len )
& & variable_buf [ 0 ] ) {
2001-07-28 11:36:37 +00:00
php_register_variable ( * p , variable_buf , track_vars_array TSRMLS_CC ) ;
2001-01-02 22:49:31 +00:00
}
if ( recorded_values ) {
recorded_values [ p - server_variables ] = variable_buf ;
} else {
2000-01-28 17:24:53 +00:00
efree ( variable_buf ) ;
}
}
2001-01-02 22:49:31 +00:00
p + + ;
}
}
2001-07-30 08:24:42 +00:00
static void sapi_isapi_register_server_variables ( zval * track_vars_array TSRMLS_DC )
2001-01-02 22:49:31 +00:00
{
DWORD variable_len = ISAPI_SERVER_VAR_BUF_SIZE ;
char * variable ;
char * strtok_buf = NULL ;
2001-02-16 16:01:34 +00:00
char * isapi_special_server_variables [ NUM_SPECIAL_VARS ] ;
2001-01-02 22:49:31 +00:00
LPEXTENSION_CONTROL_BLOCK lpECB ;
lpECB = ( LPEXTENSION_CONTROL_BLOCK ) SG ( server_context ) ;
/* Register the special ISAPI variables */
memset ( isapi_special_server_variables , 0 , sizeof ( isapi_special_server_variables ) ) ;
2001-07-28 11:36:37 +00:00
sapi_isapi_register_server_variables2 ( isapi_special_server_variable_names , lpECB , track_vars_array , isapi_special_server_variables TSRMLS_CC ) ;
2001-01-02 22:49:31 +00:00
if ( SG ( request_info ) . cookie_data ) {
2001-07-28 11:36:37 +00:00
php_register_variable ( " HTTP_COOKIE " , SG ( request_info ) . cookie_data , track_vars_array TSRMLS_CC ) ;
2001-01-02 22:49:31 +00:00
}
/* Register the standard ISAPI variables */
2001-07-28 11:36:37 +00:00
sapi_isapi_register_server_variables2 ( isapi_server_variable_names , lpECB , track_vars_array , NULL TSRMLS_CC ) ;
2001-01-02 22:49:31 +00:00
if ( isapi_special_server_variables [ SPECIAL_VAR_HTTPS ]
& & atoi ( isapi_special_server_variables [ SPECIAL_VAR_HTTPS ] ) ) {
/* Register SSL ISAPI variables */
2001-07-28 11:36:37 +00:00
sapi_isapi_register_server_variables2 ( isapi_secure_server_variable_names , lpECB , track_vars_array , NULL TSRMLS_CC ) ;
2001-01-02 22:49:31 +00:00
}
2001-01-07 23:45:24 +00:00
if ( isapi_special_server_variables [ SPECIAL_VAR_HTTPS ] ) {
efree ( isapi_special_server_variables [ SPECIAL_VAR_HTTPS ] ) ;
}
2001-01-02 22:49:31 +00:00
# ifdef WITH_ZEUS
2001-07-28 11:36:37 +00:00
sapi_isapi_register_zeus_variables ( lpECB , track_vars_array TSRMLS_CC ) ;
2001-01-02 22:49:31 +00:00
# endif
/* PHP_SELF support */
if ( isapi_special_server_variables [ SPECIAL_VAR_PHP_SELF ] ) {
2001-07-28 11:36:37 +00:00
php_register_variable ( " PHP_SELF " , isapi_special_server_variables [ SPECIAL_VAR_PHP_SELF ] , track_vars_array TSRMLS_CC ) ;
2001-01-02 22:49:31 +00:00
efree ( isapi_special_server_variables [ SPECIAL_VAR_PHP_SELF ] ) ;
2000-01-28 17:24:53 +00:00
}
2001-01-02 22:49:31 +00:00
if ( isapi_special_server_variables [ SPECIAL_VAR_ALL_HTTP ] ) {
/* Register the internal bits of ALL_HTTP */
variable = php_strtok_r ( isapi_special_server_variables [ SPECIAL_VAR_ALL_HTTP ] , " \r \n " , & strtok_buf ) ;
while ( variable ) {
char * colon = strchr ( variable , ' : ' ) ;
2000-01-28 17:24:53 +00:00
2001-01-02 22:49:31 +00:00
if ( colon ) {
char * value = colon + 1 ;
while ( * value = = ' ' ) {
value + + ;
}
* colon = 0 ;
2001-07-28 11:36:37 +00:00
php_register_variable ( variable , value , track_vars_array TSRMLS_CC ) ;
2001-01-02 22:49:31 +00:00
* colon = ' : ' ;
2000-01-28 17:24:53 +00:00
}
2001-01-02 22:49:31 +00:00
variable = php_strtok_r ( NULL , " \r \n " , & strtok_buf ) ;
2000-01-28 17:24:53 +00:00
}
2001-01-02 22:49:31 +00:00
efree ( isapi_special_server_variables [ SPECIAL_VAR_ALL_HTTP ] ) ;
2000-01-28 17:24:53 +00:00
}
2000-08-07 11:51:21 +00:00
# ifdef PHP_WIN32
{
HSE_URL_MAPEX_INFO humi ;
2000-08-09 16:45:40 +00:00
DWORD path_len = 2 ;
char path [ ] = " / " ;
2000-08-07 11:51:21 +00:00
2000-08-09 16:45:40 +00:00
if ( lpECB - > ServerSupportFunction ( lpECB - > ConnID , HSE_REQ_MAP_URL_TO_PATH_EX , path , & path_len , ( LPDWORD ) & humi ) ) {
/* Remove trailing \ */
if ( humi . lpszPath [ path_len - 2 ] = = ' \\ ' ) {
humi . lpszPath [ path_len - 2 ] = 0 ;
}
2001-07-28 11:36:37 +00:00
php_register_variable ( " DOCUMENT_ROOT " , humi . lpszPath , track_vars_array TSRMLS_CC ) ;
2000-08-07 11:51:21 +00:00
}
}
# endif
2000-01-28 17:24:53 +00:00
}
2001-01-02 22:49:31 +00:00
static sapi_module_struct isapi_sapi_module = {
2000-06-26 18:05:55 +00:00
" isapi " , /* name */
" ISAPI " , /* pretty name */
1999-09-27 16:34:28 +00:00
php_isapi_startup , /* startup */
php_module_shutdown_wrapper , /* shutdown */
2000-02-10 16:44:59 +00:00
NULL , /* activate */
NULL , /* deactivate */
2000-01-13 17:37:25 +00:00
sapi_isapi_ub_write , /* unbuffered write */
NULL , /* flush */
2000-02-10 17:26:57 +00:00
NULL , /* get uid */
2000-02-10 17:55:01 +00:00
NULL , /* getenv */
1999-09-27 16:34:28 +00:00
php_error , /* error handler */
sapi_isapi_header_handler , /* header handler */
sapi_isapi_send_headers , /* send headers handler */
NULL , /* send header handler */
sapi_isapi_read_post , /* read POST data */
sapi_isapi_read_cookies , /* read Cookies */
2000-01-28 17:24:53 +00:00
sapi_isapi_register_server_variables , /* register server variables */
2000-02-10 15:55:10 +00:00
NULL , /* Log message */
2000-01-28 17:24:53 +00:00
2000-02-10 18:44:33 +00:00
NULL , /* Block interruptions */
NULL , /* Unblock interruptions */
1999-09-27 16:34:28 +00:00
STANDARD_SAPI_MODULE_PROPERTIES
} ;
BOOL WINAPI GetFilterVersion ( PHTTP_FILTER_VERSION pFilterVersion )
{
2000-02-16 16:46:01 +00:00
bFilterLoaded = 1 ;
1999-09-27 16:34:28 +00:00
pFilterVersion - > dwFilterVersion = HTTP_FILTER_REVISION ;
2001-01-02 22:49:31 +00:00
strcpy ( pFilterVersion - > lpszFilterDesc , isapi_sapi_module . pretty_name ) ;
1999-09-27 16:34:28 +00:00
pFilterVersion - > dwFlags = ( SF_NOTIFY_AUTHENTICATION | SF_NOTIFY_PREPROC_HEADERS ) ;
return TRUE ;
}
DWORD WINAPI HttpFilterProc ( PHTTP_FILTER_CONTEXT pfc , DWORD notificationType , LPVOID pvNotification )
{
2001-07-28 11:36:37 +00:00
TSRMLS_FETCH ( ) ;
1999-09-27 16:34:28 +00:00
switch ( notificationType ) {
case SF_NOTIFY_PREPROC_HEADERS :
2000-02-16 16:46:01 +00:00
SG ( request_info ) . auth_user = NULL ;
SG ( request_info ) . auth_password = NULL ;
1999-09-27 16:34:28 +00:00
break ;
case SF_NOTIFY_AUTHENTICATION : {
char * auth_user = ( ( HTTP_FILTER_AUTHENT * ) pvNotification ) - > pszUser ;
char * auth_password = ( ( HTTP_FILTER_AUTHENT * ) pvNotification ) - > pszPassword ;
if ( auth_user & & auth_user [ 0 ] ) {
2000-02-16 16:46:01 +00:00
SG ( request_info ) . auth_user = estrdup ( auth_user ) ;
2001-01-16 10:44:52 +00:00
}
1999-09-27 16:34:28 +00:00
if ( auth_password & & auth_password [ 0 ] ) {
2000-02-16 16:46:01 +00:00
SG ( request_info ) . auth_password = estrdup ( auth_password ) ;
1999-09-27 16:34:28 +00:00
}
return SF_STATUS_REQ_HANDLED_NOTIFICATION ;
}
break ;
}
return SF_STATUS_REQ_NEXT_NOTIFICATION ;
}
2001-07-30 08:24:42 +00:00
static void init_request_info ( LPEXTENSION_CONTROL_BLOCK lpECB TSRMLS_DC )
1999-09-27 16:34:28 +00:00
{
SG ( request_info ) . request_method = lpECB - > lpszMethod ;
SG ( request_info ) . query_string = lpECB - > lpszQueryString ;
SG ( request_info ) . path_translated = lpECB - > lpszPathTranslated ;
SG ( request_info ) . request_uri = lpECB - > lpszPathInfo ;
SG ( request_info ) . content_type = lpECB - > lpszContentType ;
SG ( request_info ) . content_length = lpECB - > cbTotalBytes ;
2000-08-02 22:48:45 +00:00
SG ( sapi_headers ) . http_response_code = 200 ; /* I think dwHttpStatusCode is invalid at this stage -RL */
2000-02-16 16:46:01 +00:00
if ( ! bFilterLoaded ) { /* we don't have valid ISAPI Filter information */
SG ( request_info ) . auth_user = SG ( request_info ) . auth_password = NULL ;
2000-02-15 23:31:10 +00:00
}
1999-09-27 16:34:28 +00:00
}
2001-07-28 11:36:37 +00:00
static void php_isapi_report_exception ( char * message , int message_len TSRMLS_DC )
2000-02-13 01:24:51 +00:00
{
if ( ! SG ( headers_sent ) ) {
HSE_SEND_HEADER_EX_INFO header_info ;
LPEXTENSION_CONTROL_BLOCK lpECB = ( LPEXTENSION_CONTROL_BLOCK ) SG ( server_context ) ;
header_info . pszStatus = " 500 Internal Server Error " ;
header_info . cchStatus = strlen ( header_info . pszStatus ) ;
header_info . pszHeader = " Content-Type: text/html \r \n \r \n " ;
header_info . cchHeader = strlen ( header_info . pszHeader ) ;
lpECB - > dwHttpStatusCode = 500 ;
lpECB - > ServerSupportFunction ( lpECB - > ConnID , HSE_REQ_SEND_RESPONSE_HEADER_EX , & header_info , NULL , NULL ) ;
SG ( headers_sent ) = 1 ;
}
2001-08-06 16:53:16 +00:00
sapi_isapi_ub_write ( message , message_len TSRMLS_CC ) ;
2000-02-13 01:24:51 +00:00
}
1999-09-27 16:34:28 +00:00
BOOL WINAPI GetExtensionVersion ( HSE_VERSION_INFO * pVer )
{
pVer - > dwExtensionVersion = HSE_VERSION ;
2000-04-12 09:48:26 +00:00
# ifdef WITH_ZEUS
2001-01-02 22:49:31 +00:00
strncpy ( pVer - > lpszExtensionDesc , isapi_sapi_module . name , HSE_MAX_EXT_DLL_NAME_LEN ) ;
2000-04-12 09:48:26 +00:00
# else
2001-01-02 22:49:31 +00:00
lstrcpyn ( pVer - > lpszExtensionDesc , isapi_sapi_module . name , HSE_MAX_EXT_DLL_NAME_LEN ) ;
2000-04-12 09:48:26 +00:00
# endif
1999-09-27 16:34:28 +00:00
return TRUE ;
}
2001-08-13 00:36:16 +00:00
static void my_endthread ( )
2001-08-11 16:39:07 +00:00
{
2001-08-13 00:36:16 +00:00
# ifdef PHP_WIN32
if ( bTerminateThreadsOnError ) {
_endthread ( ) ;
2000-02-18 17:59:44 +00:00
}
2001-08-13 00:36:16 +00:00
# endif
}
2001-08-11 16:39:07 +00:00
2001-08-13 00:36:16 +00:00
# ifdef PHP_WIN32
/* ep is accessible only in the context of the __except expression,
* so we have to call this function to obtain it .
*/
BOOL exceptionhandler ( LPEXCEPTION_POINTERS * e , LPEXCEPTION_POINTERS ep )
{
* e = ep ;
return TRUE ;
2000-03-19 17:59:05 +00:00
}
2000-03-19 18:22:11 +00:00
# endif
2000-02-18 17:59:44 +00:00
1999-09-27 16:34:28 +00:00
DWORD WINAPI HttpExtensionProc ( LPEXTENSION_CONTROL_BLOCK lpECB )
{
zend_file_handle file_handle ;
2000-02-06 21:59:58 +00:00
zend_bool stack_overflown = 0 ;
2001-08-13 00:36:16 +00:00
# ifdef PHP_ENABLE_SEH
LPEXCEPTION_POINTERS e ;
# endif
2001-07-30 08:24:42 +00:00
TSRMLS_FETCH ( ) ;
1999-09-27 16:34:28 +00:00
2001-08-08 14:01:22 +00:00
zend_first_try {
2001-07-21 14:27:56 +00:00
# ifdef PHP_ENABLE_SEH
__try {
2001-01-07 23:45:24 +00:00
# endif
2001-07-30 08:24:42 +00:00
init_request_info ( lpECB TSRMLS_CC ) ;
2001-07-21 14:27:56 +00:00
SG ( server_context ) = lpECB ;
1999-09-27 16:34:28 +00:00
2001-01-16 10:44:52 +00:00
# ifdef WITH_ZEUS
2001-07-21 14:27:56 +00:00
/* PATH_TRANSLATED can contain extra PATH_INFO stuff after the
* file being loaded , so we must use SCRIPT_FILENAME instead
*/
file_handle . filename = ( char * ) emalloc ( ISAPI_SERVER_VAR_BUF_SIZE ) ;
file_handle . free_filename = 1 ;
{
DWORD filename_len = ISAPI_SERVER_VAR_BUF_SIZE ;
if ( ! lpECB - > GetServerVariable ( lpECB - > ConnID , " SCRIPT_FILENAME " , file_handle . filename , & filename_len ) | | file_handle . filename [ 0 ] = = ' \0 ' ) {
/* If we're running on an earlier version of Zeus, this
* variable won ' t be present , so fall back to old behaviour .
*/
efree ( file_handle . filename ) ;
file_handle . filename = sapi_globals - > request_info . path_translated ;
file_handle . free_filename = 0 ;
}
}
2001-01-16 10:44:52 +00:00
# else
2001-07-30 08:24:42 +00:00
file_handle . filename = SG ( request_info . path_translated ) ;
2001-07-21 14:27:56 +00:00
file_handle . free_filename = 0 ;
2001-01-16 10:44:52 +00:00
# endif
2001-09-27 20:01:23 +00:00
file_handle . type = ZEND_HANDLE_FILENAME ;
2001-07-21 14:27:56 +00:00
file_handle . opened_path = NULL ;
1999-09-27 16:34:28 +00:00
2001-07-28 11:36:37 +00:00
php_request_startup ( TSRMLS_C ) ;
php_execute_script ( & file_handle TSRMLS_CC ) ;
2001-07-21 14:27:56 +00:00
if ( SG ( request_info ) . cookie_data ) {
efree ( SG ( request_info ) . cookie_data ) ;
}
# ifdef PHP_ENABLE_SEH
2001-08-13 00:36:16 +00:00
} __except ( exceptionhandler ( & e , GetExceptionInformation ( ) ) ) {
char buf [ 1024 ] ;
if ( _exception_code ( ) = = EXCEPTION_STACK_OVERFLOW ) {
2001-07-21 14:27:56 +00:00
LPBYTE lpPage ;
static SYSTEM_INFO si ;
static MEMORY_BASIC_INFORMATION mi ;
static DWORD dwOldProtect ;
2000-02-06 21:59:58 +00:00
2001-07-21 14:27:56 +00:00
GetSystemInfo ( & si ) ;
2000-02-06 21:59:58 +00:00
2001-07-21 14:27:56 +00:00
/* Get page ESP is pointing to */
_asm mov lpPage , esp ;
2000-02-06 21:59:58 +00:00
2001-07-21 14:27:56 +00:00
/* Get stack allocation base */
VirtualQuery ( lpPage , & mi , sizeof ( mi ) ) ;
2000-02-06 21:59:58 +00:00
2001-07-21 14:27:56 +00:00
/* Go to the page below the current page */
lpPage = ( LPBYTE ) ( mi . BaseAddress ) - si . dwPageSize ;
2000-02-06 21:59:58 +00:00
2001-07-21 14:27:56 +00:00
/* Free pages below current page */
if ( ! VirtualFree ( mi . AllocationBase , ( LPBYTE ) lpPage - ( LPBYTE ) mi . AllocationBase , MEM_DECOMMIT ) ) {
_endthread ( ) ;
}
2000-02-06 21:59:58 +00:00
2001-07-21 14:27:56 +00:00
/* Restore the guard page */
if ( ! VirtualProtect ( lpPage , si . dwPageSize , PAGE_GUARD | PAGE_READWRITE , & dwOldProtect ) ) {
_endthread ( ) ;
}
2000-02-06 21:59:58 +00:00
2001-07-21 14:27:56 +00:00
CG ( unclean_shutdown ) = 1 ;
2001-08-13 00:36:16 +00:00
_snprintf ( buf , sizeof ( buf ) - 1 , " PHP has encountered a Stack overflow " ) ;
php_isapi_report_exception ( buf , strlen ( buf ) TSRMLS_CC ) ;
} else if ( _exception_code ( ) = = EXCEPTION_ACCESS_VIOLATION ) {
_snprintf ( buf , sizeof ( buf ) - 1 , " PHP has encountered an Access Violation at %p " , e - > ExceptionRecord - > ExceptionAddress ) ;
php_isapi_report_exception ( buf , strlen ( buf ) TSRMLS_CC ) ;
my_endthread ( ) ;
} else {
_snprintf ( buf , sizeof ( buf ) - 1 , " PHP has encountered an Unhandled Exception Code %d at %p " , e - > ExceptionRecord - > ExceptionCode , e - > ExceptionRecord - > ExceptionAddress ) ;
php_isapi_report_exception ( buf , strlen ( buf ) TSRMLS_CC ) ;
my_endthread ( ) ;
2001-07-21 14:27:56 +00:00
}
}
2001-11-25 10:01:49 +00:00
# endif
2001-07-21 14:27:56 +00:00
# ifdef PHP_ENABLE_SEH
__try {
php_request_shutdown ( NULL ) ;
2001-08-13 00:36:16 +00:00
} __except ( EXCEPTION_EXECUTE_HANDLER ) {
my_endthread ( ) ;
2000-02-06 21:59:58 +00:00
}
2001-01-07 23:45:24 +00:00
# else
php_request_shutdown ( NULL ) ;
# endif
2001-07-21 14:27:56 +00:00
} zend_catch {
zend_try {
php_request_shutdown ( NULL ) ;
} zend_end_try ( ) ;
return HSE_STATUS_ERROR ;
} zend_end_try ( ) ;
2000-02-06 21:59:58 +00:00
1999-09-27 16:34:28 +00:00
return HSE_STATUS_SUCCESS ;
}
__declspec ( dllexport ) BOOL WINAPI DllMain ( HINSTANCE hinstDLL , DWORD fdwReason , LPVOID lpvReserved )
{
switch ( fdwReason ) {
case DLL_PROCESS_ATTACH :
2001-03-06 15:09:15 +00:00
# ifdef WITH_ZEUS
tsrm_startup ( 128 , 1 , TSRM_ERROR_LEVEL_CORE , " TSRM.log " ) ;
# else
tsrm_startup ( 128 , 1 , TSRM_ERROR_LEVEL_CORE , " C: \\ TSRM.log " ) ;
# endif
2001-01-02 22:49:31 +00:00
sapi_startup ( & isapi_sapi_module ) ;
if ( isapi_sapi_module . startup ) {
isapi_sapi_module . startup ( & sapi_module ) ;
1999-09-27 16:34:28 +00:00
}
break ;
case DLL_THREAD_ATTACH :
break ;
case DLL_THREAD_DETACH :
ts_free_thread ( ) ;
break ;
case DLL_PROCESS_DETACH :
2001-01-02 22:49:31 +00:00
if ( isapi_sapi_module . shutdown ) {
isapi_sapi_module . shutdown ( & sapi_module ) ;
1999-09-27 16:34:28 +00:00
}
tsrm_shutdown ( ) ;
break ;
}
return TRUE ;
1999-09-28 12:08:34 +00:00
}
/*
* Local variables :
* tab - width : 4
* c - basic - offset : 4
* End :
*/