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>