Annotation of embedaddon/php/sapi/apache/php_apache.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:    | 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>