1999-04-08 05:05:13 +08:00
/*
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| PHP HTML Embedded Scripting Language Version 3.0 |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Copyright ( c ) 1997 , 1998 PHP Development Team ( See Credits file ) |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| This program is free software ; you can redistribute it and / or modify |
| it under the terms of one of the following licenses : |
| |
| A ) the GNU General Public License as published by the Free Software |
| Foundation ; either version 2 of the License , or ( at your option ) |
| any later version . |
| |
| B ) the PHP License as published by the PHP Development Team and |
| included in the distribution in the file : LICENSE |
| |
| This program is distributed in the hope that it will be useful , |
| but WITHOUT ANY WARRANTY ; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the |
| GNU General Public License for more details . |
| |
| You should have received a copy of both licenses referred to here . |
| If you did not , or have any questions about PHP licensing , please |
| contact core @ php . net . |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Authors : Andi Gutmans < andi @ zend . com > |
| Zeev Suraski < zeev @ zend . com > |
| Rasmus Lerdorf < rasmus @ lerdorf . on . ca > |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
*/
/* $Id$ */
# include <stdio.h>
# include "php.h"
# ifdef MSVC5
# include "win32/time.h"
# include "win32/signal.h"
# include <process.h>
# else
# include "build-defs.h"
# endif
# if HAVE_SYS_TIME_H
# include <sys/time.h>
# endif
# if HAVE_UNISTD_H
# include <unistd.h>
# endif
# if HAVE_SIGNAL_H
# include <signal.h>
# endif
# if HAVE_SETLOCALE
# include <locale.h>
# endif
# include "zend.h"
# include "php_ini.h"
1999-04-10 03:09:29 +08:00
# include "php_globals.h"
1999-04-08 05:05:13 +08:00
# include "main.h"
# include "fopen-wrappers.h"
1999-04-17 08:37:12 +08:00
# include "ext/standard/php3_standard.h"
1999-04-08 05:05:13 +08:00
# include "snprintf.h"
# if WIN32|WINNT
# include <io.h>
# include <fcntl.h>
# include "win32/syslog.h"
1999-04-18 23:58:27 +08:00
# include "win32/php_registry.h"
1999-04-08 05:05:13 +08:00
# else
# include <syslog.h>
# endif
# include "zend_compile.h"
# include "zend_execute.h"
# include "zend_highlight.h"
# include "zend_indent.h"
# if USE_SAPI
# include "serverapi/sapi.h"
void * gLock ;
# ifndef THREAD_SAFE
struct sapi_request_info * sapi_rqst ;
# endif
# endif
1999-04-26 03:35:44 +08:00
# include "SAPI.h"
1999-04-08 05:05:13 +08:00
# if MSVC5 || !defined(HAVE_GETOPT)
# include "getopt.h"
# endif
1999-04-10 03:09:29 +08:00
# ifndef ZTS
php_core_globals core_globals ;
1999-04-21 12:02:11 +08:00
# else
1999-04-26 22:00:49 +08:00
PHPAPI int core_globals_id ;
1999-04-10 03:09:29 +08:00
# endif
1999-04-11 00:25:23 +08:00
void _php3_build_argv ( char * ELS_DC ) ;
static void php3_timeout ( int dummy ) ;
1999-04-24 08:12:00 +08:00
static void php3_set_timeout ( long seconds ) ;
1999-04-11 00:25:23 +08:00
1999-04-08 05:05:13 +08:00
void * gLock ; /*mutex variable */
# define PHP_MODE_STANDARD 1
# define PHP_MODE_HIGHLIGHT 2
# define PHP_MODE_INDENT 3
/* True globals (no need for thread safety) */
HashTable configuration_hash ;
1999-04-26 22:00:49 +08:00
PHPAPI char * php3_ini_path = NULL ;
1999-04-26 03:35:44 +08:00
# ifdef ZTS
1999-04-26 11:03:36 +08:00
php_core_globals * main_core_globals = NULL ;
1999-04-26 03:35:44 +08:00
# endif
1999-04-08 05:05:13 +08:00
1999-04-11 00:25:23 +08:00
static PHP_INI_MH ( OnSetPrecision )
1999-04-10 03:09:29 +08:00
{
ELS_FETCH ( ) ;
EG ( precision ) = atoi ( new_value ) ;
return SUCCESS ;
}
1999-04-11 00:25:23 +08:00
static PHP_INI_MH ( OnChangeMaxExecutionTime )
{
int new_timeout ;
if ( new_value ) {
new_timeout = atoi ( new_value ) ;
} else {
new_timeout = 0 ;
}
php3_set_timeout ( new_timeout ) ;
return SUCCESS ;
}
static PHP_INI_MH ( OnChangeMemoryLimit )
{
int new_limit ;
if ( new_value ) {
new_limit = atoi ( new_value ) ;
} else {
new_limit = 2 < < 30 ; /* effectively, no limit */
}
return zend_set_memory_limit ( new_limit ) ;
}
static PHP_INI_MH ( OnUpdateErrorReporting )
{
ELS_FETCH ( ) ;
if ( ! new_value ) {
EG ( error_reporting ) = E_ALL & ~ E_NOTICE ;
} else {
EG ( error_reporting ) = atoi ( new_value ) ;
}
return SUCCESS ;
}
1999-04-10 20:17:20 +08:00
/* Need to convert to strings and make use of:
* DEFAULT_SHORT_OPEN_TAG
* PHP_SAFE_MODE
1999-04-10 21:32:47 +08:00
*
* Need to be read from the environment ( ? ) :
* PHP_AUTO_PREPEND_FILE
* PHP_AUTO_APPEND_FILE
1999-04-11 00:25:23 +08:00
* PHP_DOCUMENT_ROOT
* PHP_USER_DIR
* PHP_INCLUDE_PATH
1999-04-10 20:17:20 +08:00
*/
1999-04-10 21:32:47 +08:00
1999-04-10 20:17:20 +08:00
# ifndef SAFE_MODE_EXEC_DIR
# define SAFE_MODE_EXEC_DIR " / "
# endif
1999-04-10 21:32:47 +08:00
# ifdef PHP_PROG_SENDMAIL
# define DEFAULT_SENDMAIL_PATH PHP_PROG_SENDMAIL " -t"
# else
# define DEFAULT_SENDMAIL_PATH NULL
# endif
1999-04-10 03:09:29 +08:00
PHP_INI_BEGIN ( )
1999-04-29 04:26:33 +08:00
PHP_INI_ENTRY1 ( " short_open_tag " , " 1 " , PHP_INI_ALL , OnUpdateInt , ( void * ) XtOffsetOf ( php_core_globals , short_tags ) )
PHP_INI_ENTRY1 ( " asp_tags " , " 0 " , PHP_INI_ALL , OnUpdateInt , ( void * ) XtOffsetOf ( php_core_globals , asp_tags ) )
PHP_INI_ENTRY1 ( " precision " , " 14 " , PHP_INI_ALL , OnSetPrecision , NULL )
1999-04-10 03:09:29 +08:00
1999-04-29 04:26:33 +08:00
PHP_INI_ENTRY1 ( " highlight.comment " , HL_COMMENT_COLOR , PHP_INI_ALL , NULL , NULL )
PHP_INI_ENTRY1 ( " highlight.default " , HL_DEFAULT_COLOR , PHP_INI_ALL , NULL , NULL )
PHP_INI_ENTRY1 ( " highlight.html " , HL_HTML_COLOR , PHP_INI_ALL , NULL , NULL )
PHP_INI_ENTRY1 ( " highlight.string " , HL_STRING_COLOR , PHP_INI_ALL , NULL , NULL )
PHP_INI_ENTRY1 ( " highlight.bg " , HL_BG_COLOR , PHP_INI_ALL , NULL , NULL )
PHP_INI_ENTRY1 ( " highlight.keyword " , HL_KEYWORD_COLOR , PHP_INI_ALL , NULL , NULL )
1999-04-10 03:09:29 +08:00
1999-04-29 04:26:33 +08:00
PHP_INI_ENTRY1 ( " magic_quotes_gpc " , " 1 " , PHP_INI_ALL , OnUpdateInt , ( void * ) XtOffsetOf ( php_core_globals , magic_quotes_gpc ) )
PHP_INI_ENTRY1 ( " magic_quotes_runtime " , " 0 " , PHP_INI_ALL , OnUpdateInt , ( void * ) XtOffsetOf ( php_core_globals , magic_quotes_runtime ) )
PHP_INI_ENTRY1 ( " magic_quotes_sybase " , " 0 " , PHP_INI_ALL , OnUpdateInt , ( void * ) XtOffsetOf ( php_core_globals , magic_quotes_sybase ) )
1999-04-10 20:17:20 +08:00
1999-04-29 04:26:33 +08:00
PHP_INI_ENTRY1 ( " safe_mode " , " 0 " , PHP_INI_SYSTEM , OnUpdateInt , ( void * ) XtOffsetOf ( php_core_globals , safe_mode ) )
PHP_INI_ENTRY1 ( " sql.safe_mode " , " 0 " , PHP_INI_SYSTEM , OnUpdateInt , ( void * ) XtOffsetOf ( php_core_globals , sql_safe_mode ) )
PHP_INI_ENTRY1 ( " safe_mode_exec_dir " , SAFE_MODE_EXEC_DIR , PHP_INI_SYSTEM , OnUpdateString , ( void * ) XtOffsetOf ( php_core_globals , safe_mode_exec_dir ) )
PHP_INI_ENTRY1 ( " enable_dl " , " 1 " , PHP_INI_SYSTEM , OnUpdateInt , ( void * ) XtOffsetOf ( php_core_globals , enable_dl ) )
1999-04-10 21:32:47 +08:00
1999-04-29 04:26:33 +08:00
PHP_INI_ENTRY1 ( " SMTP " , " localhost " , PHP_INI_ALL , NULL , NULL )
PHP_INI_ENTRY1 ( " sendmail_path " , DEFAULT_SENDMAIL_PATH , PHP_INI_SYSTEM , NULL , NULL )
PHP_INI_ENTRY1 ( " sendmail_from " , NULL , PHP_INI_ALL , NULL , NULL )
1999-04-10 21:32:47 +08:00
1999-04-29 04:26:33 +08:00
PHP_INI_ENTRY1 ( " error_reporting " , NULL , PHP_INI_ALL , OnUpdateErrorReporting , NULL )
PHP_INI_ENTRY1 ( " display_errors " , " 1 " , PHP_INI_ALL , OnUpdateInt , ( void * ) XtOffsetOf ( php_core_globals , display_errors ) )
PHP_INI_ENTRY1 ( " track_errors " , " 0 " , PHP_INI_ALL , OnUpdateInt , ( void * ) XtOffsetOf ( php_core_globals , track_errors ) )
PHP_INI_ENTRY1 ( " log_errors " , " 0 " , PHP_INI_ALL , OnUpdateInt , ( void * ) XtOffsetOf ( php_core_globals , log_errors ) )
PHP_INI_ENTRY1 ( " error_log " , NULL , PHP_INI_ALL , OnUpdateString , ( void * ) XtOffsetOf ( php_core_globals , error_log ) )
1999-04-10 21:32:47 +08:00
1999-04-29 04:26:33 +08:00
PHP_INI_ENTRY1 ( " auto_prepend_file " , NULL , PHP_INI_ALL , OnUpdateString , ( void * ) XtOffsetOf ( php_core_globals , auto_prepend_file ) )
PHP_INI_ENTRY1 ( " auto_append_file " , NULL , PHP_INI_ALL , OnUpdateString , ( void * ) XtOffsetOf ( php_core_globals , auto_append_file ) )
1999-04-11 00:25:23 +08:00
1999-04-29 04:26:33 +08:00
PHP_INI_ENTRY1 ( " y2k_compliance " , " 0 " , PHP_INI_ALL , OnUpdateInt , ( void * ) XtOffsetOf ( php_core_globals , y2k_compliance ) )
1999-04-11 00:25:23 +08:00
1999-04-29 04:26:33 +08:00
PHP_INI_ENTRY1 ( " doc_root " , NULL , PHP_INI_SYSTEM , OnUpdateStringUnempty , ( void * ) XtOffsetOf ( php_core_globals , doc_root ) )
PHP_INI_ENTRY1 ( " user_dir " , NULL , PHP_INI_SYSTEM , OnUpdateStringUnempty , ( void * ) XtOffsetOf ( php_core_globals , user_dir ) )
PHP_INI_ENTRY1 ( " include_path " , NULL , PHP_INI_ALL , OnUpdateStringUnempty , ( void * ) XtOffsetOf ( php_core_globals , include_path ) )
PHP_INI_ENTRY1 ( " open_basedir " , NULL , PHP_INI_SYSTEM , OnUpdateStringUnempty , ( void * ) XtOffsetOf ( php_core_globals , open_basedir ) )
PHP_INI_ENTRY1 ( " extension_dir " , NULL , PHP_INI_SYSTEM , OnUpdateStringUnempty , ( void * ) XtOffsetOf ( php_core_globals , extension_dir ) )
1999-04-11 00:25:23 +08:00
1999-04-29 04:26:33 +08:00
PHP_INI_ENTRY1 ( " upload_tmp_dir " , NULL , PHP_INI_SYSTEM , OnUpdateStringUnempty , ( void * ) XtOffsetOf ( php_core_globals , upload_tmp_dir ) )
PHP_INI_ENTRY1 ( " upload_max_filesize " , " 2097152 " , PHP_INI_ALL , OnUpdateInt , ( void * ) XtOffsetOf ( php_core_globals , upload_max_filesize ) )
1999-04-11 00:25:23 +08:00
1999-04-29 04:26:33 +08:00
PHP_INI_ENTRY1 ( " browscap " , NULL , PHP_INI_SYSTEM , NULL , NULL )
1999-04-11 00:25:23 +08:00
1999-04-29 04:26:33 +08:00
PHP_INI_ENTRY1 ( " define_syslog_variables " , " 0 " , PHP_INI_ALL , NULL , NULL )
1999-04-11 00:25:23 +08:00
1999-04-29 04:26:33 +08:00
PHP_INI_ENTRY1 ( " max_execution_time " , " 30 " , PHP_INI_ALL , OnChangeMaxExecutionTime , NULL )
PHP_INI_ENTRY1 ( " memory_limit " , " 8388608 " , PHP_INI_ALL , OnChangeMemoryLimit , NULL )
1999-04-11 00:25:23 +08:00
1999-04-29 04:26:33 +08:00
PHP_INI_ENTRY1 ( " track_vars " , " 0 " , PHP_INI_ALL , OnUpdateInt , ( void * ) XtOffsetOf ( php_core_globals , track_vars ) )
PHP_INI_ENTRY1 ( " gpc_order " , " GPC " , PHP_INI_ALL , OnUpdateStringUnempty , ( void * ) XtOffsetOf ( php_core_globals , gpc_order ) )
PHP_INI_ENTRY1 ( " arg_separator " , " & " , PHP_INI_ALL , OnUpdateStringUnempty , ( void * ) XtOffsetOf ( php_core_globals , arg_separator ) )
1999-04-10 03:09:29 +08:00
PHP_INI_END ( )
1999-04-24 06:45:01 +08:00
/* True global (no need for thread safety */
static int module_initialized = 0 ;
1999-04-08 05:05:13 +08:00
# if APACHE
void php3_apache_puts ( const char * s )
{
1999-04-27 01:26:37 +08:00
SLS_FETCH ( ) ;
if ( SG ( server_context ) ) {
rputs ( s , ( request_rec * ) SG ( server_context ) ) ;
1999-04-08 05:05:13 +08:00
} else {
fputs ( s , stdout ) ;
}
}
void php3_apache_putc ( char c )
{
1999-04-27 01:26:37 +08:00
SLS_FETCH ( ) ;
if ( SG ( server_context ) ) {
rputc ( c , ( request_rec * ) SG ( server_context ) ) ;
1999-04-08 05:05:13 +08:00
} else {
fputc ( c , stdout ) ;
}
}
# endif
void php3_log_err ( char * log_message )
{
FILE * log_file ;
1999-04-11 05:39:23 +08:00
PLS_FETCH ( ) ;
1999-04-27 01:26:37 +08:00
SLS_FETCH ( ) ;
1999-04-08 05:05:13 +08:00
/* Try to use the specified logging location. */
1999-04-11 00:25:23 +08:00
if ( PG ( error_log ) ! = NULL ) {
1999-04-08 05:05:13 +08:00
# if HAVE_SYSLOG_H
1999-04-11 00:25:23 +08:00
if ( strcmp ( PG ( error_log ) , " syslog " ) ) {
1999-04-08 05:05:13 +08:00
syslog ( LOG_NOTICE , log_message ) ;
return ;
} else {
# endif
1999-04-11 00:25:23 +08:00
log_file = fopen ( PG ( error_log ) , " a " ) ;
1999-04-08 05:05:13 +08:00
if ( log_file ! = NULL ) {
fprintf ( log_file , log_message ) ;
fprintf ( log_file , " \n " ) ;
fclose ( log_file ) ;
return ;
}
# if HAVE_SYSLOG_H
}
# endif
}
/* Otherwise fall back to the default logging location. */
# if APACHE
1999-04-27 01:26:37 +08:00
if ( SG ( server_context ) ) {
1999-04-08 05:05:13 +08:00
# if MODULE_MAGIC_NUMBER >= 19970831
1999-04-27 01:26:37 +08:00
aplog_error ( NULL , 0 , APLOG_ERR | APLOG_NOERRNO , ( ( request_rec * ) SG ( server_context ) ) - > server , log_message ) ;
1999-04-08 05:05:13 +08:00
# else
1999-04-27 01:26:37 +08:00
log_error ( log_message , ( ( requset_rec * ) SG ( server_context ) ) - > server ) ;
1999-04-08 05:05:13 +08:00
# endif
} else {
fprintf ( stderr , log_message ) ;
fprintf ( stderr , " \n " ) ;
}
# endif /*APACHE */
# if CGI_BINARY
if ( php3_header ( ) ) {
fprintf ( stderr , log_message ) ;
fprintf ( stderr , " \n " ) ;
}
# endif
}
/* is 4K big enough? */
# define PRINTF_BUFFER_SIZE 1024*4
/* wrapper for modules to use PHPWRITE */
PHPAPI int php3_write ( void * buf , int size )
{
return PHPWRITE ( buf , size ) ;
}
PHPAPI int php3_printf ( const char * format , . . . )
{
va_list args ;
int ret ;
char buffer [ PRINTF_BUFFER_SIZE ] ;
int size ;
va_start ( args , format ) ;
size = vsprintf ( buffer , format , args ) ;
ret = PHPWRITE ( buffer , size ) ;
va_end ( args ) ;
return ret ;
}
/* extended error handling function */
PHPAPI void php3_error ( int type , const char * format , . . . )
{
va_list args ;
char * error_filename = NULL ;
uint error_lineno ;
char buffer [ 1024 ] ;
int size = 0 ;
ELS_FETCH ( ) ;
1999-04-21 12:02:11 +08:00
PLS_FETCH ( ) ;
1999-04-08 05:05:13 +08:00
1999-04-25 00:51:15 +08:00
1999-04-08 05:05:13 +08:00
switch ( type ) {
case E_CORE_ERROR :
case E_CORE_WARNING :
error_filename = NULL ;
error_lineno = 0 ;
break ;
case E_PARSE :
case E_COMPILE_ERROR :
case E_COMPILE_WARNING : {
CLS_FETCH ( ) ;
error_filename = zend_get_compiled_filename ( ) ;
error_lineno = CG ( zend_lineno ) ;
}
break ;
case E_ERROR :
case E_NOTICE :
case E_WARNING :
error_filename = zend_get_executed_filename ( ELS_C ) ;
error_lineno = zend_get_executed_lineno ( ELS_C ) ;
break ;
default :
error_filename = NULL ;
error_lineno = 0 ;
break ;
}
if ( EG ( error_reporting ) & type | | ( type & E_CORE ) ) {
char * error_type_str ;
switch ( type ) {
case E_ERROR :
case E_CORE_ERROR :
case E_COMPILE_ERROR :
error_type_str = " Fatal error " ;
break ;
case E_WARNING :
case E_CORE_WARNING :
case E_COMPILE_WARNING :
error_type_str = " Warning " ;
break ;
case E_PARSE :
error_type_str = " Parse error " ;
break ;
case E_NOTICE :
error_type_str = " Warning " ;
break ;
default :
error_type_str = " Unknown error " ;
break ;
}
/* get include file name */
1999-04-10 21:32:47 +08:00
if ( PG ( log_errors ) | | PG ( display_errors ) ) {
1999-04-08 05:05:13 +08:00
va_start ( args , format ) ;
size = vsnprintf ( buffer , sizeof ( buffer ) - 1 , format , args ) ;
va_end ( args ) ;
buffer [ sizeof ( buffer ) - 1 ] = 0 ;
1999-04-10 21:32:47 +08:00
if ( PG ( log_errors ) ) {
1999-04-08 05:05:13 +08:00
char log_buffer [ 1024 ] ;
snprintf ( log_buffer , 1024 , " PHP 3 %s: %s in %s on line %d " , error_type_str , buffer , error_filename , error_lineno ) ;
php3_log_err ( log_buffer ) ;
}
1999-04-10 21:32:47 +08:00
if ( PG ( display_errors ) ) {
1999-04-11 00:25:23 +08:00
char * prepend_string = INI_STR ( " error_prepend_string " ) ;
char * append_string = INI_STR ( " error_append_string " ) ;
if ( prepend_string ) {
PUTS ( prepend_string ) ;
1999-04-08 05:05:13 +08:00
}
php3_printf ( " <br> \n <b>%s</b>: %s in <b>%s</b> on line <b>%d</b><br> \n " , error_type_str , buffer , error_filename , error_lineno ) ;
1999-04-11 00:25:23 +08:00
if ( append_string ) {
PUTS ( append_string ) ;
1999-04-08 05:05:13 +08:00
}
}
}
}
1999-04-10 21:32:47 +08:00
if ( PG ( track_errors ) ) {
1999-04-08 05:05:13 +08:00
pval tmp ;
va_start ( args , format ) ;
size = vsnprintf ( buffer , sizeof ( buffer ) - 1 , format , args ) ;
va_end ( args ) ;
buffer [ sizeof ( buffer ) - 1 ] = 0 ;
tmp . value . str . val = ( char * ) estrndup ( buffer , size ) ;
tmp . value . str . len = size ;
tmp . type = IS_STRING ;
_php3_hash_update ( EG ( active_symbol_table ) , " php_errormsg " , sizeof ( " php_errormsg " ) , ( void * ) & tmp , sizeof ( pval ) , NULL ) ;
}
switch ( type ) {
case E_ERROR :
case E_CORE_ERROR :
/*case E_PARSE: the parser would return 1 (failure), we can bail out nicely */
case E_COMPILE_ERROR :
zend_bailout ( ) ;
break ;
}
}
# if HAVE_SETITIMER
static void php3_timeout ( int dummy )
{
1999-04-11 05:34:53 +08:00
PLS_FETCH ( ) ;
1999-04-08 05:05:13 +08:00
1999-04-11 00:25:23 +08:00
php3_error ( E_ERROR , " Maximum execution time of %d seconds exceeded " , PG ( max_execution_time ) ) ;
1999-04-08 05:05:13 +08:00
}
# endif
/* This one doesn't exists on QNX */
# ifndef SIGPROF
# define SIGPROF 27
# endif
1999-04-24 08:12:00 +08:00
static void php3_set_timeout ( long seconds )
1999-04-08 05:05:13 +08:00
{
# if WIN32|WINNT
# else
1999-04-25 00:17:04 +08:00
# if HAVE_SETITIMER
1999-04-08 05:05:13 +08:00
struct itimerval t_r ; /* timeout requested */
t_r . it_value . tv_sec = seconds ;
t_r . it_value . tv_usec = t_r . it_interval . tv_sec = t_r . it_interval . tv_usec = 0 ;
setitimer ( ITIMER_PROF , & t_r , NULL ) ;
signal ( SIGPROF , php3_timeout ) ;
1999-04-25 00:17:04 +08:00
# endif
1999-04-08 05:05:13 +08:00
# endif
}
1999-04-24 08:12:00 +08:00
static void php3_unset_timeout ( )
1999-04-08 05:05:13 +08:00
{
# if WIN32|WINNT
# else
1999-04-25 00:17:04 +08:00
# if HAVE_SETITIMER
1999-04-08 05:05:13 +08:00
struct itimerval no_timeout ;
no_timeout . it_value . tv_sec = no_timeout . it_value . tv_usec = no_timeout . it_interval . tv_sec = no_timeout . it_interval . tv_usec = 0 ;
setitimer ( ITIMER_PROF , & no_timeout , NULL ) ;
1999-04-25 00:17:04 +08:00
# endif
1999-04-08 05:05:13 +08:00
# endif
}
void php3_set_time_limit ( INTERNAL_FUNCTION_PARAMETERS )
{
pval * new_timeout ;
1999-04-21 12:02:11 +08:00
PLS_FETCH ( ) ;
1999-04-08 05:05:13 +08:00
1999-04-10 20:17:20 +08:00
if ( PG ( safe_mode ) ) {
1999-04-08 05:05:13 +08:00
php3_error ( E_WARNING , " Cannot set time limit in safe mode " ) ;
RETURN_FALSE ;
}
if ( ARG_COUNT ( ht ) ! = 1 | | getParameters ( ht , 1 , & new_timeout ) = = FAILURE ) {
WRONG_PARAM_COUNT ;
}
convert_to_long ( new_timeout ) ;
/* FIXME ** This is BAD...in a threaded situation, any user
can set the timeout for php on a server wide basis .
INI variables should not be reset via a user script
Fix what ? At least on Unix , timers like these are
per - thread timers . Well , with a little work they will
be . If we use a bound thread and proper masking it
should work fine . Is this FIXME a WIN32 problem ? Is
there no way to do per - thread timers on WIN32 ?
*/
1999-04-24 08:12:00 +08:00
php3_unset_timeout ( ) ;
php3_set_timeout ( new_timeout - > value . lval ) ;
1999-04-08 05:05:13 +08:00
}
static FILE * php_fopen_wrapper_for_zend ( const char * filename )
{
int issock = 0 , socketd = 0 ;
FILE * retval = php3_fopen_wrapper ( ( char * ) filename , " r " , USE_PATH | IGNORE_URL_WIN , & issock , & socketd ) ;
if ( issock ) {
retval = fdopen ( socketd , " r " ) ;
}
return retval ;
}
static void php_message_handler_for_zend ( long message , void * data )
{
switch ( message ) {
1999-04-21 12:02:11 +08:00
case ZMSG_ENABLE_TRACK_VARS : {
PLS_FETCH ( ) ;
PG ( track_vars ) = 1 ;
}
1999-04-08 05:05:13 +08:00
break ;
case ZMSG_FAILED_INCLUDE_FOPEN :
php3_error ( E_WARNING , " Failed opening '%s' for inclusion " , php3_strip_url_passwd ( ( char * ) data ) ) ;
break ;
case ZMSG_FAILED_REQUIRE_FOPEN :
php3_error ( E_ERROR , " Failed opening required '%s' " , php3_strip_url_passwd ( ( char * ) data ) ) ;
break ;
case ZMSG_FAILED_HIGHLIGHT_FOPEN :
php3_error ( E_WARNING , " Failed opening '%s' for highlighting " , php3_strip_url_passwd ( ( char * ) data ) ) ;
break ;
case ZMSG_MEMORY_LEAK_DETECTED : {
ELS_FETCH ( ) ;
1999-04-27 01:26:37 +08:00
SLS_FETCH ( ) ;
1999-04-08 05:05:13 +08:00
if ( EG ( error_reporting ) & E_WARNING ) {
# if ZEND_DEBUG
1999-04-11 01:39:08 +08:00
mem_header * t = ( mem_header * ) data ;
1999-04-11 05:30:49 +08:00
# if APACHE /* log into the errorlog, since at this time we can't send messages to the browser */
1999-04-08 05:05:13 +08:00
char memory_leak_buf [ 512 ] ;
1999-04-19 04:59:54 +08:00
snprintf ( memory_leak_buf , 512 , " Possible PHP4 memory leak detected (harmless): 0x%0.8lX, %d bytes from %s:%d " , ( long ) t , t - > size , t - > filename , t - > lineno ) ;
1999-04-08 05:05:13 +08:00
# if MODULE_MAGIC_NUMBER >= 19970831
1999-04-27 01:26:37 +08:00
aplog_error ( NULL , 0 , APLOG_ERR | APLOG_NOERRNO , ( ( request_rec * ) SG ( server_context ) ) - > server , memory_leak_buf ) ;
1999-04-08 05:05:13 +08:00
# else
1999-04-27 01:26:37 +08:00
log_error ( memory_leak_buf , ( ( request_rec * ) SG ( server_context ) ) - > server ) ;
1999-04-08 05:05:13 +08:00
# endif
# else
php3_printf ( " Freeing 0x%0.8X (%d bytes), allocated in %s on line %d<br> \n " , ( void * ) ( ( char * ) t + sizeof ( mem_header ) + PLATFORM_PADDING ) , t - > size , t - > filename , t - > lineno ) ;
# endif
# endif
}
}
break ;
}
}
1999-04-26 03:35:44 +08:00
1999-04-27 18:00:54 +08:00
int php_request_startup ( CLS_D ELS_DC PLS_DC )
1999-04-08 05:05:13 +08:00
{
1999-04-27 18:00:54 +08:00
PG ( unclean_shutdown ) = 0 ;
1999-04-08 05:05:13 +08:00
zend_output_startup ( ) ;
1999-04-21 12:02:11 +08:00
1999-04-24 08:12:00 +08:00
php3_set_timeout ( PG ( max_execution_time ) ) ;
1999-04-08 05:05:13 +08:00
# if APACHE
/*
* For the Apache module version , this bit of code registers a cleanup
* function that gets triggered when our request pool is destroyed .
* We need this because at any point in our code we can be interrupted
* and that may happen before we have had time to free our memory .
* The php3_shutdown function needs to free all outstanding allocated
* memory .
*/
block_alarms ( ) ;
1999-04-27 01:26:37 +08:00
register_cleanup ( ( ( request_rec * ) SG ( server_context ) ) - > pool , NULL , php_request_shutdown , php_request_shutdown_for_exec ) ;
1999-04-08 05:05:13 +08:00
unblock_alarms ( ) ;
# endif
/* initialize global variables */
{
1999-04-24 04:20:30 +08:00
PG ( header_is_being_sent ) = 0 ;
1999-04-08 05:05:13 +08:00
}
1999-04-11 00:25:23 +08:00
if ( php3_init_request_info ( NULL ) ) {
1999-04-08 05:05:13 +08:00
php3_printf ( " Unable to initialize request info. \n " ) ;
return FAILURE ;
}
init_compiler ( CLS_C ELS_CC ) ;
init_executor ( CLS_C ELS_CC ) ;
startup_scanner ( CLS_C ) ;
return SUCCESS ;
}
1999-04-26 22:00:49 +08:00
void php_request_shutdown_for_exec ( void * dummy )
1999-04-08 05:05:13 +08:00
{
/* used to close fd's in the 3..255 range here, but it's problematic
*/
shutdown_memory_manager ( 1 , 1 ) ;
}
int return_one ( void * p )
{
return 1 ;
}
1999-04-26 22:00:49 +08:00
void php_request_shutdown ( void * dummy )
1999-04-08 05:05:13 +08:00
{
# if FHTTPD
char tmpline [ 128 ] ;
int i , serverdefined ;
# endif
CLS_FETCH ( ) ;
ELS_FETCH ( ) ;
1999-04-27 18:00:54 +08:00
PLS_FETCH ( ) ;
1999-04-08 05:05:13 +08:00
php3_header ( ) ;
zend_end_ob_buffering ( 1 ) ;
php3_call_shutdown_functions ( ) ;
1999-04-09 05:32:57 +08:00
php_ini_rshutdown ( ) ;
1999-04-08 05:05:13 +08:00
shutdown_scanner ( CLS_C ) ;
shutdown_compiler ( CLS_C ) ;
shutdown_executor ( ELS_C ) ;
1999-04-24 06:45:01 +08:00
php3_destroy_request_info ( NULL ) ;
1999-04-27 18:00:54 +08:00
shutdown_memory_manager ( PG ( unclean_shutdown ) , 0 ) ;
1999-04-24 08:12:00 +08:00
php3_unset_timeout ( ) ;
1999-04-08 05:05:13 +08:00
# if CGI_BINARY
fflush ( stdout ) ;
1999-04-24 08:12:00 +08:00
if ( request_info . php_argv0 ) {
free ( request_info . php_argv0 ) ;
request_info . php_argv0 = NULL ;
1999-04-08 05:05:13 +08:00
}
# endif
# if FHTTPD
if ( response ) {
if ( ! headermade ) {
makestandardheader ( response , 200 , " text/html " , " fhttpd " , req & & req - > keepalive ) ;
} else {
if ( headerfirstline )
putlinetoheader ( response , headerfirstline ) ;
else
putlinetoheader ( response , " HTTP/1.0 200 OK \r \n " ) ;
serverdefined = 0 ;
for ( i = 0 ; i < headerlines ; i + + ) {
if ( ! strncmp ( currentheader [ i ] , " Server: " , 7 ) )
serverdefined = 1 ;
putlinetoheader ( response , currentheader [ i ] ) ;
}
if ( ! serverdefined )
putlinetoheader ( response , " Server: fhttpd \r \n " ) ;
if ( response - > datasize ) {
sprintf ( tmpline , " Content-Length: %ld \r \n " , response - > datasize ) ;
putlinetoheader ( response , tmpline ) ;
if ( req & & req - > keepalive )
putlinetoheader ( response ,
" Connection: Keep-Alive \r \n Keep-Alive: max=0, timeout=30 \r \n " ) ;
}
php3_fhttpd_free_header ( ) ;
}
sendresponse ( server , response ) ;
if ( response - > datasize )
finishresponse ( server , response ) ;
else
finishdropresponse ( server , response ) ;
deleteresponse ( response ) ;
}
response = NULL ;
if ( req )
deleterequest ( req ) ;
req = NULL ;
# endif
# if USE_SAPI
1999-04-24 08:12:00 +08:00
sapi_rqst - > flush ( sapi_rqst - > scid ) ;
1999-04-08 05:05:13 +08:00
# endif
}
1999-04-21 12:02:11 +08:00
static int php3_config_ini_startup ( )
1999-04-08 05:05:13 +08:00
{
if ( php3_init_config ( ) = = FAILURE ) {
php3_printf ( " PHP: Unable to parse configuration file. \n " ) ;
return FAILURE ;
}
return SUCCESS ;
}
1999-04-24 08:12:00 +08:00
static void php3_config_ini_shutdown ( )
1999-04-08 05:05:13 +08:00
{
php3_shutdown_config ( ) ;
}
1999-04-21 12:02:11 +08:00
1999-04-26 03:35:44 +08:00
# ifdef ZTS
static core_globals_ctor ( php_core_globals * core_globals )
{
1999-04-26 11:03:36 +08:00
if ( main_core_globals ) {
1999-04-26 03:35:44 +08:00
* core_globals = * main_core_globals ;
1999-04-26 11:03:36 +08:00
}
1999-04-26 03:35:44 +08:00
}
# endif
1999-04-26 22:00:49 +08:00
int php_module_startup ( sapi_functions_struct * sf )
1999-04-08 05:05:13 +08:00
{
zend_utility_functions zuf ;
zend_utility_values zuv ;
1999-04-10 03:09:29 +08:00
int module_number = 0 ; /* for REGISTER_INI_ENTRIES() */
1999-04-21 12:02:11 +08:00
# ifdef ZTS
php_core_globals * core_globals ;
# endif
1999-04-08 05:05:13 +08:00
# if (WIN32|WINNT) && !(USE_SAPI)
WORD wVersionRequested ;
WSADATA wsaData ;
wVersionRequested = MAKEWORD ( 2 , 0 ) ;
1999-04-24 06:45:01 +08:00
# endif
if ( module_initialized ) {
1999-04-08 05:05:13 +08:00
return SUCCESS ;
}
1999-04-27 04:20:12 +08:00
sapi_functions = * sf ;
1999-04-08 05:05:13 +08:00
zend_output_startup ( ) ;
zuf . error_function = php3_error ;
zuf . printf_function = php3_printf ;
zuf . write_function = zend_body_write ;
zuf . fopen_function = php_fopen_wrapper_for_zend ;
zuf . message_handler = php_message_handler_for_zend ;
zuf . block_interruptions = BLOCK_INTERRUPTIONS ;
zuf . unblock_interruptions = UNBLOCK_INTERRUPTIONS ;
1999-04-10 19:22:18 +08:00
zend_startup ( & zuf , NULL ) ;
1999-04-08 05:05:13 +08:00
1999-04-21 12:02:11 +08:00
# ifdef ZTS
1999-04-26 03:35:44 +08:00
core_globals_id = ts_allocate_id ( sizeof ( php_core_globals ) , core_globals_ctor , NULL ) ;
1999-04-21 12:02:11 +08:00
core_globals = ts_resource ( core_globals_id ) ;
1999-04-26 03:35:44 +08:00
main_core_globals = core_globals ;
# endif
1999-04-29 01:38:24 +08:00
PG ( header_is_being_sent ) = 0 ;
1999-04-26 22:00:49 +08:00
sapi_startup ( sf ) ;
1999-04-21 12:02:11 +08:00
1999-04-08 05:05:13 +08:00
# if HAVE_SETLOCALE
setlocale ( LC_CTYPE , " " ) ;
# endif
# if (WIN32|WINNT) && !(USE_SAPI)
/* start up winsock services */
if ( WSAStartup ( wVersionRequested , & wsaData ) ! = 0 ) {
php3_printf ( " \n winsock.dll unusable. %d \n " , WSAGetLastError ( ) ) ;
return FAILURE ;
}
# endif
SET_MUTEX ( gLock ) ;
le_index_ptr = _register_list_destructors ( NULL , NULL , 0 ) ;
FREE_MUTEX ( gLock ) ;
1999-04-21 12:02:11 +08:00
if ( php3_config_ini_startup ( ) = = FAILURE ) {
1999-04-08 05:05:13 +08:00
return FAILURE ;
}
1999-04-10 03:09:29 +08:00
php_ini_mstartup ( ) ;
REGISTER_INI_ENTRIES ( ) ;
1999-04-10 19:22:18 +08:00
zuv . short_tags = ( unsigned char ) PG ( short_tags ) ;
zuv . asp_tags = ( unsigned char ) PG ( asp_tags ) ;
zend_set_utility_values ( & zuv ) ;
1999-04-08 05:05:13 +08:00
if ( module_startup_modules ( ) = = FAILURE ) {
php3_printf ( " Unable to start modules \n " ) ;
return FAILURE ;
}
1999-04-24 06:45:01 +08:00
module_initialized = 1 ;
1999-04-08 05:05:13 +08:00
return SUCCESS ;
}
1999-04-26 22:00:49 +08:00
void php_module_shutdown_for_exec ( void )
1999-04-08 05:05:13 +08:00
{
/* used to close fd's in the range 3.255 here, but it's problematic */
}
1999-04-26 22:00:49 +08:00
void php_module_shutdown ( )
1999-04-08 05:05:13 +08:00
{
1999-04-10 03:09:29 +08:00
int module_number = 0 ; /* for UNREGISTER_INI_ENTRIES() */
1999-04-08 05:05:13 +08:00
CLS_FETCH ( ) ;
ELS_FETCH ( ) ;
1999-04-24 08:12:00 +08:00
if ( ! module_initialized ) {
return ;
}
1999-04-08 05:05:13 +08:00
# if !USE_SAPI
/* close down the ini config */
1999-04-24 08:12:00 +08:00
php3_config_ini_shutdown ( ) ;
1999-04-08 05:05:13 +08:00
# endif
# if (WIN32|WINNT) && !(USE_SAPI)
/*close winsock */
1999-04-24 06:45:01 +08:00
WSACleanup ( ) ;
1999-04-08 05:05:13 +08:00
# endif
# if CGI_BINARY
fflush ( stdout ) ;
# endif
#if 0 /* SAPI */
1999-04-24 08:12:00 +08:00
sapi_rqst - > flush ( sapi_rqst - > scid ) ;
1999-04-08 05:05:13 +08:00
# endif
zend_shutdown ( ) ;
1999-04-10 03:09:29 +08:00
UNREGISTER_INI_ENTRIES ( ) ;
1999-04-09 05:32:57 +08:00
php_ini_mshutdown ( ) ;
1999-04-08 05:05:13 +08:00
shutdown_memory_manager ( 0 , 1 ) ;
1999-04-24 06:45:01 +08:00
module_initialized = 0 ;
1999-04-08 05:05:13 +08:00
}
/* in 3.1 some of this should move into sapi */
1999-04-21 12:02:11 +08:00
int _php3_hash_environment ( PLS_D )
1999-04-08 05:05:13 +08:00
{
char * * env , * p , * t ;
unsigned char _gpc_flags [ 3 ] = { 0 , 0 , 0 } ;
pval * tmp ;
ELS_FETCH ( ) ;
1999-04-11 00:25:23 +08:00
p = PG ( gpc_order ) ;
1999-04-08 05:05:13 +08:00
while ( * p ) {
switch ( * p + + ) {
case ' p ' :
case ' P ' :
1999-04-24 08:12:00 +08:00
if ( ! _gpc_flags [ 0 ] & & php3_headers_unsent ( ) & & request_info . request_method & & ! strcasecmp ( request_info . request_method , " post " ) ) {
1999-04-08 05:05:13 +08:00
php3_treat_data ( PARSE_POST , NULL ) ; /* POST Data */
_gpc_flags [ 0 ] = 1 ;
}
break ;
case ' c ' :
case ' C ' :
if ( ! _gpc_flags [ 1 ] ) {
php3_treat_data ( PARSE_COOKIE , NULL ) ; /* Cookie Data */
_gpc_flags [ 1 ] = 1 ;
}
break ;
case ' g ' :
case ' G ' :
if ( ! _gpc_flags [ 2 ] ) {
php3_treat_data ( PARSE_GET , NULL ) ; /* GET Data */
_gpc_flags [ 2 ] = 1 ;
}
break ;
}
}
for ( env = environ ; env ! = NULL & & * env ! = NULL ; env + + ) {
p = strchr ( * env , ' = ' ) ;
if ( ! p ) { /* malformed entry? */
continue ;
}
t = estrndup ( * env , p - * env ) ;
tmp = ( pval * ) emalloc ( sizeof ( pval ) ) ;
tmp - > value . str . len = strlen ( p + 1 ) ;
tmp - > value . str . val = estrndup ( p + 1 , tmp - > value . str . len ) ;
tmp - > type = IS_STRING ;
tmp - > refcount = 1 ;
tmp - > is_ref = 0 ;
/* environmental variables never take precedence over get/post/cookie variables */
_php3_hash_add ( & EG ( symbol_table ) , t , p - * env + 1 , & tmp , sizeof ( pval * ) , NULL ) ;
efree ( t ) ;
}
# if APACHE
{
pval * * tmp_ptr ;
register int i ;
1999-04-27 01:26:37 +08:00
array_header * arr = table_elts ( ( ( request_rec * ) SG ( server_context ) ) - > subprocess_env ) ;
1999-04-08 05:05:13 +08:00
table_entry * elts = ( table_entry * ) arr - > elts ;
int len ;
for ( i = 0 ; i < arr - > nelts ; i + + ) {
len = strlen ( elts [ i ] . key ) ;
t = elts [ i ] . key ;
tmp = ( pval * ) emalloc ( sizeof ( pval ) ) ;
if ( elts [ i ] . val ) {
tmp - > value . str . len = strlen ( elts [ i ] . val ) ;
tmp - > value . str . val = estrndup ( elts [ i ] . val , tmp - > value . str . len ) ;
} else {
tmp - > value . str . len = 0 ;
tmp - > value . str . val = empty_string ;
}
tmp - > refcount = 1 ;
tmp - > is_ref = 0 ;
tmp - > type = IS_STRING ;
_php3_hash_update ( & EG ( symbol_table ) , t , strlen ( t ) + 1 , & tmp , sizeof ( pval * ) , NULL ) ;
}
/* insert special variables */
if ( _php3_hash_find ( & EG ( symbol_table ) , " SCRIPT_FILENAME " , sizeof ( " SCRIPT_FILENAME " ) , ( void * * ) & tmp_ptr ) = = SUCCESS ) {
( * tmp_ptr ) - > refcount + + ;
_php3_hash_update ( & EG ( symbol_table ) , " PATH_TRANSLATED " , sizeof ( " PATH_TRANSLATED " ) , tmp_ptr , sizeof ( pval * ) , NULL ) ;
}
tmp = ( pval * ) emalloc ( sizeof ( pval ) ) ;
1999-04-27 01:26:37 +08:00
tmp - > value . str . len = strlen ( ( ( request_rec * ) SG ( server_context ) ) - > uri ) ;
tmp - > value . str . val = estrndup ( ( ( request_rec * ) SG ( server_context ) ) - > uri , tmp - > value . str . len ) ;
1999-04-08 05:05:13 +08:00
tmp - > refcount = 1 ;
tmp - > is_ref = 0 ;
tmp - > type = IS_STRING ;
_php3_hash_update ( & EG ( symbol_table ) , " PHP_SELF " , sizeof ( " PHP_SELF " ) , ( void * ) & tmp , sizeof ( pval * ) , NULL ) ;
}
# else
# if FHTTPD
{
int i , j ;
if ( req ) {
for ( i = 0 ; i < req - > nlines ; i + + ) {
if ( req - > lines [ i ] . paramc > 1 & & req - > lines [ i ] . params [ 0 ] & & req - > lines [ i ] . params [ 1 ] ) {
tmp = ( pval * ) emalloc ( sizeof ( pval ) ) ;
tmp - > value . str . len = strlen ( req - > lines [ i ] . params [ 1 ] ) ;
tmp - > value . str . val = estrndup ( req - > lines [ i ] . params [ 1 ] , tmp - > value . str . len ) ;
tmp - > type = IS_STRING ;
tmp - > refcount = 1 ;
tmp - > is_ref = 0 ;
_php3_hash_update ( & EG ( symbol_table ) , req - > lines [ i ] . params [ 0 ] ,
strlen ( req - > lines [ i ] . params [ 0 ] ) + 1 , & tmp ,
sizeof ( pval * ) , NULL ) ;
}
}
if ( req - > script_name_resolved ) {
i = strlen ( req - > script_name_resolved ) ;
tmp = ( pval * ) emalloc ( sizeof ( pval ) ) ;
tmp - > value . str . len = i ;
tmp - > value . str . val = estrndup ( req - > script_name_resolved , i ) ;
tmp - > type = IS_STRING ;
tmp - > refcount = 1 ;
tmp - > is_ref = 0 ;
_php3_hash_update ( & EG ( symbol_table ) , " PATH_TRANSLATED " ,
sizeof ( " PATH_TRANSLATED " ) ,
& tmp , sizeof ( pval * ) , NULL ) ;
if ( req - > script_name ) {
j = i - strlen ( req - > script_name ) ;
if ( j > 0
& & ! strcmp ( req - > script_name_resolved + j ,
req - > script_name ) ) {
tmp = ( pval * ) emalloc ( sizeof ( pval ) ) ;
tmp - > value . str . len = j ;
tmp - > value . str . val = estrndup ( req - > script_name_resolved , j ) ;
tmp - > type = IS_STRING ;
tmp - > refcount = 1 ;
tmp - > is_ref = 0 ;
_php3_hash_update ( & EG ( symbol_table ) , " DOCUMENT_ROOT " ,
sizeof ( " DOCUMENT_ROOT " ) ,
& tmp , sizeof ( pval * ) , NULL ) ;
}
}
}
}
}
# endif
{
/* Build the special-case PHP_SELF variable for the CGI version */
char * pi ;
# if FORCE_CGI_REDIRECT
1999-04-24 08:12:00 +08:00
pi = request_info . path_info ;
1999-04-08 05:05:13 +08:00
tmp = ( pval * ) emalloc ( sizeof ( pval ) ) ;
tmp - > value . str . val = emalloc ( ( ( pi ) ? strlen ( pi ) : 0 ) + 1 ) ;
tmp - > value . str . len = _php3_sprintf ( tmp - > value . str . val , " %s " , ( pi ? pi : " " ) ) ; /* SAFE */
tmp - > type = IS_STRING ;
tmp - > refcount = 1 ;
tmp - > is_ref = 0 ;
# else
int l = 0 ;
char * sn ;
1999-04-24 08:12:00 +08:00
sn = request_info . script_name ;
pi = request_info . path_info ;
1999-04-08 05:05:13 +08:00
if ( sn )
l + = strlen ( sn ) ;
if ( pi )
l + = strlen ( pi ) ;
if ( pi & & sn & & ! strcmp ( pi , sn ) ) {
l - = strlen ( pi ) ;
pi = NULL ;
}
tmp = ( pval * ) emalloc ( sizeof ( pval ) ) ;
tmp - > value . str . val = emalloc ( l + 1 ) ;
tmp - > value . str . len = _php3_sprintf ( tmp - > value . str . val , " %s%s " , ( sn ? sn : " " ) , ( pi ? pi : " " ) ) ; /* SAFE */
tmp - > type = IS_STRING ;
tmp - > refcount = 1 ;
tmp - > is_ref = 0 ;
# endif
_php3_hash_update ( & EG ( symbol_table ) , " PHP_SELF " , sizeof ( " PHP_SELF " ) , ( void * ) & tmp , sizeof ( pval * ) , NULL ) ;
}
# endif
/* need argc/argv support as well */
1999-04-24 08:12:00 +08:00
_php3_build_argv ( request_info . query_string ELS_CC ) ;
1999-04-08 05:05:13 +08:00
return SUCCESS ;
}
void _php3_build_argv ( char * s ELS_DC )
{
pval * arr , * tmp ;
int count = 0 ;
char * ss , * space ;
arr = ( pval * ) emalloc ( sizeof ( pval ) ) ;
arr - > value . ht = ( HashTable * ) emalloc ( sizeof ( HashTable ) ) ;
if ( _php3_hash_init ( arr - > value . ht , 0 , NULL , PVAL_PTR_DTOR , 0 ) = = FAILURE ) {
php3_error ( E_WARNING , " Unable to create argv array " ) ;
} else {
arr - > type = IS_ARRAY ;
arr - > refcount = 1 ;
arr - > is_ref = 0 ;
_php3_hash_update ( & EG ( symbol_table ) , " argv " , sizeof ( " argv " ) , & arr , sizeof ( pval * ) , NULL ) ;
}
/* now pick out individual entries */
ss = s ;
while ( ss ) {
space = strchr ( ss , ' + ' ) ;
if ( space ) {
* space = ' \0 ' ;
}
/* auto-type */
tmp = ( pval * ) emalloc ( sizeof ( pval ) ) ;
tmp - > type = IS_STRING ;
tmp - > value . str . len = strlen ( ss ) ;
tmp - > value . str . val = estrndup ( ss , tmp - > value . str . len ) ;
tmp - > refcount = 1 ;
tmp - > is_ref = 0 ;
count + + ;
if ( _php3_hash_next_index_insert ( arr - > value . ht , & tmp , sizeof ( pval * ) , NULL ) = = FAILURE ) {
if ( tmp - > type = = IS_STRING ) {
efree ( tmp - > value . str . val ) ;
}
}
if ( space ) {
* space = ' + ' ;
ss = space + 1 ;
} else {
ss = space ;
}
}
tmp = ( pval * ) emalloc ( sizeof ( pval ) ) ;
tmp - > value . lval = count ;
tmp - > type = IS_LONG ;
tmp - > refcount = 1 ;
tmp - > is_ref = 0 ;
_php3_hash_add ( & EG ( symbol_table ) , " argc " , sizeof ( " argc " ) , & tmp , sizeof ( pval * ) , NULL ) ;
}
# include "logos.h"
1999-04-26 22:00:49 +08:00
PHPAPI void php_execute_script ( zend_file_handle * primary_file CLS_DC ELS_DC PLS_DC )
1999-04-08 05:05:13 +08:00
{
zend_file_handle * prepend_file_p , * append_file_p ;
zend_file_handle prepend_file , append_file ;
if ( request_info . query_string & & request_info . query_string [ 0 ] = = ' = ' ) {
if ( ! strcmp ( request_info . query_string + 1 , " PHPE9568F34-D428-11d2-A769-00AA001ACF42 " ) ) {
char * header_line = estrndup ( " Content-type: image/gif " , sizeof ( " Content-type: image/gif " ) - 1 ) ;
php4i_add_header_information ( header_line ) ;
PHPWRITE ( php4_logo , sizeof ( php4_logo ) ) ;
efree ( header_line ) ;
return ;
} else if ( ! strcmp ( request_info . query_string + 1 , " PHPE9568F35-D428-11d2-A769-00AA001ACF42 " ) ) {
char * header_line = estrndup ( " Content-type: image/gif " , sizeof ( " Content-type: image/gif " ) - 1 ) ;
php4i_add_header_information ( header_line ) ;
PHPWRITE ( zendtech_logo , sizeof ( zendtech_logo ) ) ;
efree ( header_line ) ;
return ;
}
}
if ( setjmp ( EG ( bailout ) ) ! = 0 ) {
1999-04-27 18:00:54 +08:00
PG ( unclean_shutdown ) = 1 ;
1999-04-08 05:05:13 +08:00
return ;
}
1999-04-22 01:28:54 +08:00
_php3_hash_environment ( PLS_C ) ;
1999-04-08 05:05:13 +08:00
1999-04-18 23:09:46 +08:00
# if WIN32||WINNT
UpdateIniFromRegistry ( primary_file - > filename ) ;
# endif
1999-04-08 05:05:13 +08:00
1999-04-10 21:32:47 +08:00
if ( PG ( auto_prepend_file ) & & PG ( auto_prepend_file ) [ 0 ] ) {
prepend_file . filename = PG ( auto_prepend_file ) ;
1999-04-08 05:05:13 +08:00
prepend_file . type = ZEND_HANDLE_FILENAME ;
prepend_file_p = & prepend_file ;
} else {
prepend_file_p = NULL ;
}
1999-04-10 21:32:47 +08:00
if ( PG ( auto_append_file ) & & PG ( auto_append_file ) [ 0 ] ) {
append_file . filename = PG ( auto_append_file ) ;
1999-04-08 05:05:13 +08:00
append_file . type = ZEND_HANDLE_FILENAME ;
append_file_p = & append_file ;
} else {
append_file_p = NULL ;
}
EG ( main_op_array ) = zend_compile_files ( 0 CLS_CC , 3 , prepend_file_p , primary_file , append_file_p ) ;
if ( EG ( main_op_array ) ) {
EG ( active_op_array ) = EG ( main_op_array ) ;
zend_execute ( EG ( main_op_array ) ELS_CC ) ;
1999-04-27 18:00:54 +08:00
} else {
PG ( unclean_shutdown ) = 1 ;
1999-04-08 05:05:13 +08:00
}
}
/* some systems are missing these from their header files */
# if APACHE
1999-04-27 01:26:37 +08:00
PHPAPI int apache_php3_module_main ( request_rec * r , int fd , int display_source_mode )
1999-04-08 05:05:13 +08:00
{
zend_file_handle file_handle ;
# ifdef ZTS
zend_compiler_globals cg ;
zend_executor_globals eg ;
1999-04-21 12:02:11 +08:00
php_core_globals pcg ;
1999-04-08 05:05:13 +08:00
zend_compiler_globals * compiler_globals = & cg ;
zend_executor_globals * executor_globals = & eg ;
1999-04-21 12:02:11 +08:00
php_core_globals * core_globals = & pcg ;
1999-04-08 05:05:13 +08:00
# endif
1999-04-27 01:26:37 +08:00
SLS_FETCH ( ) ;
1999-04-08 05:05:13 +08:00
1999-04-27 01:26:37 +08:00
SG ( server_context ) = r ;
1999-04-08 05:05:13 +08:00
1999-04-26 22:00:49 +08:00
if ( php_request_startup ( CLS_C ELS_CC PLS_CC ) = = FAILURE ) {
1999-04-08 05:05:13 +08:00
return FAILURE ;
}
php3_TreatHeaders ( ) ;
file_handle . type = ZEND_HANDLE_FD ;
file_handle . handle . fd = fd ;
file_handle . filename = request_info . filename ;
1999-04-26 22:00:49 +08:00
( void ) php_execute_script ( & file_handle CLS_CC ELS_CC ) ;
1999-04-08 05:05:13 +08:00
1999-04-24 06:45:01 +08:00
php3_header ( ) ; /* Make sure headers have been sent */
zend_end_ob_buffering ( 1 ) ;
1999-04-08 05:05:13 +08:00
return ( OK ) ;
}
# endif /* APACHE */
1999-04-26 22:00:49 +08:00
# if WIN32||WINNT
/* just so that this symbol gets exported... */
PHPAPI void dummy_indent ( )
{
zend_indent ( ) ;
}
# endif
1999-04-08 05:05:13 +08:00
/*
* Local variables :
* tab - width : 4
* c - basic - offset : 4
* End :
*/