Annotation of embedaddon/php/sapi/embed/php_embed.c, revision 1.1.1.3

1.1       misho       1: /*
                      2:    +----------------------------------------------------------------------+
                      3:    | PHP Version 5                                                        |
                      4:    +----------------------------------------------------------------------+
1.1.1.3 ! misho       5:    | Copyright (c) 1997-2013 The PHP Group                                |
1.1       misho       6:    +----------------------------------------------------------------------+
                      7:    | This source file is subject to version 3.01 of the PHP license,      |
                      8:    | that is bundled with this package in the file LICENSE, and is        |
                      9:    | available through the world-wide-web at the following url:           |
                     10:    | http://www.php.net/license/3_01.txt                                  |
                     11:    | If you did not receive a copy of the PHP license and are unable to   |
                     12:    | obtain it through the world-wide-web, please send a note to          |
                     13:    | license@php.net so we can mail you a copy immediately.               |
                     14:    +----------------------------------------------------------------------+
                     15:    | Author: Edin Kadribasic <edink@php.net>                              |
                     16:    +----------------------------------------------------------------------+
                     17: */
1.1.1.2   misho      18: /* $Id$ */
1.1       misho      19: 
                     20: #include "php_embed.h"
                     21: #include "ext/standard/php_standard.h"
                     22: 
                     23: #ifdef PHP_WIN32
                     24: #include <io.h>
                     25: #include <fcntl.h>
                     26: #endif
                     27: 
                     28: const char HARDCODED_INI[] =
                     29:        "html_errors=0\n"
                     30:        "register_argc_argv=1\n"
                     31:        "implicit_flush=1\n"
                     32:        "output_buffering=0\n"
                     33:        "max_execution_time=0\n"
                     34:        "max_input_time=-1\n\0";
                     35: 
                     36: static char* php_embed_read_cookies(TSRMLS_D)
                     37: {
                     38:        return NULL;
                     39: }
                     40: 
                     41: static int php_embed_deactivate(TSRMLS_D)
                     42: {
                     43:        fflush(stdout);
                     44:        return SUCCESS;
                     45: }
                     46: 
                     47: static inline size_t php_embed_single_write(const char *str, uint str_length)
                     48: {
                     49: #ifdef PHP_WRITE_STDOUT
                     50:        long ret;
                     51: 
                     52:        ret = write(STDOUT_FILENO, str, str_length);
                     53:        if (ret <= 0) return 0;
                     54:        return ret;
                     55: #else
                     56:        size_t ret;
                     57: 
                     58:        ret = fwrite(str, 1, MIN(str_length, 16384), stdout);
                     59:        return ret;
                     60: #endif
                     61: }
                     62: 
                     63: 
                     64: static int php_embed_ub_write(const char *str, uint str_length TSRMLS_DC)
                     65: {
                     66:        const char *ptr = str;
                     67:        uint remaining = str_length;
                     68:        size_t ret;
                     69: 
                     70:        while (remaining > 0) {
                     71:                ret = php_embed_single_write(ptr, remaining);
                     72:                if (!ret) {
                     73:                        php_handle_aborted_connection();
                     74:                }
                     75:                ptr += ret;
                     76:                remaining -= ret;
                     77:        }
                     78: 
                     79:        return str_length;
                     80: }
                     81: 
                     82: static void php_embed_flush(void *server_context)
                     83: {
                     84:        if (fflush(stdout)==EOF) {
                     85:                php_handle_aborted_connection();
                     86:        }
                     87: }
                     88: 
                     89: static void php_embed_send_header(sapi_header_struct *sapi_header, void *server_context TSRMLS_DC)
                     90: {
                     91: }
                     92: 
