Blame standalone/server.c

Packit 284210
/*
Packit 284210
* ModSecurity for Apache 2.x, http://www.modsecurity.org/
Packit 284210
* Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/)
Packit 284210
*
Packit 284210
* You may not use this file except in compliance with
Packit 284210
* the License.  You may obtain a copy of the License at
Packit 284210
*
Packit 284210
*     http://www.apache.org/licenses/LICENSE-2.0
Packit 284210
*
Packit 284210
* If any of the files related to licensing are missing or if you have any
Packit 284210
* other questions related to licensing please contact Trustwave Holdings, Inc.
Packit 284210
* directly using the email address security@modsecurity.org.
Packit 284210
*/
Packit 284210
Packit 284210
#include <limits.h>
Packit 284210
Packit 284210
#include "http_core.h"
Packit 284210
#include "http_request.h"
Packit 284210
Packit 284210
#include "modsecurity.h"
Packit 284210
#include "apache2.h"
Packit 284210
#include "http_main.h"
Packit 284210
#include "http_connection.h"
Packit 284210
Packit 284210
#include "apr_optional.h"
Packit 284210
#include "mod_log_config.h"
Packit 284210
Packit 284210
#include "msc_logging.h"
Packit 284210
#include "msc_util.h"
Packit 284210
Packit 284210
#include "ap_mpm.h"
Packit 284210
#include "scoreboard.h"
Packit 284210
Packit 284210
#include "apr_version.h"
Packit 284210
Packit 284210
#include "apr_lib.h"
Packit 284210
#include "ap_config.h"
Packit 284210
#include "http_config.h"
Packit 284210
Packit 284210
#ifdef HAVE_UNISTD_H
Packit 284210
#include <unistd.h>
Packit 284210
#endif
Packit 284210
#ifdef HAVE_SYS_SEM_H
Packit 284210
#include <sys/sem.h>
Packit 284210
#endif
Packit 284210
Packit 284210
//=========
Packit 284210
Packit 284210
/** The default path for CGI scripts if none is currently set */
Packit 284210
#ifndef DEFAULT_PATH
Packit 284210
#define DEFAULT_PATH "/bin:/usr/bin:/usr/ucb:/usr/bsd:/usr/local/bin"
Packit 284210
#endif
Packit 284210
Packit 284210
//=========
Packit 284210
Packit 284210
AP_DECLARE_DATA scoreboard *ap_scoreboard_image = NULL;
Packit 284210
Packit 284210
AP_DECLARE_DATA apr_array_header_t *ap_server_config_defines = NULL;
Packit 284210
Packit 284210
AP_DECLARE_DATA const char *ap_server_root = "\\";
Packit 284210
Packit 284210
static int server_limit, thread_limit, lb_limit;
Packit 284210
static apr_size_t scoreboard_size;
Packit 284210
Packit 284210
void *modsecLogObj = NULL;
Packit 284210
void (*modsecLogHook)(void *obj, int level, char *str) = NULL;
Packit 284210
Packit 284210
//=========
Packit 284210
Packit 284210
static const char * const status_lines[RESPONSE_CODES] =
Packit 284210
{
Packit 284210
    "100 Continue",
Packit 284210
    "101 Switching Protocols",
Packit 284210
    "102 Processing",
Packit 284210
#define LEVEL_200  3
Packit 284210
    "200 OK",
Packit 284210
    "201 Created",
Packit 284210
    "202 Accepted",
Packit 284210
    "203 Non-Authoritative Information",
Packit 284210
    "204 No Content",
Packit 284210
    "205 Reset Content",
Packit 284210
    "206 Partial Content",
Packit 284210
    "207 Multi-Status",
Packit 284210
#define LEVEL_300 11
Packit 284210
    "300 Multiple Choices",
Packit 284210
    "301 Moved Permanently",
Packit 284210
    "302 Found",
Packit 284210
    "303 See Other",
Packit 284210
    "304 Not Modified",
Packit 284210
    "305 Use Proxy",
Packit 284210
    "306 unused",
Packit 284210
    "307 Temporary Redirect",
Packit 284210
#define LEVEL_400 19
Packit 284210
    "400 Bad Request",
Packit 284210
    "401 Authorization Required",
Packit 284210
    "402 Payment Required",
Packit 284210
    "403 Forbidden",
Packit 284210
    "404 Not Found",
Packit 284210
    "405 Method Not Allowed",
Packit 284210
    "406 Not Acceptable",
Packit 284210
    "407 Proxy Authentication Required",
Packit 284210
    "408 Request Time-out",
Packit 284210
    "409 Conflict",
Packit 284210
    "410 Gone",
Packit 284210
    "411 Length Required",
Packit 284210
    "412 Precondition Failed",
Packit 284210
    "413 Request Entity Too Large",
Packit 284210
    "414 Request-URI Too Large",
Packit 284210
    "415 Unsupported Media Type",
Packit 284210
    "416 Requested Range Not Satisfiable",
Packit 284210
    "417 Expectation Failed",
Packit 284210
    "418 unused",
Packit 284210
    "419 unused",
Packit 284210
    "420 unused",
Packit 284210
    "421 unused",
Packit 284210
    "422 Unprocessable Entity",
Packit 284210
    "423 Locked",
Packit 284210
    "424 Failed Dependency",
Packit 284210
    /* This is a hack, but it is required for ap_index_of_response
Packit 284210
     * to work with 426.
Packit 284210
     */
Packit 284210
    "425 No code",
Packit 284210
    "426 Upgrade Required",
Packit 284210
#define LEVEL_500 46
Packit 284210
    "500 Internal Server Error",
Packit 284210
    "501 Method Not Implemented",
Packit 284210
    "502 Bad Gateway",
Packit 284210
    "503 Service Temporarily Unavailable",
Packit 284210
    "504 Gateway Time-out",
Packit 284210
    "505 HTTP Version Not Supported",
Packit 284210
    "506 Variant Also Negotiates",
Packit 284210
    "507 Insufficient Storage",
Packit 284210
    "508 unused",
Packit 284210
    "509 unused",
Packit 284210
    "510 Not Extended"
Packit 284210
};
Packit 284210
Packit 284210
AP_DECLARE(int) ap_index_of_response(int status)
Packit 284210
{
Packit 284210
    static int shortcut[6] = {0, LEVEL_200, LEVEL_300, LEVEL_400,
Packit 284210
    LEVEL_500, RESPONSE_CODES};
Packit 284210
    int i, pos;
Packit 284210
Packit 284210
    if (status < 100) {               /* Below 100 is illegal for HTTP status */
Packit 284210
        return LEVEL_500;
Packit 284210
    }
Packit 284210
Packit 284210
    for (i = 0; i < 5; i++) {
Packit 284210
        status -= 100;
Packit 284210
        if (status < 100) {
Packit 284210
            pos = (status + shortcut[i]);
Packit 284210
            if (pos < shortcut[i + 1]) {
Packit 284210
                return pos;
Packit 284210
            }
Packit 284210
            else {
Packit 284210
                return LEVEL_500;            /* status unknown (falls in gap) */
Packit 284210
            }
Packit 284210
        }
Packit 284210
    }
Packit 284210
    return LEVEL_500;                         /* 600 or above is also illegal */
Packit 284210
}
Packit 284210
Packit 284210
//=========
Packit 284210
Packit 284210
static char *http2env(apr_pool_t *a, const char *w)
Packit 284210
{
Packit 284210
    char *res = (char *)apr_palloc(a, sizeof("HTTP_") + strlen(w));
Packit 284210
    char *cp = res;
Packit 284210
    char c;
Packit 284210
Packit 284210
    *cp++ = 'H';
Packit 284210
    *cp++ = 'T';
Packit 284210
    *cp++ = 'T';
Packit 284210
    *cp++ = 'P';
Packit 284210
    *cp++ = '_';
Packit 284210
Packit 284210
    while ((c = *w++) != 0) {
Packit 284210
        if (!apr_isalnum(c)) {
Packit 284210
            *cp++ = '_';
Packit 284210
        }
Packit 284210
        else {
Packit 284210
            *cp++ = apr_toupper(c);
Packit 284210
        }
Packit 284210
    }
Packit 284210
    *cp = 0;
Packit 284210
Packit 284210
    return res;
Packit 284210
}
Packit 284210
Packit 284210
AP_DECLARE(apr_uint32_t) ap_random_pick(apr_uint32_t min, apr_uint32_t max)
Packit 284210
{
Packit 284210
    return rand();
Packit 284210
}
Packit 284210
Packit 284210
AP_DECLARE(char *) ap_escape_html2(apr_pool_t *p, const char *s, int toasc)
Packit 284210
{
Packit 284210
    int i, j;
Packit 284210
    char *x;
Packit 284210
Packit 284210
    /* first, count the number of extra characters */
Packit 284210
    for (i = 0, j = 0; s[i] != '\0'; i++)
Packit 284210
        if (s[i] == '<' || s[i] == '>')
Packit 284210
            j += 3;
Packit 284210
        else if (s[i] == '&')
Packit 284210
            j += 4;
Packit 284210
        else if (s[i] == '"')
Packit 284210
            j += 5;
Packit 284210
        else if (toasc && !apr_isascii(s[i]))
Packit 284210
            j += 5;
Packit 284210
Packit 284210
    if (j == 0)
Packit 284210
        return apr_pstrmemdup(p, s, i);
Packit 284210
Packit 284210
    x = apr_palloc(p, i + j + 1);
Packit 284210
    for (i = 0, j = 0; s[i] != '\0'; i++, j++)
Packit 284210
        if (s[i] == '<') {
Packit 284210
            memcpy(&x[j], "<", 4);
Packit 284210
            j += 3;
Packit 284210
        }
Packit 284210
        else if (s[i] == '>') {
Packit 284210
            memcpy(&x[j], ">", 4);
Packit 284210
            j += 3;
Packit 284210
        }
Packit 284210
        else if (s[i] == '&') {
Packit 284210
            memcpy(&x[j], "&", 5);
Packit 284210
            j += 4;
Packit 284210
        }
Packit 284210
        else if (s[i] == '"') {
Packit 284210
            memcpy(&x[j], """, 6);
Packit 284210
            j += 5;
Packit 284210
        }
Packit 284210
        else if (toasc && !apr_isascii(s[i])) {
Packit 284210
            char *esc = apr_psprintf(p, "&#%3.3d;", (unsigned char)s[i]);
Packit 284210
            memcpy(&x[j], esc, 6);
Packit 284210
            j += 5;
Packit 284210
        }
Packit 284210
        else
Packit 284210
            x[j] = s[i];
Packit 284210
Packit 284210
    x[j] = '\0';
Packit 284210
    return x;
Packit 284210
}
Packit 284210
Packit 284210
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit 284210
AP_DECLARE(char *) ap_escape_html(apr_pool_t *p, const char *s)
Packit 284210
{
Packit 284210
    return ap_escape_html2(p, s, 0);
Packit 284210
}
Packit 284210
#endif
Packit 284210
Packit 284210
AP_DECLARE(const char *) ap_psignature(const char *prefix, request_rec *r)
Packit 284210
{
Packit 284210
	return prefix;
Packit 284210
}
Packit 284210
Packit 284210
AP_DECLARE(const char *) ap_document_root(request_rec *r) /* Don't use this! */
Packit 284210
{
Packit 284210
	return "\\";
Packit 284210
}
Packit 284210
Packit 284210
AP_DECLARE(apr_port_t) ap_get_server_port(const request_rec *r)
Packit 284210
{
Packit 284210
	return 80;
Packit 284210
}
Packit 284210
Packit 284210
/////////////////////////////////////////////////////////////////////////////////////////////////////
Packit 284210
Packit 284210
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit 284210
AP_DECLARE(void) ap_log_error(const char *file, int line, int level, 
Packit 284210
                             apr_status_t status, const server_rec *s, 
Packit 284210
                             const char *fmt, ...)
Packit 284210
//			    __attribute__((format(printf,6,7)))
Packit 284210
#else
Packit 284210
AP_DECLARE(void) ap_log_error_(const char *file, int line, int module_index,
Packit 284210
                               int level, apr_status_t status,
Packit 284210
                               const server_rec *s, const char *fmt, ...)
Packit 284210
//                              __attribute__((format(printf,7,8)))
Packit 284210
#endif
Packit 284210
{
Packit 284210
    va_list args;
Packit 284210
    char errstr[MAX_STRING_LEN];
Packit 284210
Packit 284210
    va_start(args, fmt);
Packit 284210
Packit 284210
    apr_vsnprintf(errstr, MAX_STRING_LEN, fmt, args);
Packit 284210
Packit 284210
	va_end(args);
Packit 284210
Packit 284210
	if(modsecLogHook != NULL)
Packit 284210
		modsecLogHook(modsecLogObj, level, errstr);
Packit 284210
}
Packit 284210
Packit 284210
Packit 284210
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit 284210
AP_DECLARE(void) ap_log_cerror(const char *file, int line, int level,
Packit 284210
                             apr_status_t status, const conn_rec *r,
Packit 284210
                             const char *fmt, ...)
Packit 284210
//			    __attribute__((format(printf,6,7)))
Packit 284210
#else
Packit 284210
AP_DECLARE(void) ap_log_cerror_(const char *file, int line, int module_index,
Packit 284210
                                int level, apr_status_t status,
Packit 284210
                                const conn_rec *c, const char *fmt, ...)
Packit 284210
//                              __attribute__((format(printf,7,8)))
Packit 284210
#endif
Packit 284210
{
Packit 284210
    va_list args;
Packit 284210
    char errstr[MAX_STRING_LEN];
Packit 284210
Packit 284210
    va_start(args, fmt);
Packit 284210
Packit 284210
    apr_vsnprintf(errstr, MAX_STRING_LEN, fmt, args);
Packit 284210
Packit 284210
	va_end(args);
Packit 284210
Packit 284210
	if(modsecLogHook != NULL)
Packit 284210
		modsecLogHook(modsecLogObj, level, errstr);
Packit 284210
}
Packit 284210
Packit 284210
Packit 284210
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit 284210
AP_DECLARE(void) ap_log_rerror(const char *file, int line, int level,
Packit 284210
                             apr_status_t status, const request_rec *r,
Packit 284210
                             const char *fmt, ...)
Packit 284210
//			    __attribute__((format(printf,6,7)))
Packit 284210
#else
Packit 284210
AP_DECLARE(void) ap_log_rerror_(const char *file, int line, int module_index,
Packit 284210
                               int level, apr_status_t status,
Packit 284210
                               const request_rec *r, const char *fmt, ...)
Packit 284210
//                              __attribute__((format(printf,7,8)))
Packit 284210
#endif
Packit 284210
{
Packit 284210
    va_list args;
Packit 284210
    char errstr[MAX_STRING_LEN];
Packit 284210
Packit 284210
    va_start(args, fmt);
Packit 284210
Packit 284210
    apr_vsnprintf(errstr, MAX_STRING_LEN, fmt, args);
Packit 284210
Packit 284210
	va_end(args);
Packit 284210
Packit 284210
	if(modsecLogHook != NULL)
Packit 284210
		modsecLogHook(modsecLogObj, level, errstr);
Packit 284210
}
Packit 284210
Packit 284210
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit 284210
AP_DECLARE(void) ap_log_perror(const char *file, int line, int level, 
Packit 284210
                             apr_status_t status, apr_pool_t *p, 
Packit 284210
                             const char *fmt, ...)
Packit 284210
//			    __attribute__((format(printf,6,7)))
Packit 284210
#else
Packit 284210
AP_DECLARE(void) ap_log_perror_(const char *file, int line, int module_index,
Packit 284210
                                int level, apr_status_t status, apr_pool_t *p,
Packit 284210
                                const char *fmt, ...)
Packit 284210
#endif
Packit 284210
{
Packit 284210
    va_list args;
Packit 284210
    char errstr[MAX_STRING_LEN];
Packit 284210
Packit 284210
    va_start(args, fmt);
Packit 284210
Packit 284210
    apr_vsnprintf(errstr, MAX_STRING_LEN, fmt, args);
Packit 284210
Packit 284210
	va_end(args);
Packit 284210
Packit 284210
	if(modsecLogHook != NULL)
Packit 284210
		modsecLogHook(modsecLogObj, level, errstr);
Packit 284210
}
Packit 284210
Packit 284210
AP_DECLARE(module *) ap_find_linked_module(const char *name)
Packit 284210
{
Packit 284210
	// only used for ACTION_PROXY to find mod_proxy.c; see mod_security2.c, perform_interception()
Packit 284210
	//
Packit 284210
	return NULL;
Packit 284210
}
Packit 284210
Packit 284210
AP_DECLARE(const char *) ap_get_server_name(request_rec *r)
Packit 284210
{
Packit 284210
	return r->server->server_hostname;
Packit 284210
}
Packit 284210
Packit 284210
AP_DECLARE(void) ap_add_version_component(apr_pool_t *pconf, const char *component)
Packit 284210
{
Packit 284210
	// appends string to server description string
Packit 284210
	//
Packit 284210
}
Packit 284210
Packit 284210
AP_DECLARE(const char *) ap_get_status_line(int status)
Packit 284210
{
Packit 284210
    return status_lines[ap_index_of_response(status)];
Packit 284210
}
Packit 284210
Packit 284210
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit 284210
AP_DECLARE(worker_score *) ap_get_scoreboard_worker(int x, int y)
Packit 284210
{
Packit 284210
    if (((x < 0) || (server_limit < x)) ||
Packit 284210
        ((y < 0) || (thread_limit < y))) {
Packit 284210
        return(NULL); /* Out of range */
Packit 284210
    }
Packit 284210
    return &ap_scoreboard_image->servers[x][y];
Packit 284210
}
Packit 284210
#else
Packit 284210
AP_DECLARE(worker_score *) ap_get_scoreboard_worker_from_indexes(int x, int y)
Packit 284210
{
Packit 284210
    if (((x < 0) || (x >= server_limit)) ||
Packit 284210
        ((y < 0) || (y >= thread_limit))) {
Packit 284210
        return(NULL); /* Out of range */
Packit 284210
    }
Packit 284210
    return &ap_scoreboard_image->servers[x][y];
Packit 284210
}
Packit 284210
Packit 284210
AP_DECLARE(worker_score *) ap_get_scoreboard_worker(ap_sb_handle_t *sbh)
Packit 284210
{
Packit 284210
    //if (!sbh)
Packit 284210
    //    return NULL;
Packit 284210
Packit 284210
    //return ap_get_scoreboard_worker_from_indexes(sbh->child_num,
Packit 284210
    //                                             sbh->thread_num);
Packit 284210
    return ap_get_scoreboard_worker_from_indexes(0, 0);
Packit 284210
}
Packit 284210
#endif
Packit 284210
Packit 284210
AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result)
Packit 284210
{
Packit 284210
    switch(query_code){
Packit 284210
        //case AP_MPMQ_MAX_DAEMON_USED:
Packit 284210
        //    *result = MAXIMUM_WAIT_OBJECTS;
Packit 284210
        //    return APR_SUCCESS;
Packit 284210
        case AP_MPMQ_IS_THREADED:
Packit 284210
            *result = AP_MPMQ_STATIC;
Packit 284210
            return APR_SUCCESS;
Packit 284210
        case AP_MPMQ_IS_FORKED:
Packit 284210
            *result = AP_MPMQ_NOT_SUPPORTED;
Packit 284210
            return APR_SUCCESS;
Packit 284210
        case AP_MPMQ_HARD_LIMIT_DAEMONS:
Packit 284210
            *result = 1; //HARD_SERVER_LIMIT;
Packit 284210
            return APR_SUCCESS;
Packit 284210
        case AP_MPMQ_HARD_LIMIT_THREADS:
Packit 284210
            *result = thread_limit;
Packit 284210
            return APR_SUCCESS;
Packit 284210
        //case AP_MPMQ_MAX_THREADS:
Packit 284210
        //    *result = ap_threads_per_child;
Packit 284210
        //    return APR_SUCCESS;
Packit 284210
        case AP_MPMQ_MIN_SPARE_DAEMONS:
Packit 284210
            *result = 0;
Packit 284210
            return APR_SUCCESS;
Packit 284210
        case AP_MPMQ_MIN_SPARE_THREADS:
Packit 284210
            *result = 0;
Packit 284210
            return APR_SUCCESS;
Packit 284210
        case AP_MPMQ_MAX_SPARE_DAEMONS:
Packit 284210
            *result = 0;
Packit 284210
            return APR_SUCCESS;
Packit 284210
        case AP_MPMQ_MAX_SPARE_THREADS:
Packit 284210
            *result = 0;
Packit 284210
            return APR_SUCCESS;
Packit 284210
        //case AP_MPMQ_MAX_REQUESTS_DAEMON:
Packit 284210
        //    *result = ap_max_requests_per_child;
Packit 284210
        //    return APR_SUCCESS;
Packit 284210
        case AP_MPMQ_MAX_DAEMONS:
Packit 284210
            *result = 0;
Packit 284210
            return APR_SUCCESS;
Packit 284210
        //case AP_MPMQ_MPM_STATE:
Packit 284210
        //    *result = winnt_mpm_state;
Packit 284210
        //    return APR_SUCCESS;
Packit 284210
    }
Packit 284210
    return APR_ENOTIMPL;
Packit 284210
}
Packit 284210
Packit 284210
AP_DECLARE(const char *) ap_get_server_banner(void)
Packit 284210
{
Packit 284210
	return "ModSecurity Standalone";
Packit 284210
}
Packit 284210
Packit 284210
/* Code from Harald Hanche-Olsen <hanche@imf.unit.no> */
Packit 284210
static APR_INLINE void do_double_reverse (conn_rec *conn)
Packit 284210
{
Packit 284210
    apr_sockaddr_t *sa;
Packit 284210
    apr_status_t rv;
Packit 284210
Packit 284210
    if (conn->double_reverse) {
Packit 284210
        /* already done */
Packit 284210
        return;
Packit 284210
    }
Packit 284210
Packit 284210
    if (conn->remote_host == NULL || conn->remote_host[0] == '\0') {
Packit 284210
        /* single reverse failed, so don't bother */
Packit 284210
        conn->double_reverse = -1;
Packit 284210
        return;
Packit 284210
    }
Packit 284210
Packit 284210
    rv = apr_sockaddr_info_get(&sa, conn->remote_host, APR_UNSPEC, 0, 0, conn->pool);
Packit 284210
    if (rv == APR_SUCCESS) {
Packit 284210
        while (sa) {
Packit 284210
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit 284210
            if (apr_sockaddr_equal(sa, conn->remote_addr)) {
Packit 284210
#else
Packit 284210
	    if (apr_sockaddr_equal(sa, conn->client_addr)) {
Packit 284210
#endif
Packit 284210
                conn->double_reverse = 1;
Packit 284210
                return;
Packit 284210
            }
Packit 284210
Packit 284210
            sa = sa->next;
Packit 284210
        }
Packit 284210
    }
Packit 284210
Packit 284210
    conn->double_reverse = -1;
Packit 284210
}
Packit 284210
Packit 284210
#ifndef HOSTNAME_LOOKUP_OFF
Packit 284210
#define HOSTNAME_LOOKUP_OFF	0
Packit 284210
#define HOSTNAME_LOOKUP_ON	1
Packit 284210
#define HOSTNAME_LOOKUP_DOUBLE	2
Packit 284210
#define HOSTNAME_LOOKUP_UNSET	3
Packit 284210
#endif
Packit 284210
Packit 284210
AP_DECLARE(void) ap_str_tolower(char *str)
Packit 284210
{
Packit 284210
    while (*str) {
Packit 284210
        *str = apr_tolower(*str);
Packit 284210
        ++str;
Packit 284210
    }
Packit 284210
}
Packit 284210
Packit 284210
AP_DECLARE(const char *) ap_get_remote_host(conn_rec *conn, void *dir_config, int type, int *str_is_ip)
Packit 284210
{
Packit 284210
    int hostname_lookups = HOSTNAME_LOOKUP_OFF;
Packit 284210
    int ignored_str_is_ip;
Packit 284210
Packit 284210
    if (!str_is_ip) { /* caller doesn't want to know */
Packit 284210
        str_is_ip = &ignored_str_is_ip;
Packit 284210
    }
Packit 284210
    *str_is_ip = 0;
Packit 284210
Packit 284210
    /* If we haven't checked the host name, and we want to */
Packit 284210
    //if (dir_config) {
Packit 284210
    //    hostname_lookups =
Packit 284210
    //        ((core_dir_config *)ap_get_module_config(dir_config, &core_module))
Packit 284210
    //        ->hostname_lookups;
Packit 284210
Packit 284210
    //    if (hostname_lookups == HOSTNAME_LOOKUP_UNSET) {
Packit 284210
    //        hostname_lookups = HOSTNAME_LOOKUP_OFF;
Packit 284210
    //    }
Packit 284210
    //}
Packit 284210
Packit 284210
    if (type != REMOTE_NOLOOKUP
Packit 284210
        && conn->remote_host == NULL
Packit 284210
        && (type == REMOTE_DOUBLE_REV
Packit 284210
        || hostname_lookups != HOSTNAME_LOOKUP_OFF)) {
Packit 284210
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit 284210
        if (apr_getnameinfo(&conn->remote_host, conn->remote_addr, 0)
Packit 284210
            == APR_SUCCESS) {
Packit 284210
#else
Packit 284210
        if (apr_getnameinfo(&conn->remote_host, conn->client_addr, 0)
Packit 284210
            == APR_SUCCESS) {
Packit 284210
#endif
Packit 284210
            ap_str_tolower(conn->remote_host);
Packit 284210
Packit 284210
            if (hostname_lookups == HOSTNAME_LOOKUP_DOUBLE) {
Packit 284210
                do_double_reverse(conn);
Packit 284210
                if (conn->double_reverse != 1) {
Packit 284210
                    conn->remote_host = NULL;
Packit 284210
                }
Packit 284210
            }
Packit 284210
        }
Packit 284210
Packit 284210
        /* if failed, set it to the NULL string to indicate error */
Packit 284210
        if (conn->remote_host == NULL) {
Packit 284210
            conn->remote_host = "";
Packit 284210
        }
Packit 284210
    }
Packit 284210
Packit 284210
    if (type == REMOTE_DOUBLE_REV) {
Packit 284210
        do_double_reverse(conn);
Packit 284210
        if (conn->double_reverse == -1) {
Packit 284210
            return NULL;
Packit 284210
        }
Packit 284210
    }
Packit 284210
Packit 284210
    /*
Packit 284210
     * Return the desired information; either the remote DNS name, if found,
Packit 284210
     * or either NULL (if the hostname was requested) or the IP address
Packit 284210
     * (if any identifier was requested).
Packit 284210
     */
Packit 284210
    if (conn->remote_host != NULL && conn->remote_host[0] != '\0') {
Packit 284210
        return conn->remote_host;
Packit 284210
    }
Packit 284210
    else {
Packit 284210
        if (type == REMOTE_HOST || type == REMOTE_DOUBLE_REV) {
Packit 284210
            return NULL;
Packit 284210
        }
Packit 284210
        else {
Packit 284210
            *str_is_ip = 1;
Packit 284210
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit 284210
            return conn->remote_ip;
Packit 284210
#else
Packit 284210
	    return conn->client_ip;
Packit 284210
#endif
Packit 284210
        }
Packit 284210
    }
Packit 284210
}
Packit 284210
Packit 284210
AP_DECLARE(char *) ap_server_root_relative(apr_pool_t *p, const char *file)
Packit 284210
{
Packit 284210
    char *newpath = NULL;
Packit 284210
    apr_status_t rv;
Packit 284210
    rv = apr_filepath_merge(&newpath, ap_server_root, file,
Packit 284210
                            APR_FILEPATH_TRUENAME, p);
Packit 284210
    if (newpath && (rv == APR_SUCCESS || APR_STATUS_IS_EPATHWILD(rv)
Packit 284210
                                      || APR_STATUS_IS_ENOENT(rv)
Packit 284210
                                      || APR_STATUS_IS_ENOTDIR(rv))) {
Packit 284210
        return newpath;
Packit 284210
    }
Packit 284210
    else {
Packit 284210
        return NULL;
Packit 284210
    }
Packit 284210
}
Packit 284210
Packit 284210
AP_DECLARE(piped_log *) ap_open_piped_log(apr_pool_t *p, const char *program)
Packit 284210
{
Packit 284210
	return NULL;
Packit 284210
}
Packit 284210
Packit 284210
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER > 3
Packit 284210
AP_DECLARE(apr_file_t *) ap_piped_log_write_fd(piped_log *pl)
Packit 284210
{
Packit 284210
 return NULL;
Packit 284210
}
Packit 284210
#endif
Packit 284210
Packit 284210
AP_DECLARE(char **) ap_create_environment(apr_pool_t *p, apr_table_t *t)
Packit 284210
{
Packit 284210
    const apr_array_header_t *env_arr = apr_table_elts(t);
Packit 284210
    const apr_table_entry_t *elts = (const apr_table_entry_t *) env_arr->elts;
Packit 284210
    char **env = (char **) apr_palloc(p, (env_arr->nelts + 2) * sizeof(char *));
Packit 284210
    int i, j;
Packit 284210
    char *tz;
Packit 284210
    char *whack;
Packit 284210
Packit 284210
    j = 0;
Packit 284210
    if (!apr_table_get(t, "TZ")) {
Packit 284210
        tz = getenv("TZ");
Packit 284210
        if (tz != NULL) {
Packit 284210
            env[j++] = apr_pstrcat(p, "TZ=", tz, NULL);
Packit 284210
        }
Packit 284210
    }
Packit 284210
    for (i = 0; i < env_arr->nelts; ++i) {
Packit 284210
        if (!elts[i].key) {
Packit 284210
            continue;
Packit 284210
        }
Packit 284210
        env[j] = apr_pstrcat(p, elts[i].key, "=", elts[i].val, NULL);
Packit 284210
        whack = env[j];
Packit 284210
        if (apr_isdigit(*whack)) {
Packit 284210
            *whack++ = '_';
Packit 284210
        }
Packit 284210
        while (*whack != '=') {
Packit 284210
            if (!apr_isalnum(*whack) && *whack != '_') {
Packit 284210
                *whack = '_';
Packit 284210
            }
Packit 284210
            ++whack;
Packit 284210
        }
Packit 284210
        ++j;
Packit 284210
    }
Packit 284210
Packit 284210
    env[j] = NULL;
Packit 284210
    return env;
Packit 284210
}
Packit 284210
Packit 284210
/* This "cute" little function comes about because the path info on
Packit 284210
 * filenames and URLs aren't always the same. So we take the two,
Packit 284210
 * and find as much of the two that match as possible.
Packit 284210
 */
Packit 284210
Packit 284210
AP_DECLARE(int) ap_find_path_info(const char *uri, const char *path_info)
Packit 284210
{
Packit 284210
    int lu = strlen(uri);
Packit 284210
    int lp = strlen(path_info);
Packit 284210
Packit 284210
    while (lu-- && lp-- && uri[lu] == path_info[lp]) {
Packit 284210
        if (path_info[lp] == '/') {
Packit 284210
            while (lu && uri[lu-1] == '/') lu--;
Packit 284210
        }
Packit 284210
    }
Packit 284210
Packit 284210
    if (lu == -1) {
Packit 284210
        lu = 0;
Packit 284210
    }
Packit 284210
Packit 284210
    while (uri[lu] != '\0' && uri[lu] != '/') {
Packit 284210
        lu++;
Packit 284210
    }
Packit 284210
    return lu;
Packit 284210
}
Packit 284210
Packit 284210
/* Obtain the Request-URI from the original request-line, returning
Packit 284210
 * a new string from the request pool containing the URI or "".
Packit 284210
 */
Packit 284210
static char *original_uri(request_rec *r)
Packit 284210
{
Packit 284210
    char *first, *last;
Packit 284210
Packit 284210
    if (r->the_request == NULL) {
Packit 284210
        return (char *) apr_pcalloc(r->pool, 1);
Packit 284210
    }
Packit 284210
Packit 284210
    first = r->the_request;     /* use the request-line */
Packit 284210
Packit 284210
    while (*first && !apr_isspace(*first)) {
Packit 284210
        ++first;                /* skip over the method */
Packit 284210
    }
Packit 284210
    while (apr_isspace(*first)) {
Packit 284210
        ++first;                /*   and the space(s)   */
Packit 284210
    }
Packit 284210
Packit 284210
    last = first;
Packit 284210
    while (*last && !apr_isspace(*last)) {
Packit 284210
        ++last;                 /* end at next whitespace */
Packit 284210
    }
Packit 284210
Packit 284210
    return apr_pstrmemdup(r->pool, first, last - first);
Packit 284210
}
Packit 284210
Packit 284210
AP_DECLARE(void) ap_add_cgi_vars(request_rec *r)
Packit 284210
{
Packit 284210
    apr_table_t *e = r->subprocess_env;
Packit 284210
Packit 284210
    apr_table_setn(e, "GATEWAY_INTERFACE", "CGI/1.1");
Packit 284210
    apr_table_setn(e, "SERVER_PROTOCOL", r->protocol);
Packit 284210
    apr_table_setn(e, "REQUEST_METHOD", r->method);
Packit 284210
    apr_table_setn(e, "QUERY_STRING", r->args ? r->args : "");
Packit 284210
    apr_table_setn(e, "REQUEST_URI", original_uri(r));
Packit 284210
Packit 284210
    /* Note that the code below special-cases scripts run from includes,
Packit 284210
     * because it "knows" that the sub_request has been hacked to have the
Packit 284210
     * args and path_info of the original request, and not any that may have
Packit 284210
     * come with the script URI in the include command.  Ugh.
Packit 284210
     */
Packit 284210
Packit 284210
    if (!strcmp(r->protocol, "INCLUDED")) {
Packit 284210
        apr_table_setn(e, "SCRIPT_NAME", r->uri);
Packit 284210
        if (r->path_info && *r->path_info) {
Packit 284210
            apr_table_setn(e, "PATH_INFO", r->path_info);
Packit 284210
        }
Packit 284210
    }
Packit 284210
    else if (!r->path_info || !*r->path_info) {
Packit 284210
        apr_table_setn(e, "SCRIPT_NAME", r->uri);
Packit 284210
    }
Packit 284210
    else {
Packit 284210
        int path_info_start = ap_find_path_info(r->uri, r->path_info);
Packit 284210
Packit 284210
        apr_table_setn(e, "SCRIPT_NAME",
Packit 284210
                      apr_pstrndup(r->pool, r->uri, path_info_start));
Packit 284210
Packit 284210
        apr_table_setn(e, "PATH_INFO", r->path_info);
Packit 284210
    }
Packit 284210
Packit 284210
    //if (r->path_info && r->path_info[0]) {
Packit 284210
        /*
Packit 284210
         * To get PATH_TRANSLATED, treat PATH_INFO as a URI path.
Packit 284210
         * Need to re-escape it for this, since the entire URI was
Packit 284210
         * un-escaped before we determined where the PATH_INFO began.
Packit 284210
         */
Packit 284210
    //    request_rec *pa_req;
Packit 284210
Packit 284210
    //    pa_req = ap_sub_req_lookup_uri(ap_escape_uri(r->pool, r->path_info), r,
Packit 284210
    //                                   NULL);
Packit 284210
Packit 284210
    //    if (pa_req->filename) {
Packit 284210
    //        char *pt = apr_pstrcat(r->pool, pa_req->filename, pa_req->path_info,
Packit 284210
    //                              NULL);
Packit 284210
//#ifdef WIN32
Packit 284210
    //        /* We need to make this a real Windows path name */
Packit 284210
    //        apr_filepath_merge(&pt, "", pt, APR_FILEPATH_NATIVE, r->pool);
Packit 284210
//#endif
Packit 284210
    //        apr_table_setn(e, "PATH_TRANSLATED", pt);
Packit 284210
    //    }
Packit 284210
    //    ap_destroy_sub_req(pa_req);
Packit 284210
    //}
Packit 284210
}
Packit 284210
Packit 284210
AP_DECLARE(void) ap_add_common_vars(request_rec *r)
Packit 284210
{
Packit 284210
    apr_table_t *e;
Packit 284210
    server_rec *s = r->server;
Packit 284210
    conn_rec *c = r->connection;
Packit 284210
    //const char *rem_logname;
Packit 284210
    char *env_path;
Packit 284210
#if defined(WIN32) || defined(OS2) || defined(BEOS)
Packit 284210
    char *env_temp;
Packit 284210
#endif
Packit 284210
    const char *host;
Packit 284210
    const apr_array_header_t *hdrs_arr = apr_table_elts(r->headers_in);
Packit 284210
    const apr_table_entry_t *hdrs = (const apr_table_entry_t *) hdrs_arr->elts;
Packit 284210
    int i;
Packit 284210
    apr_port_t rport;
Packit 284210
Packit 284210
    /* use a temporary apr_table_t which we'll overlap onto
Packit 284210
     * r->subprocess_env later
Packit 284210
     * (exception: if r->subprocess_env is empty at the start,
Packit 284210
     * write directly into it)
Packit 284210
     */
Packit 284210
    if (apr_is_empty_table(r->subprocess_env)) {
Packit 284210
        e = r->subprocess_env;
Packit 284210
    }
Packit 284210
    else {
Packit 284210
        e = apr_table_make(r->pool, 25 + hdrs_arr->nelts);
Packit 284210
    }
Packit 284210
Packit 284210
    /* First, add environment vars from headers... this is as per
Packit 284210
     * CGI specs, though other sorts of scripting interfaces see
Packit 284210
     * the same vars...
Packit 284210
     */
Packit 284210
Packit 284210
    for (i = 0; i < hdrs_arr->nelts; ++i) {
Packit 284210
        if (!hdrs[i].key) {
Packit 284210
            continue;
Packit 284210
        }
Packit 284210
Packit 284210
        /* A few headers are special cased --- Authorization to prevent
Packit 284210
         * rogue scripts from capturing passwords; content-type and -length
Packit 284210
         * for no particular reason.
Packit 284210
         */
Packit 284210
Packit 284210
        if (!strcasecmp(hdrs[i].key, "Content-type")) {
Packit 284210
            apr_table_addn(e, "CONTENT_TYPE", hdrs[i].val);
Packit 284210
        }
Packit 284210
        else if (!strcasecmp(hdrs[i].key, "Content-length")) {
Packit 284210
            apr_table_addn(e, "CONTENT_LENGTH", hdrs[i].val);
Packit 284210
        }
Packit 284210
        /*
Packit 284210
         * You really don't want to disable this check, since it leaves you
Packit 284210
         * wide open to CGIs stealing passwords and people viewing them
Packit 284210
         * in the environment with "ps -e".  But, if you must...
Packit 284210
         */
Packit 284210
#ifndef SECURITY_HOLE_PASS_AUTHORIZATION
Packit 284210
        else if (!strcasecmp(hdrs[i].key, "Authorization")
Packit 284210
                 || !strcasecmp(hdrs[i].key, "Proxy-Authorization")) {
Packit 284210
            continue;
Packit 284210
        }
Packit 284210
#endif
Packit 284210
        else {
Packit 284210
            apr_table_addn(e, http2env(r->pool, hdrs[i].key), hdrs[i].val);
Packit 284210
        }
Packit 284210
    }
Packit 284210
Packit 284210
    if (!(env_path = getenv("PATH"))) {
Packit 284210
        env_path = DEFAULT_PATH;
Packit 284210
    }
Packit 284210
    apr_table_addn(e, "PATH", apr_pstrdup(r->pool, env_path));
Packit 284210
Packit 284210
#ifdef WIN32
Packit 284210
    if ((env_temp = getenv("SystemRoot")) != NULL) {
Packit 284210
        apr_table_addn(e, "SystemRoot", env_temp);
Packit 284210
    }
Packit 284210
    if ((env_temp = getenv("COMSPEC")) != NULL) {
Packit 284210
        apr_table_addn(e, "COMSPEC", env_temp);
Packit 284210
    }
Packit 284210
    if ((env_temp = getenv("PATHEXT")) != NULL) {
Packit 284210
        apr_table_addn(e, "PATHEXT", env_temp);
Packit 284210
    }
Packit 284210
    if ((env_temp = getenv("WINDIR")) != NULL) {
Packit 284210
        apr_table_addn(e, "WINDIR", env_temp);
Packit 284210
    }
Packit 284210
#endif
Packit 284210
Packit 284210
#ifdef OS2
Packit 284210
    if ((env_temp = getenv("COMSPEC")) != NULL) {
Packit 284210
        apr_table_addn(e, "COMSPEC", env_temp);
Packit 284210
    }
Packit 284210
    if ((env_temp = getenv("ETC")) != NULL) {
Packit 284210
        apr_table_addn(e, "ETC", env_temp);
Packit 284210
    }
Packit 284210
    if ((env_temp = getenv("DPATH")) != NULL) {
Packit 284210
        apr_table_addn(e, "DPATH", env_temp);
Packit 284210
    }
Packit 284210
    if ((env_temp = getenv("PERLLIB_PREFIX")) != NULL) {
Packit 284210
        apr_table_addn(e, "PERLLIB_PREFIX", env_temp);
Packit 284210
    }
Packit 284210
#endif
Packit 284210
Packit 284210
#ifdef BEOS
Packit 284210
    if ((env_temp = getenv("LIBRARY_PATH")) != NULL) {
Packit 284210
        apr_table_addn(e, "LIBRARY_PATH", env_temp);
Packit 284210
    }
Packit 284210
#endif
Packit 284210
Packit 284210
    apr_table_addn(e, "SERVER_SIGNATURE", ap_psignature("", r));
Packit 284210
    apr_table_addn(e, "SERVER_SOFTWARE", ap_get_server_banner());
Packit 284210
    apr_table_addn(e, "SERVER_NAME",
Packit 284210
                   ap_escape_html(r->pool, ap_get_server_name(r)));
Packit 284210
    apr_table_addn(e, "SERVER_ADDR", r->connection->local_ip);  /* Apache */
Packit 284210
    apr_table_addn(e, "SERVER_PORT",
Packit 284210
                  apr_psprintf(r->pool, "%u", ap_get_server_port(r)));
Packit 284210
    host = ap_get_remote_host(c, r->per_dir_config, REMOTE_HOST, NULL);
Packit 284210
    if (host) {
Packit 284210
        apr_table_addn(e, "REMOTE_HOST", host);
Packit 284210
    }
Packit 284210
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit 284210
    apr_table_addn(e, "REMOTE_ADDR", c->remote_ip);
Packit 284210
#else
Packit 284210
    apr_table_addn(e, "REMOTE_ADDR", c->client_ip);
Packit 284210
#endif
Packit 284210
    apr_table_addn(e, "DOCUMENT_ROOT", ap_document_root(r));    /* Apache */
Packit 284210
    apr_table_addn(e, "SERVER_ADMIN", s->server_admin); /* Apache */
Packit 284210
    apr_table_addn(e, "SCRIPT_FILENAME", r->filename);  /* Apache */
Packit 284210
Packit 284210
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit 284210
    rport = c->remote_addr->port;
Packit 284210
#else
Packit 284210
    rport = c->client_addr->port;
Packit 284210
#endif
Packit 284210
    apr_table_addn(e, "REMOTE_PORT", apr_itoa(r->pool, rport));
Packit 284210
Packit 284210
    if (r->user) {
Packit 284210
        apr_table_addn(e, "REMOTE_USER", r->user);
Packit 284210
    }
Packit 284210
    else if (r->prev) {
Packit 284210
        request_rec *back = r->prev;
Packit 284210
Packit 284210
        while (back) {
Packit 284210
            if (back->user) {
Packit 284210
                apr_table_addn(e, "REDIRECT_REMOTE_USER", back->user);
Packit 284210
                break;
Packit 284210
            }
Packit 284210
            back = back->prev;
Packit 284210
        }
Packit 284210
    }
Packit 284210
    if (r->ap_auth_type) {
Packit 284210
        apr_table_addn(e, "AUTH_TYPE", r->ap_auth_type);
Packit 284210
    }
Packit 284210
    //rem_logname = ap_get_remote_logname(r);
Packit 284210
    //if (rem_logname) {
Packit 284210
    //    apr_table_addn(e, "REMOTE_IDENT", apr_pstrdup(r->pool, rem_logname));
Packit 284210
    //}
Packit 284210
Packit 284210
    /* Apache custom error responses. If we have redirected set two new vars */
Packit 284210
Packit 284210
    if (r->prev) {
Packit 284210
        if (r->prev->args) {
Packit 284210
            apr_table_addn(e, "REDIRECT_QUERY_STRING", r->prev->args);
Packit 284210
        }
Packit 284210
        if (r->prev->uri) {
Packit 284210
            apr_table_addn(e, "REDIRECT_URL", r->prev->uri);
Packit 284210
        }
Packit 284210
    }
Packit 284210
Packit 284210
    if (e != r->subprocess_env) {
Packit 284210
      apr_table_overlap(r->subprocess_env, e, APR_OVERLAP_TABLES_SET);
Packit 284210
    }
Packit 284210
}
Packit 284210
Packit 284210
#ifndef WIN32
Packit 284210
Packit 284210
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit 284210
unixd_config_rec unixd_config;
Packit 284210
#else
Packit 284210
unixd_config_rec ap_unixd_config;
Packit 284210
#endif
Packit 284210
const char *ap_server_argv0 = "nginx";
Packit 284210
Packit 284210
#ifdef HAVE_GETPWNAM
Packit 284210
AP_DECLARE(uid_t) ap_uname2id(const char *name)
Packit 284210
{
Packit 284210
    struct passwd *ent;
Packit 284210
Packit 284210
    if (name[0] == '#')
Packit 284210
        return (atoi(&name[1]));
Packit 284210
Packit 284210
    if (!(ent = getpwnam(name))) {
Packit 284210
        ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
Packit 284210
                     "%s: bad user name %s", ap_server_argv0, name);
Packit 284210
        exit(1);
Packit 284210
    }
Packit 284210
Packit 284210
    return (ent->pw_uid);
Packit 284210
}
Packit 284210
#endif
Packit 284210
Packit 284210
#ifdef HAVE_GETGRNAM
Packit 284210
AP_DECLARE(gid_t) ap_gname2id(const char *name)
Packit 284210
{
Packit 284210
    struct group *ent;
Packit 284210
Packit 284210
    if (name[0] == '#')
Packit 284210
        return (atoi(&name[1]));
Packit 284210
Packit 284210
    if (!(ent = getgrnam(name))) {
Packit 284210
        ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
Packit 284210
                     "%s: bad group name %s", ap_server_argv0, name);
Packit 284210
        exit(1);
Packit 284210
    }
Packit 284210
Packit 284210
    return (ent->gr_gid);
Packit 284210
}
Packit 284210
#endif
Packit 284210
Packit 284210
AP_DECLARE(void) unixd_pre_config(apr_pool_t *ptemp)
Packit 284210
{
Packit 284210
    apr_finfo_t wrapper;
Packit 284210
Packit 284210
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit 284210
    unixd_config.user_name = DEFAULT_USER;
Packit 284210
    unixd_config.user_id = ap_uname2id(DEFAULT_USER);
Packit 284210
    unixd_config.group_id = ap_gname2id(DEFAULT_GROUP);
Packit 284210
    unixd_config.suexec_enabled = 0;
Packit 284210
#else
Packit 284210
    ap_unixd_config.user_name = DEFAULT_USER;
Packit 284210
    ap_unixd_config.user_id = ap_uname2id(DEFAULT_USER);
Packit 284210
    ap_unixd_config.group_id = ap_gname2id(DEFAULT_GROUP);
Packit 284210
    ap_unixd_config.suexec_enabled = 0;
Packit 284210
#endif
Packit 284210
Packit 284210
/*    if ((apr_stat(&wrapper, SUEXEC_BIN,
Packit 284210
                  APR_FINFO_NORM, ptemp)) != APR_SUCCESS) {
Packit 284210
        return;
Packit 284210
    }
Packit 284210
Packit 284210
    if ((wrapper.protection & APR_USETID) && wrapper.user == 0) {
Packit 284210
        unixd_config.suexec_enabled = 1;
Packit 284210
    }*/
Packit 284210
}
Packit 284210
Packit 284210
/* XXX move to APR and externalize (but implement differently :) ) */
Packit 284210
static apr_lockmech_e proc_mutex_mech(apr_proc_mutex_t *pmutex)
Packit 284210
{
Packit 284210
    const char *mechname = apr_proc_mutex_name(pmutex);
Packit 284210
Packit 284210
    if (!strcmp(mechname, "sysvsem")) {
Packit 284210
        return APR_LOCK_SYSVSEM;
Packit 284210
    }
Packit 284210
    else if (!strcmp(mechname, "flock")) {
Packit 284210
        return APR_LOCK_FLOCK;
Packit 284210
    }
Packit 284210
    return APR_LOCK_DEFAULT;
Packit 284210
}
Packit 284210
Packit 284210
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit 284210
AP_DECLARE(apr_status_t) unixd_set_proc_mutex_perms(apr_proc_mutex_t *pmutex)
Packit 284210
{
Packit 284210
////////////////
Packit 284210
    if (unixd_config.user_name == NULL)
Packit 284210
    {
Packit 284210
        unixd_pre_config(NULL);
Packit 284210
    }
Packit 284210
////////////////
Packit 284210
    if (!geteuid()) {
Packit 284210
        apr_lockmech_e mech = proc_mutex_mech(pmutex);
Packit 284210
Packit 284210
        switch(mech) {
Packit 284210
#if APR_HAS_SYSVSEM_SERIALIZE
Packit 284210
        case APR_LOCK_SYSVSEM:
Packit 284210
        {
Packit 284210
            apr_os_proc_mutex_t ospmutex;
Packit 284210
#if !APR_HAVE_UNION_SEMUN
Packit 284210
            union semun {
Packit 284210
                long val;
Packit 284210
                struct semid_ds *buf;
Packit 284210
                unsigned short *array;
Packit 284210
            };
Packit 284210
#endif
Packit 284210
            union semun ick;
Packit 284210
            struct semid_ds buf;
Packit 284210
            memset(&buf,0,sizeof(buf));
Packit 284210
Packit 284210
            apr_os_proc_mutex_get(&ospmutex, pmutex);
Packit 284210
            buf.sem_perm.uid = unixd_config.user_id;
Packit 284210
            buf.sem_perm.gid = unixd_config.group_id;
Packit 284210
            buf.sem_perm.mode = 0600;
Packit 284210
            ick.buf = &buf;
Packit 284210
            if (semctl(ospmutex.crossproc, 0, IPC_SET, ick) < 0) {
Packit 284210
                return errno;
Packit 284210
            }
Packit 284210
        }
Packit 284210
        break;
Packit 284210
#endif
Packit 284210
#if APR_HAS_FLOCK_SERIALIZE
Packit 284210
        case APR_LOCK_FLOCK:
Packit 284210
        {
Packit 284210
            const char *lockfile = apr_proc_mutex_lockfile(pmutex);
Packit 284210
Packit 284210
            if (lockfile) {
Packit 284210
                if (chown(lockfile, unixd_config.user_id,
Packit 284210
                          -1 /* no gid change */) < 0) {
Packit 284210
                    return errno;
Packit 284210
                }
Packit 284210
            }
Packit 284210
        }
Packit 284210
        break;
Packit 284210
#endif
Packit 284210
        default:
Packit 284210
            /* do nothing */
Packit 284210
            break;
Packit 284210
        }
Packit 284210
    }
Packit 284210
    return APR_SUCCESS;
Packit 284210
}
Packit 284210
Packit 284210
AP_DECLARE(apr_status_t) unixd_set_global_mutex_perms(apr_global_mutex_t *gmutex)
Packit 284210
{
Packit 284210
#if !APR_PROC_MUTEX_IS_GLOBAL
Packit 284210
    apr_os_global_mutex_t osgmutex;
Packit 284210
    apr_os_global_mutex_get(&osgmutex, gmutex);
Packit 284210
    return unixd_set_proc_mutex_perms(osgmutex.proc_mutex);
Packit 284210
#else  /* APR_PROC_MUTEX_IS_GLOBAL */
Packit 284210
    /* In this case, apr_proc_mutex_t and apr_global_mutex_t are the same. */
Packit 284210
    return unixd_set_proc_mutex_perms(gmutex);
Packit 284210
#endif /* APR_PROC_MUTEX_IS_GLOBAL */
Packit 284210
}
Packit 284210
#else
Packit 284210
AP_DECLARE(apr_status_t) ap_unixd_set_proc_mutex_perms(apr_proc_mutex_t *pmutex)
Packit 284210
{
Packit 284210
    if (ap_unixd_config.user_name == NULL)
Packit 284210
    {
Packit 284210
        unixd_pre_config(NULL);
Packit 284210
    }
Packit 284210
Packit 284210
    if (!geteuid()) {
Packit 284210
        apr_lockmech_e mech = proc_mutex_mech(pmutex);
Packit 284210
Packit 284210
        switch(mech) {
Packit 284210
#if APR_HAS_SYSVSEM_SERIALIZE
Packit 284210
        case APR_LOCK_SYSVSEM:
Packit 284210
        {
Packit 284210
            apr_os_proc_mutex_t ospmutex;
Packit 284210
#if !APR_HAVE_UNION_SEMUN
Packit 284210
            union semun {
Packit 284210
                long val;
Packit 284210
                struct semid_ds *buf;
Packit 284210
                unsigned short *array;
Packit 284210
            };
Packit 284210
#endif
Packit 284210
            union semun ick;
Packit 284210
            struct semid_ds buf;
Packit 284210
Packit 284210
            apr_os_proc_mutex_get(&ospmutex, pmutex);
Packit 284210
            buf.sem_perm.uid = ap_unixd_config.user_id;
Packit 284210
            buf.sem_perm.gid = ap_unixd_config.group_id;
Packit 284210
            buf.sem_perm.mode = 0600;
Packit 284210
            ick.buf = &buf;
Packit 284210
            if (semctl(ospmutex.crossproc, 0, IPC_SET, ick) < 0) {
Packit 284210
                return errno;
Packit 284210
            }
Packit 284210
        }
Packit 284210
        break;
Packit 284210
#endif
Packit 284210
#if APR_HAS_FLOCK_SERIALIZE
Packit 284210
        case APR_LOCK_FLOCK:
Packit 284210
        {
Packit 284210
            const char *lockfile = apr_proc_mutex_lockfile(pmutex);
Packit 284210
Packit 284210
            if (lockfile) {
Packit 284210
                if (chown(lockfile, ap_unixd_config.user_id,
Packit 284210
                          -1 /* no gid change */) < 0) {
Packit 284210
                    return errno;
Packit 284210
                }
Packit 284210
            }
Packit 284210
        }
Packit 284210
        break;
Packit 284210
#endif
Packit 284210
        default:
Packit 284210
            /* do nothing */
Packit 284210
            break;
Packit 284210
        }
Packit 284210
    }
Packit 284210
    return APR_SUCCESS;
Packit 284210
}
Packit 284210
Packit 284210
AP_DECLARE(apr_status_t) ap_unixd_set_global_mutex_perms(apr_global_mutex_t *gmutex)
Packit 284210
{
Packit 284210
#if !APR_PROC_MUTEX_IS_GLOBAL
Packit 284210
    apr_os_global_mutex_t osgmutex;
Packit 284210
    apr_os_global_mutex_get(&osgmutex, gmutex);
Packit 284210
    return ap_unixd_set_proc_mutex_perms(osgmutex.proc_mutex);
Packit 284210
#else  /* APR_PROC_MUTEX_IS_GLOBAL */
Packit 284210
    /* In this case, apr_proc_mutex_t and apr_global_mutex_t are the same. */
Packit 284210
    return ap_unixd_set_proc_mutex_perms(gmutex);
Packit 284210
#endif /* APR_PROC_MUTEX_IS_GLOBAL */
Packit 284210
}
Packit 284210
#endif
Packit 284210
#endif