Annotation of embedaddon/php/sapi/apache/php_apache.c, revision 1.1.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:    | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca>                       |
                     16:    |          Stig Sæther Bakken <ssb@php.net>                            |
                     17:    |          David Sklar <sklar@student.net>                             |
                     18:    +----------------------------------------------------------------------+
                     19:  */
                     20: /* $Id: php_apache.c 321634 2012-01-01 13:15:04Z felipe $ */
                     21: 
                     22: #include "php_apache_http.h"
                     23: 
                     24: #if defined(PHP_WIN32) || defined(NETWARE)
                     25: #include "zend.h"
                     26: #include "ap_compat.h"
                     27: #endif
                     28: 
                     29: #ifdef ZTS
                     30: int php_apache_info_id;
                     31: #else
                     32: php_apache_info_struct php_apache_info;
                     33: #endif
                     34: 
                     35: #define SECTION(name)  PUTS("<h2>" name "</h2>\n")
                     36: 
                     37: #ifndef PHP_WIN32
                     38: extern module *top_module;
                     39: extern module **ap_loaded_modules;
                     40: #else
                     41: extern  __declspec(dllimport) module *top_module;
                     42: extern  __declspec(dllimport) module **ap_loaded_modules;
                     43: #endif
                     44: 
                     45: PHP_FUNCTION(virtual);
                     46: PHP_FUNCTION(apache_request_headers);
                     47: PHP_FUNCTION(apache_response_headers);
                     48: PHP_FUNCTION(apachelog);
                     49: PHP_FUNCTION(apache_note);
                     50: PHP_FUNCTION(apache_lookup_uri);
                     51: PHP_FUNCTION(apache_child_terminate);
                     52: PHP_FUNCTION(apache_setenv);
                     53: PHP_FUNCTION(apache_get_version);
                     54: PHP_FUNCTION(apache_get_modules);
                     55: PHP_FUNCTION(apache_reset_timeout);
                     56: 
                     57: PHP_MINFO_FUNCTION(apache);
                     58: 
                     59: ZEND_BEGIN_ARG_INFO(arginfo_apache_child_terminate, 0)
                     60: ZEND_END_ARG_INFO()
                     61: 
                     62: ZEND_BEGIN_ARG_INFO_EX(arginfo_apache_note, 0, 0, 1)
                     63:        ZEND_ARG_INFO(0, note_name)
                     64:        ZEND_ARG_INFO(0, note_value)
                     65: ZEND_END_ARG_INFO()
                     66: 
                     67: ZEND_BEGIN_ARG_INFO_EX(arginfo_apache_virtual, 0, 0, 1)
                     68:        ZEND_ARG_INFO(0, filename)
                     69: ZEND_END_ARG_INFO()
                     70: 
                     71: ZEND_BEGIN_ARG_INFO(arginfo_apache_request_headers, 0)
                     72: ZEND_END_ARG_INFO()
                     73: 
                     74: ZEND_BEGIN_ARG_INFO(arginfo_apache_response_headers, 0)
                     75: ZEND_END_ARG_INFO()
                     76: 
                     77: ZEND_BEGIN_ARG_INFO_EX(arginfo_apache_setenv, 0, 0, 2)
                     78:        ZEND_ARG_INFO(0, variable)
                     79:        ZEND_ARG_INFO(0, value)
                     80:        ZEND_ARG_INFO(0, walk_to_top)
                     81: ZEND_END_ARG_INFO()
                     82: 
                     83: ZEND_BEGIN_ARG_INFO_EX(arginfo_apache_lookup_uri, 0, 0, 1)
                     84:        ZEND_ARG_INFO(0, uri)
                     85: ZEND_END_ARG_INFO()
                     86: 
                     87: ZEND_BEGIN_ARG_INFO(arginfo_apache_get_version, 0)
                     88: ZEND_END_ARG_INFO()
                     89: 
                     90: ZEND_BEGIN_ARG_INFO(arginfo_apache_get_modules, 0)
                     91: ZEND_END_ARG_INFO()
                     92: 
                     93: ZEND_BEGIN_ARG_INFO(arginfo_apache_reset_timeout, 0)
                     94: ZEND_END_ARG_INFO()
                     95: 
                     96: 
                     97: 
                     98: const zend_function_entry apache_functions[] = {
                     99:        PHP_FE(virtual,                                                                 arginfo_apache_virtual)
                    100:        PHP_FE(apache_request_headers,                                  arginfo_apache_request_headers)
                    101:        PHP_FE(apache_note,                                                             arginfo_apache_note)
                    102:        PHP_FE(apache_lookup_uri,                                               arginfo_apache_lookup_uri)
                    103:        PHP_FE(apache_child_terminate,                                  arginfo_apache_child_terminate)
                    104:        PHP_FE(apache_setenv,                                                   arginfo_apache_setenv)
                    105:        PHP_FE(apache_response_headers,                                 arginfo_apache_response_headers)
                    106:        PHP_FE(apache_get_version,                                              arginfo_apache_get_version)
                    107:        PHP_FE(apache_get_modules,                                              arginfo_apache_get_modules)
                    108:        PHP_FE(apache_reset_timeout,                                    arginfo_apache_reset_timeout)
                    109:        PHP_FALIAS(getallheaders, apache_request_headers, arginfo_apache_request_headers)
                    110:        {NULL, NULL, NULL}
                    111: };
                    112: 
                    113: 
                    114: PHP_INI_BEGIN()
                    115:        STD_PHP_INI_ENTRY("xbithack",                   "0",                            PHP_INI_ALL,            OnUpdateLong,           xbithack, php_apache_info_struct, php_apache_info)
                    116:        STD_PHP_INI_ENTRY("engine",                             "1",                            PHP_INI_ALL,            OnUpdateLong,           engine, php_apache_info_struct, php_apache_info)
                    117:        STD_PHP_INI_ENTRY("last_modified",              "0",                            PHP_INI_ALL,            OnUpdateLong,           last_modified, php_apache_info_struct, php_apache_info)
                    118:        STD_PHP_INI_ENTRY("child_terminate",    "0",                            PHP_INI_ALL,            OnUpdateLong,           terminate_child, php_apache_info_struct, php_apache_info)
                    119: PHP_INI_END()
                    120: 
                    121: 
                    122: 
                    123: static void php_apache_globals_ctor(php_apache_info_struct *apache_globals TSRMLS_DC)
                    124: {
                    125:        apache_globals->in_request = 0;
                    126: }
                    127: 
                    128: 
                    129: static PHP_MINIT_FUNCTION(apache)
                    130: {
                    131: #ifdef ZTS
                    132:        ts_allocate_id(&php_apache_info_id, sizeof(php_apache_info_struct), (ts_allocate_ctor) php_apache_globals_ctor, NULL);
                    133: #else
                    134:        php_apache_globals_ctor(&php_apache_info TSRMLS_CC);
                    135: #endif
                    136:        REGISTER_INI_ENTRIES();
                    137:        return SUCCESS;
                    138: }
                    139: 
                    140: 
                    141: static PHP_MSHUTDOWN_FUNCTION(apache)
                    142: {
                    143:        UNREGISTER_INI_ENTRIES();
                    144:        return SUCCESS;
                    145: }
                    146: 
                    147: zend_module_entry apache_module_entry = {
                    148:        STANDARD_MODULE_HEADER,
                    149:        "apache", 
                    150:        apache_functions, 
                    151:        PHP_MINIT(apache), 
                    152:        PHP_MSHUTDOWN(apache), 
                    153:        NULL, 
                    154:        NULL, 
                    155:        PHP_MINFO(apache), 
                    156:        NO_VERSION_YET,
                    157:        STANDARD_MODULE_PROPERTIES
                    158: };
                    159: 
                    160: /* {{{ PHP_MINFO_FUNCTION
                    161:  */
                    162: PHP_MINFO_FUNCTION(apache)
                    163: {
                    164:        char *apv = (char *) ap_get_server_version();
                    165:        module *modp = NULL;
                    166:        char output_buf[128];
                    167: #if !defined(WIN32) && !defined(WINNT)
                    168:        char name[64];
                    169:        char modulenames[1024];
                    170:        char *p;
                    171: #endif
                    172:        server_rec *serv;
                    173:        extern char server_root[MAX_STRING_LEN];
                    174:        extern uid_t user_id;
                    175:        extern char *user_name;
                    176:        extern gid_t group_id;
                    177:        extern int max_requests_per_child;
                    178: 
                    179:        serv = ((request_rec *) SG(server_context))->server;
                    180: 
                    181: 
                    182:        php_info_print_table_start();
                    183: 
                    184: #ifdef PHP_WIN32
                    185:        php_info_print_table_row(1, "Apache for Windows 95/NT");
                    186:        php_info_print_table_end();
                    187:        php_info_print_table_start();
                    188: #elif defined(NETWARE)
                    189:        php_info_print_table_row(1, "Apache for NetWare");
                    190:        php_info_print_table_end();
                    191:        php_info_print_table_start();
                    192: #else
                    193:        php_info_print_table_row(2, "APACHE_INCLUDE", PHP_APACHE_INCLUDE);
                    194:        php_info_print_table_row(2, "APACHE_TARGET", PHP_APACHE_TARGET);
                    195: #endif
                    196: 
                    197:        if (apv && *apv) {
                    198:                php_info_print_table_row(2, "Apache Version", apv);
                    199:        } 
                    200: 
                    201: #ifdef APACHE_RELEASE
                    202:        snprintf(output_buf, sizeof(output_buf), "%d", APACHE_RELEASE);
                    203:        php_info_print_table_row(2, "Apache Release", output_buf);
                    204: #endif
                    205:        snprintf(output_buf, sizeof(output_buf), "%d", MODULE_MAGIC_NUMBER);
                    206:        php_info_print_table_row(2, "Apache API Version", output_buf);
                    207:        snprintf(output_buf, sizeof(output_buf), "%s:%u", serv->server_hostname, serv->port);
                    208:        php_info_print_table_row(2, "Hostname:Port", output_buf);
                    209: #if !defined(WIN32) && !defined(WINNT)
                    210:        snprintf(output_buf, sizeof(output_buf), "%s(%d)/%d", user_name, (int)user_id, (int)group_id);
                    211:        php_info_print_table_row(2, "User/Group", output_buf);
                    212:        snprintf(output_buf, sizeof(output_buf), "Per Child: %d - Keep Alive: %s - Max Per Connection: %d", max_requests_per_child, serv->keep_alive ? "on":"off", serv->keep_alive_max);
                    213:        php_info_print_table_row(2, "Max Requests", output_buf);
                    214: #endif
                    215:        snprintf(output_buf, sizeof(output_buf), "Connection: %d - Keep-Alive: %d", serv->timeout, serv->keep_alive_timeout);
                    216:        php_info_print_table_row(2, "Timeouts", output_buf);
                    217: #if !defined(WIN32) && !defined(WINNT)
                    218: /*
                    219:        This block seems to be working on NetWare; But it seems to be showing
                    220:        all modules instead of just the loaded ones
                    221: */
                    222:        php_info_print_table_row(2, "Server Root", server_root);
                    223: 
                    224:        strcpy(modulenames, "");
                    225:        for(modp = top_module; modp; modp = modp->next) {
                    226:                strlcpy(name, modp->name, sizeof(name));
                    227:                if ((p = strrchr(name, '.'))) {
                    228:                        *p='\0'; /* Cut off ugly .c extensions on module names */
                    229:                }
                    230:                strlcat(modulenames, name, sizeof(modulenames));
                    231:                if (modp->next) {
                    232:                        strlcat(modulenames, ", ", sizeof(modulenames));
                    233:                }
                    234:        }
                    235:        php_info_print_table_row(2, "Loaded Modules", modulenames);
                    236: #endif
                    237: 
                    238:        php_info_print_table_end();
                    239: 
                    240:        DISPLAY_INI_ENTRIES();
                    241: 
                    242:        {
                    243:                register int i;
                    244:                array_header *arr;
                    245:                table_entry *elts;
                    246:                request_rec *r;
                    247: 
                    248:                r = ((request_rec *) SG(server_context));
                    249:                arr = table_elts(r->subprocess_env);
                    250:                elts = (table_entry *)arr->elts;
                    251:                
                    252:                SECTION("Apache Environment");
                    253:                php_info_print_table_start();   
                    254:                php_info_print_table_header(2, "Variable", "Value");
                    255:                for (i=0; i < arr->nelts; i++) {
                    256:                        php_info_print_table_row(2, elts[i].key, elts[i].val);
                    257:                }
                    258:                php_info_print_table_end();     
                    259:        }
                    260: 
                    261:        {
                    262:                array_header *env_arr;
                    263:                table_entry *env;
                    264:                int i;
                    265:                request_rec *r;
                    266:                
                    267:                r = ((request_rec *) SG(server_context));
                    268:                SECTION("HTTP Headers Information");
                    269:                php_info_print_table_start();
                    270:                php_info_print_table_colspan_header(2, "HTTP Request Headers");
                    271:                php_info_print_table_row(2, "HTTP Request", r->the_request);
                    272:                env_arr = table_elts(r->headers_in);
                    273:                env = (table_entry *)env_arr->elts;
                    274:                for (i = 0; i < env_arr->nelts; ++i) {
                    275:                        if (env[i].key && (!PG(safe_mode) || (PG(safe_mode) && strncasecmp(env[i].key, "authorization", 13)))) {
                    276:                                php_info_print_table_row(2, env[i].key, env[i].val);
                    277:                        }
                    278:                }
                    279:                php_info_print_table_colspan_header(2, "HTTP Response Headers");
                    280:                env_arr = table_elts(r->headers_out);
                    281:                env = (table_entry *)env_arr->elts;
                    282:                for(i = 0; i < env_arr->nelts; ++i) {
                    283:                        if (env[i].key) {
                    284:                                php_info_print_table_row(2, env[i].key, env[i].val);
                    285:                        }
                    286:                }
                    287:                php_info_print_table_end();
                    288:        }
                    289: }
                    290: /* }}} */
                    291: 
                    292: /* {{{ proto bool apache_child_terminate(void)
                    293:    Terminate apache process after this request */
                    294: PHP_FUNCTION(apache_child_terminate)
                    295: {
                    296: #ifndef MULTITHREAD
                    297:        if (AP(terminate_child)) {
                    298:                ap_child_terminate( ((request_rec *)SG(server_context)) );
                    299:                RETURN_TRUE;
                    300:        } else { /* tell them to get lost! */
                    301:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "This function is disabled");
                    302:                RETURN_FALSE;
                    303:        }
                    304: #else
                    305:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "This function is not supported in this build");
                    306:                RETURN_FALSE;
                    307: #endif
                    308: }
                    309: /* }}} */
                    310: 
                    311: /* {{{ proto string apache_note(string note_name [, string note_value])
                    312:    Get and set Apache request notes */
                    313: PHP_FUNCTION(apache_note)
                    314: {
                    315:        char *note_name, *note_val = NULL;
                    316:        int note_name_len, note_val_len;
                    317:        char *old_val;
                    318: 
                    319:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &note_name, &note_name_len, &note_val, &note_val_len) == FAILURE) {
                    320:                return;
                    321:        }
                    322: 
                    323:        old_val = (char *) table_get(((request_rec *)SG(server_context))->notes, note_name);
                    324: 
                    325:        if (note_val) {
                    326:                table_set(((request_rec *)SG(server_context))->notes, note_name, note_val);
                    327:        }
                    328: 
                    329:        if (old_val) {
                    330:                RETURN_STRING(old_val, 1);
                    331:        }
                    332: 
                    333:        RETURN_FALSE;
                    334: }
                    335: /* }}} */
                    336: 
                    337: /* {{{ proto bool virtual(string filename)
                    338:    Perform an Apache sub-request */
                    339: /* This function is equivalent to <!--#include virtual...-->
                    340:  * in mod_include. It does an Apache sub-request. It is useful
                    341:  * for including CGI scripts or .shtml files, or anything else
                    342:  * that you'd parse through Apache (for .phtml files, you'd probably
                    343:  * want to use <?Include>. This only works when PHP is compiled
                    344:  * as an Apache module, since it uses the Apache API for doing
                    345:  * sub requests.
                    346:  */
                    347: PHP_FUNCTION(virtual)
                    348: {
                    349:        char *filename;
                    350:        int filename_len;
                    351:        request_rec *rr = NULL;
                    352: 
                    353:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &filename, &filename_len) == FAILURE) {
                    354:                return;
                    355:        }
                    356:        
                    357:        if (!(rr = sub_req_lookup_uri (filename, ((request_rec *) SG(server_context))))) {
                    358:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to include '%s' - URI lookup failed", filename);
                    359:                if (rr)
                    360:                        destroy_sub_req (rr);
                    361:                RETURN_FALSE;
                    362:        }
                    363: 
                    364:        if (rr->status != 200) {
                    365:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to include '%s' - error finding URI", filename);
                    366:                if (rr)
                    367:                        destroy_sub_req (rr);
                    368:                RETURN_FALSE;
                    369:        }
                    370: 
                    371:        php_end_ob_buffers(1 TSRMLS_CC);
                    372:        php_header(TSRMLS_C);
                    373: 
                    374:        if (run_sub_req(rr)) {
                    375:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to include '%s' - request execution failed", filename);
                    376:                if (rr)
                    377:                        destroy_sub_req (rr);
                    378:                RETURN_FALSE;
                    379:        }
                    380: 
                    381:        if (rr)
                    382:                destroy_sub_req (rr);
                    383: 
                    384:        RETURN_TRUE;
                    385: }
                    386: /* }}} */
                    387: 
                    388: /* {{{ proto array getallheaders(void)
                    389:    Alias for apache_request_headers() */
                    390: /* }}} */
                    391: 
                    392: /* {{{ proto array apache_request_headers(void)
                    393:    Fetch all HTTP request headers */
                    394: PHP_FUNCTION(apache_request_headers)
                    395: {
                    396:        array_header *env_arr;
                    397:        table_entry *tenv;
                    398:        int i;
                    399: 
                    400:        array_init(return_value);
                    401:        env_arr = table_elts(((request_rec *) SG(server_context))->headers_in);
                    402:        tenv = (table_entry *)env_arr->elts;
                    403:        for (i = 0; i < env_arr->nelts; ++i) {
                    404:                if (!tenv[i].key ||
                    405:                        (PG(safe_mode) &&
                    406:                         !strncasecmp(tenv[i].key, "authorization", 13))) {
                    407:                        continue;
                    408:                }
                    409:                if (add_assoc_string(return_value, tenv[i].key, (tenv[i].val==NULL) ? "" : tenv[i].val, 1)==FAILURE) {
                    410:                        RETURN_FALSE;
                    411:                }
                    412:     }
                    413: }
                    414: /* }}} */
                    415: 
                    416: /* {{{ proto array apache_response_headers(void)
                    417:    Fetch all HTTP response headers */
                    418: PHP_FUNCTION(apache_response_headers)
                    419: {
                    420:        array_header *env_arr;
                    421:        table_entry *tenv;
                    422:        int i;
                    423: 
                    424:        array_init(return_value);
                    425:        env_arr = table_elts(((request_rec *) SG(server_context))->headers_out);
                    426:        tenv = (table_entry *)env_arr->elts;
                    427:        for (i = 0; i < env_arr->nelts; ++i) {
                    428:                if (!tenv[i].key) continue;
                    429:                if (add_assoc_string(return_value, tenv[i].key, (tenv[i].val==NULL) ? "" : tenv[i].val, 1)==FAILURE) {
                    430:                        RETURN_FALSE;
                    431:                }
                    432:        }
                    433: }
                    434: /* }}} */
                    435: 
                    436: /* {{{ proto bool apache_setenv(string variable, string value [, bool walk_to_top])
                    437:    Set an Apache subprocess_env variable */
                    438: PHP_FUNCTION(apache_setenv)
                    439: {
                    440:        int var_len, val_len;
                    441:        zend_bool top=0;
                    442:        char *var = NULL, *val = NULL;
                    443:        request_rec *r = (request_rec *) SG(server_context);
                    444: 
                    445:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|b", &var, &var_len, &val, &val_len, &top) == FAILURE) {
                    446:                return;
                    447:        }
                    448: 
                    449:        while(top) {
                    450:                if(r->prev) r = r->prev;
                    451:                else break;
                    452:        }
                    453: 
                    454:        ap_table_setn(r->subprocess_env, ap_pstrndup(r->pool, var, var_len), ap_pstrndup(r->pool, val, val_len));
                    455:        RETURN_TRUE;
                    456: }
                    457: /* }}} */
                    458: 
                    459: /* {{{ proto object apache_lookup_uri(string URI)
                    460:    Perform a partial request of the given URI to obtain information about it */
                    461: PHP_FUNCTION(apache_lookup_uri)
                    462: {
                    463:        char *filename;
                    464:        int filename_len;
                    465:        request_rec *rr=NULL;
                    466: 
                    467:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &filename, &filename_len) == FAILURE) {
                    468:                return;
                    469:        }
                    470: 
                    471:        if (!(rr = sub_req_lookup_uri(filename, ((request_rec *) SG(server_context))))) {
                    472:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "URI lookup failed '%s'", filename);
                    473:                RETURN_FALSE;
                    474:        }
                    475: 
                    476:        object_init(return_value);
                    477:        add_property_long(return_value,"status", rr->status);
                    478: 
                    479:        if (rr->the_request) {
                    480:                add_property_string(return_value,"the_request", rr->the_request, 1);
                    481:        }
                    482:        if (rr->status_line) {
                    483:                add_property_string(return_value,"status_line", (char *)rr->status_line, 1);            
                    484:        }
                    485:        if (rr->method) {
                    486:                add_property_string(return_value,"method", (char *)rr->method, 1);              
                    487:        }
                    488:        if (rr->content_type) {
                    489:                add_property_string(return_value,"content_type", (char *)rr->content_type, 1);
                    490:        }
                    491:        if (rr->handler) {
                    492:                add_property_string(return_value,"handler", (char *)rr->handler, 1);            
                    493:        }
                    494:        if (rr->uri) {
                    495:                add_property_string(return_value,"uri", rr->uri, 1);
                    496:        }
                    497:        if (rr->filename) {
                    498:                add_property_string(return_value,"filename", rr->filename, 1);
                    499:        }
                    500:        if (rr->path_info) {
                    501:                add_property_string(return_value,"path_info", rr->path_info, 1);
                    502:        }
                    503:        if (rr->args) {
                    504:                add_property_string(return_value,"args", rr->args, 1);
                    505:        }
                    506:        if (rr->boundary) {
                    507:                add_property_string(return_value,"boundary", rr->boundary, 1);
                    508:        }
                    509: 
                    510:        add_property_long(return_value,"no_cache", rr->no_cache);
                    511:        add_property_long(return_value,"no_local_copy", rr->no_local_copy);
                    512:        add_property_long(return_value,"allowed", rr->allowed);
                    513:        add_property_long(return_value,"sent_bodyct", rr->sent_bodyct);
                    514:        add_property_long(return_value,"bytes_sent", rr->bytes_sent);
                    515:        add_property_long(return_value,"byterange", rr->byterange);
                    516:        add_property_long(return_value,"clength", rr->clength);
                    517: 
                    518: #if MODULE_MAGIC_NUMBER >= 19980324
                    519:        if (rr->unparsed_uri) {
                    520:                add_property_string(return_value,"unparsed_uri", rr->unparsed_uri, 1);
                    521:        }
                    522:        if(rr->mtime) {
                    523:                add_property_long(return_value,"mtime", rr->mtime);
                    524:        }
                    525: #endif
                    526:        if(rr->request_time) {
                    527:                add_property_long(return_value,"request_time", rr->request_time);
                    528:        }
                    529: 
                    530:        destroy_sub_req(rr);
                    531: }
                    532: /* }}} */
                    533: 
                    534: 
                    535: #if 0
                    536: This function is most likely a bad idea.  Just playing with it for now.
                    537: 
                    538: PHP_FUNCTION(apache_exec_uri)
                    539: {
                    540:        char *filename;
                    541:        int filename_len;
                    542:        request_rec *rr=NULL;
                    543:        TSRMLS_FETCH();
                    544: 
                    545:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &filename, &filename_len) == FAILURE) {
                    546:                return;
                    547:        }
                    548: 
                    549:        if(!(rr = ap_sub_req_lookup_uri(filename, ((request_rec *) SG(server_context))))) {
                    550:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "URI lookup failed", filename);
                    551:                RETURN_FALSE;
                    552:        }
                    553: 
                    554:        RETVAL_LONG(ap_run_sub_req(rr));
                    555:        ap_destroy_sub_req(rr);
                    556: }
                    557: #endif
                    558: 
                    559: /* {{{ proto string apache_get_version(void)
                    560:    Fetch Apache version */
                    561: PHP_FUNCTION(apache_get_version)
                    562: {
                    563:        char *apv = (char *) ap_get_server_version();
                    564: 
                    565:        if (apv && *apv) {
                    566:                RETURN_STRING(apv, 1);
                    567:        }
                    568: 
                    569:        RETURN_FALSE;
                    570: }
                    571: /* }}} */
                    572: 
                    573: /* {{{ proto array apache_get_modules(void)
                    574:    Get a list of loaded Apache modules */
                    575: PHP_FUNCTION(apache_get_modules)
                    576: {
                    577:        int n;
                    578:        char *p;
                    579:        
                    580:        array_init(return_value);
                    581:        
                    582:        for (n = 0; ap_loaded_modules[n]; ++n) {
                    583:                char *s = (char *) ap_loaded_modules[n]->name;
                    584:                if ((p = strchr(s, '.'))) {
                    585:                        add_next_index_stringl(return_value, s, (p - s), 1);
                    586:                } else {
                    587:                        add_next_index_string(return_value, s, 1);
                    588:                }       
                    589:        }
                    590: }
                    591: /* }}} */
                    592: 
                    593: /* {{{ proto bool apache_reset_timeout(void)
                    594:    Reset the Apache write timer */
                    595: PHP_FUNCTION(apache_reset_timeout)
                    596: {
                    597:        if (PG(safe_mode)) {
                    598:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot reset the Apache timeout in safe mode");
                    599:                RETURN_FALSE;
                    600:        }
                    601: 
                    602:        ap_reset_timeout((request_rec *)SG(server_context));
                    603:        RETURN_TRUE;
                    604: }
                    605: /* }}} */
                    606: 
                    607: /*
                    608:  * Local variables:
                    609:  * tab-width: 4
                    610:  * c-basic-offset: 4
                    611:  * End:
                    612:  * vim600: sw=4 ts=4 fdm=marker
                    613:  * vim<600: sw=4 ts=4
                    614:  */

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