File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / sapi / apache2handler / php_functions.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 23:48:06 2012 UTC (12 years, 4 months ago) by misho
Branches: php, MAIN
CVS tags: v5_3_10, HEAD
php

    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: Sascha Schumann <sascha@schumann.cx>                         |
   16:    +----------------------------------------------------------------------+
   17:  */
   18: 
   19: /* $Id: php_functions.c,v 1.1.1.1 2012/02/21 23:48:06 misho Exp $ */
   20: 
   21: #define ZEND_INCLUDE_FULL_WINDOWS_HEADERS
   22: 
   23: #include "php.h"
   24: #include "ext/standard/php_smart_str.h"
   25: #include "ext/standard/info.h"
   26: #include "ext/standard/head.h"
   27: #include "php_ini.h"
   28: #include "SAPI.h"
   29: 
   30: #define CORE_PRIVATE
   31: #include "apr_strings.h"
   32: #include "apr_time.h"
   33: #include "ap_config.h"
   34: #include "util_filter.h"
   35: #include "httpd.h"
   36: #include "http_config.h"
   37: #include "http_request.h"
   38: #include "http_core.h"
   39: #include "http_protocol.h"
   40: #include "http_log.h"
   41: #include "http_main.h"
   42: #include "util_script.h"
   43: #include "http_core.h"
   44: #include "ap_mpm.h"
   45: #if !defined(WIN32) && !defined(WINNT) && !defined(NETWARE)
   46: #include "unixd.h"
   47: #endif
   48: 
   49: #include "php_apache.h"
   50: 
   51: #ifdef ZTS
   52: int php_apache2_info_id;
   53: #else
   54: php_apache2_info_struct php_apache2_info;
   55: #endif
   56: 
   57: #define SECTION(name)  PUTS("<h2>" name "</h2>\n")
   58: 
   59: static request_rec *php_apache_lookup_uri(char *filename TSRMLS_DC)
   60: {
   61: 	php_struct *ctx = SG(server_context);
   62: 	
   63: 	if (!filename || !ctx || !ctx->r) {
   64: 		return NULL;
   65: 	}
   66: 
   67: 	return ap_sub_req_lookup_uri(filename, ctx->r, ctx->r->output_filters);
   68: }
   69: 
   70: /* {{{ proto bool virtual(string uri)
   71:  Perform an apache sub-request */
   72: PHP_FUNCTION(virtual)
   73: {
   74: 	char *filename;
   75: 	int filename_len;
   76: 	request_rec *rr;
   77: 
   78: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &filename, &filename_len) == FAILURE) {
   79: 		return;
   80: 	}
   81: 
   82: 	if (!(rr = php_apache_lookup_uri(filename TSRMLS_CC))) {
   83: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to include '%s' - URI lookup failed", filename);
   84: 		RETURN_FALSE;
   85: 	}
   86: 
   87: 	if (rr->status != HTTP_OK) {
   88: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to include '%s' - error finding URI", filename);
   89: 		ap_destroy_sub_req(rr);
   90: 		RETURN_FALSE;
   91: 	}
   92: 
   93: 	/* Flush everything. */
   94: 	php_end_ob_buffers(1 TSRMLS_CC);
   95: 	php_header(TSRMLS_C);
   96: 
   97: 	/* Ensure that the ap_r* layer for the main request is flushed, to
   98: 	 * work around http://issues.apache.org/bugzilla/show_bug.cgi?id=17629 */
   99: 	ap_rflush(rr->main);
  100: 
  101: 	if (ap_run_sub_req(rr)) {
  102: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to include '%s' - request execution failed", filename);
  103: 		ap_destroy_sub_req(rr);
  104: 		RETURN_FALSE;
  105: 	}
  106: 	ap_destroy_sub_req(rr);
  107: 	RETURN_TRUE;
  108: }
  109: /* }}} */
  110: 
  111: #define ADD_LONG(name) \
  112: 		add_property_long(return_value, #name, rr->name)
  113: #define ADD_TIME(name) \
  114: 		add_property_long(return_value, #name, apr_time_sec(rr->name));
  115: #define ADD_STRING(name) \
  116: 		if (rr->name) add_property_string(return_value, #name, (char *) rr->name, 1)
  117: 
  118: PHP_FUNCTION(apache_lookup_uri)
  119: {
  120: 	request_rec *rr;
  121: 	char *filename;
  122: 	int filename_len;
  123: 
  124: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &filename, &filename_len) == FAILURE) {
  125: 		return;
  126: 	}
  127: 
  128: 	if (!(rr = php_apache_lookup_uri(filename TSRMLS_CC))) {
  129: 		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to include '%s' - URI lookup failed", filename);
  130: 		RETURN_FALSE;
  131: 	}
  132: 	
  133: 	if (rr->status == HTTP_OK) {
  134: 		object_init(return_value);
  135: 
  136: 		ADD_LONG(status);
  137: 		ADD_STRING(the_request);
  138: 		ADD_STRING(status_line);
  139: 		ADD_STRING(method);
  140: 		ADD_TIME(mtime);
  141: 		ADD_LONG(clength);
  142: #if MODULE_MAGIC_NUMBER < 20020506
  143: 		ADD_STRING(boundary);
  144: #endif
  145: 		ADD_STRING(range);
  146: 		ADD_LONG(chunked);
  147: 		ADD_STRING(content_type);
  148: 		ADD_STRING(handler);
  149: 		ADD_LONG(no_cache);
  150: 		ADD_LONG(no_local_copy);
  151: 		ADD_STRING(unparsed_uri);
  152: 		ADD_STRING(uri);
  153: 		ADD_STRING(filename);
  154: 		ADD_STRING(path_info);
  155: 		ADD_STRING(args);
  156: 		ADD_LONG(allowed);
  157: 		ADD_LONG(sent_bodyct);
  158: 		ADD_LONG(bytes_sent);
  159: 		ADD_LONG(mtime);
  160: 		ADD_TIME(request_time);
  161: 
  162: 		ap_destroy_sub_req(rr);
  163: 		return;
  164: 	}
  165: 	
  166: 	php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to include '%s' - error finding URI", filename);
  167: 	ap_destroy_sub_req(rr);
  168: 	RETURN_FALSE;
  169: }
  170: 
  171: /* {{{ proto array getallheaders(void)
  172:    Fetch all HTTP request headers */
  173: PHP_FUNCTION(apache_request_headers)
  174: {
  175: 	php_struct *ctx;
  176: 	const apr_array_header_t *arr;
  177: 	char *key, *val;
  178: 
  179: 	if (zend_parse_parameters_none() == FAILURE) {
  180: 		return;
  181: 	}
  182: 
  183: 	array_init(return_value);
  184: 	
  185: 	ctx = SG(server_context);
  186: 	arr = apr_table_elts(ctx->r->headers_in);
  187: 
  188: 	APR_ARRAY_FOREACH_OPEN(arr, key, val)
  189: 		if (!val) val = "";
  190: 		add_assoc_string(return_value, key, val, 1);
  191: 	APR_ARRAY_FOREACH_CLOSE()
  192: }
  193: /* }}} */
  194: 
  195: /* {{{ proto array apache_response_headers(void)
  196:    Fetch all HTTP response headers */
  197: PHP_FUNCTION(apache_response_headers)
  198: {
  199: 	php_struct *ctx;
  200: 	const apr_array_header_t *arr;
  201: 	char *key, *val;
  202: 
  203: 	if (zend_parse_parameters_none() == FAILURE) {
  204: 		return;
  205: 	}
  206: 
  207: 	array_init(return_value);
  208: 	
  209: 	ctx = SG(server_context);
  210: 	arr = apr_table_elts(ctx->r->headers_out);
  211: 
  212: 	APR_ARRAY_FOREACH_OPEN(arr, key, val)
  213: 		if (!val) val = "";
  214: 		add_assoc_string(return_value, key, val, 1);
  215: 	APR_ARRAY_FOREACH_CLOSE()
  216: }
  217: /* }}} */
  218: 
  219: /* {{{ proto string apache_note(string note_name [, string note_value])
  220:    Get and set Apache request notes */
  221: PHP_FUNCTION(apache_note)
  222: {
  223: 	php_struct *ctx;
  224: 	char *note_name, *note_val = NULL;
  225: 	int note_name_len, note_val_len;
  226: 	char *old_note_val=NULL;
  227: 
  228: 	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &note_name, &note_name_len, &note_val, &note_val_len) == FAILURE) {
  229: 		return;
  230: 	}
  231: 
  232: 	ctx = SG(server_context);
  233: 
  234: 	old_note_val = (char *) apr_table_get(ctx->r->notes, note_name);
  235: 
  236: 	if (note_val) {
  237: 		apr_table_set(ctx->r->notes, note_name, note_val);
  238: 	}
  239: 
  240: 	if (old_note_val) {
  241: 		RETURN_STRING(old_note_val, 1);
  242: 	}
  243: 
  244: 	RETURN_FALSE;
  245: }
  246: /* }}} */
  247: 
  248: 
  249: /* {{{ proto bool apache_setenv(string variable, string value [, bool walk_to_top])
  250:    Set an Apache subprocess_env variable */
  251: /*
  252:  * XXX this doesn't look right. shouldn't it be the parent ?*/
  253: PHP_FUNCTION(apache_setenv)
  254: {
  255: 	php_struct *ctx;
  256: 	char *variable=NULL, *string_val=NULL;
  257: 	int variable_len, string_val_len;
  258: 	zend_bool walk_to_top = 0;
  259: 	int arg_count = ZEND_NUM_ARGS();
  260: 	request_rec *r;
  261: 
  262: 	if (zend_parse_parameters(arg_count TSRMLS_CC, "ss|b", &variable, &variable_len, &string_val, &string_val_len, &walk_to_top) == FAILURE) {
  263: 		return;
  264: 	}
  265: 
  266: 	ctx = SG(server_context);
  267: 
  268: 	r = ctx->r;
  269: 	if (arg_count == 3) {
  270: 		if (walk_to_top) {
  271: 			while(r->prev) {
  272: 				r = r->prev;
  273: 			}
  274: 		}
  275: 	}
  276: 
  277: 	apr_table_set(r->subprocess_env, variable, string_val);
  278: 
  279: 	RETURN_TRUE;
  280: }
  281: /* }}} */
  282: 
  283: /* {{{ proto bool apache_getenv(string variable [, bool walk_to_top])
  284:    Get an Apache subprocess_env variable */
  285: /*
  286:  * XXX: shouldn't this be the parent not the 'prev'
  287:  */
  288: PHP_FUNCTION(apache_getenv)
  289: {
  290: 	php_struct *ctx;
  291: 	char *variable=NULL;
  292: 	int variable_len;
  293: 	zend_bool walk_to_top = 0;
  294: 	int arg_count = ZEND_NUM_ARGS();
  295: 	char *env_val=NULL;
  296: 	request_rec *r;
  297: 
  298: 	if (zend_parse_parameters(arg_count TSRMLS_CC, "s|b", &variable, &variable_len, &walk_to_top) == FAILURE) {
  299: 		return;
  300: 	}
  301: 
  302: 	ctx = SG(server_context);
  303: 
  304: 	r = ctx->r;
  305: 	if (arg_count == 2) {
  306: 		if (walk_to_top) {
  307: 			while(r->prev) {
  308: 				r = r->prev;
  309: 			}
  310: 		}
  311: 	}
  312: 
  313: 	env_val = (char*) apr_table_get(r->subprocess_env, variable);
  314: 
  315: 	if (env_val != NULL) {
  316: 		RETURN_STRING(env_val, 1);
  317: 	}
  318: 
  319: 	RETURN_FALSE;
  320: }
  321: /* }}} */
  322: 
  323: static char *php_apache_get_version()
  324: {
  325: #if MODULE_MAGIC_NUMBER_MAJOR >= 20060905
  326: 	return (char *) ap_get_server_banner();
  327: #else
  328: 	return (char *) ap_get_server_version();
  329: #endif
  330: }
  331: 
  332: /* {{{ proto string apache_get_version(void)
  333:    Fetch Apache version */
  334: PHP_FUNCTION(apache_get_version)
  335: {
  336: 	char *apv = php_apache_get_version();
  337: 
  338: 	if (apv && *apv) {
  339: 		RETURN_STRING(apv, 1);
  340: 	} else {
  341: 		RETURN_FALSE;
  342: 	}
  343: }
  344: /* }}} */
  345: 
  346: /* {{{ proto array apache_get_modules(void)
  347:    Get a list of loaded Apache modules */
  348: PHP_FUNCTION(apache_get_modules)
  349: {
  350: 	int n;
  351: 	char *p;
  352: 	
  353: 	array_init(return_value);
  354: 	
  355: 	for (n = 0; ap_loaded_modules[n]; ++n) {
  356: 		char *s = (char *) ap_loaded_modules[n]->name;
  357: 		if ((p = strchr(s, '.'))) {
  358: 			add_next_index_stringl(return_value, s, (p - s), 1);
  359: 		} else {
  360: 			add_next_index_string(return_value, s, 1);
  361: 		}
  362: 	}
  363: }
  364: /* }}} */
  365: 
  366: PHP_MINFO_FUNCTION(apache)
  367: {
  368: 	char *apv = php_apache_get_version();
  369: 	smart_str tmp1 = {0};
  370: 	char tmp[1024];
  371: 	int n, max_requests;
  372: 	char *p;
  373: 	server_rec *serv = ((php_struct *) SG(server_context))->r->server;
  374: #if !defined(WIN32) && !defined(WINNT) && !defined(NETWARE)
  375: #if MODULE_MAGIC_NUMBER_MAJOR >= 20081201
  376: 	AP_DECLARE_DATA extern unixd_config_rec ap_unixd_config;
  377: #else
  378: 	AP_DECLARE_DATA extern unixd_config_rec unixd_config;
  379: #endif
  380: #endif
  381: 	
  382: 	for (n = 0; ap_loaded_modules[n]; ++n) {
  383: 		char *s = (char *) ap_loaded_modules[n]->name;
  384: 		if ((p = strchr(s, '.'))) {
  385: 			smart_str_appendl(&tmp1, s, (p - s));
  386: 		} else {
  387: 			smart_str_appends(&tmp1, s);
  388: 		}
  389: 		smart_str_appendc(&tmp1, ' ');
  390: 	}
  391: 	if ((tmp1.len - 1) >= 0) {
  392: 		tmp1.c[tmp1.len - 1] = '\0';
  393: 	}
  394:             
  395: 	php_info_print_table_start();
  396: 	if (apv && *apv) {
  397: 		php_info_print_table_row(2, "Apache Version", apv);
  398: 	}
  399: 	snprintf(tmp, sizeof(tmp), "%d", MODULE_MAGIC_NUMBER);
  400: 	php_info_print_table_row(2, "Apache API Version", tmp);
  401: 	
  402: 	if (serv->server_admin && *(serv->server_admin)) {
  403: 		php_info_print_table_row(2, "Server Administrator", serv->server_admin);
  404: 	}
  405: 	
  406: 	snprintf(tmp, sizeof(tmp), "%s:%u", serv->server_hostname, serv->port);
  407: 	php_info_print_table_row(2, "Hostname:Port", tmp);
  408: 	
  409: #if !defined(WIN32) && !defined(WINNT) && !defined(NETWARE)
  410: #if MODULE_MAGIC_NUMBER_MAJOR >= 20081201
  411: 	snprintf(tmp, sizeof(tmp), "%s(%d)/%d", ap_unixd_config.user_name, ap_unixd_config.user_id, ap_unixd_config.group_id);
  412: #else
  413: 	snprintf(tmp, sizeof(tmp), "%s(%d)/%d", unixd_config.user_name, unixd_config.user_id, unixd_config.group_id);
  414: #endif
  415: 	php_info_print_table_row(2, "User/Group", tmp);
  416: #endif
  417: 
  418: 	ap_mpm_query(AP_MPMQ_MAX_REQUESTS_DAEMON, &max_requests);
  419: 	snprintf(tmp, sizeof(tmp), "Per Child: %d - Keep Alive: %s - Max Per Connection: %d", max_requests, (serv->keep_alive ? "on":"off"), serv->keep_alive_max);
  420: 	php_info_print_table_row(2, "Max Requests", tmp);
  421: 
  422: 	apr_snprintf(tmp, sizeof tmp,
  423: 				 "Connection: %" APR_TIME_T_FMT " - Keep-Alive: %" APR_TIME_T_FMT, 
  424: 				 apr_time_sec(serv->timeout), apr_time_sec(serv->keep_alive_timeout));
  425: 	php_info_print_table_row(2, "Timeouts", tmp);
  426: 	
  427: 	php_info_print_table_row(2, "Virtual Server", (serv->is_virtual ? "Yes" : "No"));
  428: 	php_info_print_table_row(2, "Server Root", ap_server_root);
  429: 	php_info_print_table_row(2, "Loaded Modules", tmp1.c);
  430: 
  431: 	smart_str_free(&tmp1);
  432: 	php_info_print_table_end();
  433: 	
  434: 	DISPLAY_INI_ENTRIES();
  435: 
  436: 	{
  437: 		const apr_array_header_t *arr = apr_table_elts(((php_struct *) SG(server_context))->r->subprocess_env);
  438: 		char *key, *val;
  439: 		
  440: 		SECTION("Apache Environment");
  441: 		php_info_print_table_start();	
  442: 		php_info_print_table_header(2, "Variable", "Value");
  443: 		APR_ARRAY_FOREACH_OPEN(arr, key, val)
  444: 			if (!val) {
  445: 				val = "";
  446: 			}
  447: 			php_info_print_table_row(2, key, val);
  448: 		APR_ARRAY_FOREACH_CLOSE()
  449: 		                                                
  450: 		php_info_print_table_end();	
  451: 		
  452: 		SECTION("HTTP Headers Information");
  453: 		php_info_print_table_start();
  454: 		php_info_print_table_colspan_header(2, "HTTP Request Headers");
  455: 		php_info_print_table_row(2, "HTTP Request", ((php_struct *) SG(server_context))->r->the_request);
  456: 		
  457: 		arr = apr_table_elts(((php_struct *) SG(server_context))->r->headers_in);
  458: 		APR_ARRAY_FOREACH_OPEN(arr, key, val)
  459: 			if (!val) {
  460: 				val = "";
  461: 			}
  462: 		        php_info_print_table_row(2, key, val);
  463: 		APR_ARRAY_FOREACH_CLOSE()
  464: 
  465: 		php_info_print_table_colspan_header(2, "HTTP Response Headers");
  466: 		arr = apr_table_elts(((php_struct *) SG(server_context))->r->headers_out);
  467: 		APR_ARRAY_FOREACH_OPEN(arr, key, val)
  468: 			if (!val) {
  469: 				val = "";
  470: 			}
  471: 		        php_info_print_table_row(2, key, val);
  472: 		APR_ARRAY_FOREACH_CLOSE()
  473: 		
  474: 		php_info_print_table_end();
  475: 	}
  476: }
  477: 
  478: /* {{{ arginfo */
  479: ZEND_BEGIN_ARG_INFO_EX(arginfo_apache2handler_lookup_uri, 0, 0, 1)
  480: 	ZEND_ARG_INFO(0, filename)
  481: ZEND_END_ARG_INFO()
  482: 
  483: ZEND_BEGIN_ARG_INFO_EX(arginfo_apache2handler_virtual, 0, 0, 1)
  484: 	ZEND_ARG_INFO(0, uri)
  485: ZEND_END_ARG_INFO()
  486: 
  487: ZEND_BEGIN_ARG_INFO(arginfo_apache2handler_response_headers, 0)
  488: ZEND_END_ARG_INFO()
  489: 
  490: ZEND_BEGIN_ARG_INFO(arginfo_apache2handler_getallheaders, 0)
  491: ZEND_END_ARG_INFO()
  492: 
  493: ZEND_BEGIN_ARG_INFO_EX(arginfo_apache2handler_note, 0, 0, 1)
  494: 	ZEND_ARG_INFO(0, note_name)
  495: 	ZEND_ARG_INFO(0, note_value)
  496: ZEND_END_ARG_INFO()
  497: 
  498: ZEND_BEGIN_ARG_INFO_EX(arginfo_apache2handler_setenv, 0, 0, 2)
  499: 	ZEND_ARG_INFO(0, variable)
  500: 	ZEND_ARG_INFO(0, value)
  501: 	ZEND_ARG_INFO(0, walk_to_top)
  502: ZEND_END_ARG_INFO()
  503: 
  504: ZEND_BEGIN_ARG_INFO_EX(arginfo_apache2handler_getenv, 0, 0, 1)
  505: 	ZEND_ARG_INFO(0, variable)
  506: 	ZEND_ARG_INFO(0, walk_to_top)
  507: ZEND_END_ARG_INFO()
  508: 
  509: ZEND_BEGIN_ARG_INFO(arginfo_apache2handler_get_version, 0)
  510: ZEND_END_ARG_INFO()
  511: 
  512: ZEND_BEGIN_ARG_INFO(arginfo_apache2handler_get_modules, 0)
  513: ZEND_END_ARG_INFO()
  514: /* }}} */
  515: 
  516: static const zend_function_entry apache_functions[] = {
  517: 	PHP_FE(apache_lookup_uri, 		arginfo_apache2handler_lookup_uri)
  518: 	PHP_FE(virtual, 				arginfo_apache2handler_virtual) 
  519: 	PHP_FE(apache_request_headers, 	arginfo_apache2handler_getallheaders)
  520: 	PHP_FE(apache_response_headers, arginfo_apache2handler_response_headers)
  521: 	PHP_FE(apache_setenv, 		arginfo_apache2handler_setenv)
  522: 	PHP_FE(apache_getenv, 		arginfo_apache2handler_getenv)
  523: 	PHP_FE(apache_note, 		arginfo_apache2handler_note)
  524: 	PHP_FE(apache_get_version, 	arginfo_apache2handler_get_version)
  525: 	PHP_FE(apache_get_modules, 	arginfo_apache2handler_get_modules)
  526: 	PHP_FALIAS(getallheaders, 	apache_request_headers, arginfo_apache2handler_getallheaders)
  527: 	{NULL, NULL, NULL}
  528: };
  529: 
  530: PHP_INI_BEGIN()
  531: 	STD_PHP_INI_ENTRY("xbithack",		"0",	PHP_INI_ALL,	OnUpdateLong,	xbithack,	php_apache2_info_struct, php_apache2_info)
  532: 	STD_PHP_INI_ENTRY("engine",		"1",	PHP_INI_ALL,	OnUpdateLong,	engine, 	php_apache2_info_struct, php_apache2_info)
  533: 	STD_PHP_INI_ENTRY("last_modified",	"0",	PHP_INI_ALL,	OnUpdateLong,	last_modified,	php_apache2_info_struct, php_apache2_info)
  534: PHP_INI_END()
  535: 
  536: static PHP_MINIT_FUNCTION(apache)
  537: {
  538: #ifdef ZTS
  539: 	ts_allocate_id(&php_apache2_info_id, sizeof(php_apache2_info_struct), (ts_allocate_ctor) NULL, NULL);
  540: #endif
  541: 	REGISTER_INI_ENTRIES();
  542: 	return SUCCESS;
  543: }
  544: 
  545: static PHP_MSHUTDOWN_FUNCTION(apache)
  546: {
  547: 	UNREGISTER_INI_ENTRIES();
  548: 	return SUCCESS;
  549: }
  550: 
  551: zend_module_entry php_apache_module = {
  552: 	STANDARD_MODULE_HEADER,
  553: 	"apache2handler",
  554: 	apache_functions,
  555: 	PHP_MINIT(apache),
  556: 	PHP_MSHUTDOWN(apache),
  557: 	NULL,
  558: 	NULL, 
  559: 	PHP_MINFO(apache),
  560: 	NULL,
  561: 	STANDARD_MODULE_PROPERTIES
  562: };
  563: 
  564: /*
  565:  * Local variables:
  566:  * tab-width: 4
  567:  * c-basic-offset: 4
  568:  * End:
  569:  * vim600: sw=4 ts=4 fdm=marker
  570:  * vim<600: sw=4 ts=4
  571:  */

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