1.1.1.2   misho      93: static void php_embed_log_message(char *message TSRMLS_DC)
1.1       misho      94: {
                     95:        fprintf (stderr, "%s\n", message);
                     96: }
                     97: 
                     98: static void php_embed_register_variables(zval *track_vars_array TSRMLS_DC)
                     99: {
                    100:        php_import_environment_variables(track_vars_array TSRMLS_CC);
                    101: }
                    102: 
                    103: static int php_embed_startup(sapi_module_struct *sapi_module)
                    104: {
                    105:        if (php_module_startup(sapi_module, NULL, 0)==FAILURE) {
                    106:                return FAILURE;
                    107:        }
                    108:        return SUCCESS;
                    109: }
                    110: 
                    111: extern EMBED_SAPI_API sapi_module_struct php_embed_module = {
                    112:        "embed",                       /* name */
                    113:        "PHP Embedded Library",        /* pretty name */
                    114:        
                    115:        php_embed_startup,              /* startup */
                    116:        php_module_shutdown_wrapper,   /* shutdown */
                    117:   
                    118:        NULL,                          /* activate */
                    119:        php_embed_deactivate,           /* deactivate */
                    120:   
                    121:        php_embed_ub_write,             /* unbuffered write */
                    122:        php_embed_flush,                /* flush */
                    123:        NULL,                          /* get uid */
                    124:        NULL,                          /* getenv */
                    125:   
                    126:        php_error,                     /* error handler */
                    127:   
                    128:        NULL,                          /* header handler */
                    129:        NULL,                          /* send headers handler */
                    130:        php_embed_send_header,          /* send header handler */
                    131:        
                    132:        NULL,                          /* read POST data */
                    133:        php_embed_read_cookies,         /* read Cookies */
                    134:   
                    135:        php_embed_register_variables,   /* register server variables */
                    136:        php_embed_log_message,          /* Log message */
                    137:        NULL,                                                   /* Get request time */
                    138:        NULL,                                                   /* Child terminate */
                    139:   
                    140:        STANDARD_SAPI_MODULE_PROPERTIES
                    141: };
                    142: /* }}} */
                    143: 
                    144: /* {{{ arginfo ext/standard/dl.c */
                    145: ZEND_BEGIN_ARG_INFO(arginfo_dl, 0)
                    146:        ZEND_ARG_INFO(0, extension_filename)
                    147: ZEND_END_ARG_INFO()
                    148: /* }}} */
                    149: 
                    150: static const zend_function_entry additional_functions[] = {
                    151:        ZEND_FE(dl, arginfo_dl)
                    152:        {NULL, NULL, NULL}
                    153: };
                    154: 
                    155: EMBED_SAPI_API int php_embed_init(int argc, char **argv PTSRMLS_DC)
                    156: {
                    157:        zend_llist global_vars;
                    158: #ifdef ZTS
                    159:        void ***tsrm_ls = NULL;
                    160: #endif
                    161: 
                    162: #ifdef HAVE_SIGNAL_H
                    163: #if defined(SIGPIPE) && defined(SIG_IGN)
                    164:        signal(SIGPIPE, SIG_IGN); /* ignore SIGPIPE in standalone mode so
                    165:                                                                 that sockets created via fsockopen()
                    166:                                                                 don't kill PHP if the remote site
                    167:                                                                 closes it.  in apache|apxs mode apache
                    168:                                                                 does that for us!  thies@thieso.net
                    169:                                                                 20000419 */
                    170: #endif
                    171: #endif
                    172: 
                    173: #ifdef ZTS
                    174:   tsrm_startup(1, 1, 0, NULL);
                    175:   tsrm_ls = ts_resource(0);
                    176:   *ptsrm_ls = tsrm_ls;
                    177: #endif
                    178: 
                    179:   sapi_startup(&php_embed_module);
                    180: 
                    181: #ifdef PHP_WIN32
                    182:   _fmode = _O_BINARY;                  /*sets default for file streams to binary */
                    183:   setmode(_fileno(stdin), O_BINARY);           /* make the stdio mode be binary */
                    184:   setmode(_fileno(stdout), O_BINARY);          /* make the stdio mode be binary */
                    185:   setmode(_fileno(stderr), O_BINARY);          /* make the stdio mode be binary */
                    186: #endif
                    187: 
                    188:   php_embed_module.ini_entries = malloc(sizeof(HARDCODED_INI));
                    189:   memcpy(php_embed_module.ini_entries, HARDCODED_INI, sizeof(HARDCODED_INI));
                    190: 
                    191:   php_embed_module.additional_functions = additional_functions;
                    192: 
                    193:   if (argv) {
                    194:        php_embed_module.executable_location = argv[0];
                    195:   }
                    196: 
                    197:   if (php_embed_module.startup(&php_embed_module)==FAILURE) {
                    198:          return FAILURE;
                    199:   }
                    200:  
                    201:   zend_llist_init(&global_vars, sizeof(char *), NULL, 0);  
                    202: 
                    203:   /* Set some Embedded PHP defaults */
                    204:   SG(options) |= SAPI_OPTION_NO_CHDIR;
                    205:   SG(request_info).argc=argc;
                    206:   SG(request_info).argv=argv;
                    207: 
                    208:   if (php_request_startup(TSRMLS_C)==FAILURE) {
                    209:          php_module_shutdown(TSRMLS_C);
                    210:          return FAILURE;
                    211:   }
                    212:   
                    213:   SG(headers_sent) = 1;
                    214:   SG(request_info).no_headers = 1;
                    215:   php_register_variable("PHP_SELF", "-", NULL TSRMLS_CC);
                    216: 
                    217:   return SUCCESS;
                    218: }
                    219: 
                    220: EMBED_SAPI_API void php_embed_shutdown(TSRMLS_D)
                    221: {
                    222:        php_request_shutdown((void *) 0);
                    223:        php_module_shutdown(TSRMLS_C);
                    224:        sapi_shutdown();
                    225: #ifdef ZTS
                    226:     tsrm_shutdown();
                    227: #endif
                    228:        if (php_embed_module.ini_entries) {
                    229:                free(php_embed_module.ini_entries);
                    230:                php_embed_module.ini_entries = NULL;
                    231:        }
                    232: }
                    233: 
                    234: /*
                    235:  * Local variables:
                    236:  * tab-width: 4
                    237:  * c-basic-offset: 4
                    238:  * End:
                    239:  * vim600: sw=4 ts=4 fdm=marker
                    240:  * vim<600: sw=4 ts=4
                    241:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>