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

1.1     ! misho       1: /*
        !             2:    +----------------------------------------------------------------------+
        !             3:    | PHP Version 5                                                        |
        !             4:    +----------------------------------------------------------------------+
        !             5:    | Copyright (c) 1997-2012 The PHP Group                                |
        !             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: */
        !            18: /* $Id: php_embed.c 321634 2012-01-01 13:15:04Z felipe $ */
        !            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: 
        !            93: static void php_embed_log_message(char *message)
        !            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>