jk_util.c

来自「以便Apache与其他服务进行整合 Mod_JK安装」· C语言 代码 · 共 1,959 行 · 第 1/4 页

C
1,959
字号
/* *  Licensed to the Apache Software Foundation (ASF) under one or more *  contributor license agreements.  See the NOTICE file distributed with *  this work for additional information regarding copyright ownership. *  The ASF licenses this file to You under the Apache License, Version 2.0 *  (the "License"); you may not use this file except in compliance with *  the License.  You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * *  Unless required by applicable law or agreed to in writing, software *  distributed under the License is distributed on an "AS IS" BASIS, *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *  See the License for the specific language governing permissions and *  limitations under the License. *//*************************************************************************** * Description: Utility functions (mainly configuration)                   * * Author:      Gal Shachor <shachor@il.ibm.com>                           * * Author:      Henri Gomez <hgomez@apache.org>                            * * Author:      Rainer Jung <rjung@apache.org>                             * * Version:     $Revision: 559693 $                                          * ***************************************************************************/#include "jk_util.h"#include "jk_ajp12_worker.h"#include "jk_ajp13_worker.h"#include "jk_ajp14_worker.h"#include "jk_lb_worker.h"#include "jk_mt.h"#define SYSPROPS_OF_WORKER          ("sysprops")#define STDERR_OF_WORKER            ("stderr")#define STDOUT_OF_WORKER            ("stdout")#define SECRET_OF_WORKER            ("secret")#define MX_OF_WORKER                ("mx")#define MS_OF_WORKER                ("ms")#define CP_OF_WORKER                ("class_path")#define BRIDGE_OF_WORKER            ("bridge")#define JVM_OF_WORKER               ("jvm_lib")#define LIBPATH_OF_WORKER           ("ld_path")#define CMD_LINE_OF_WORKER          ("cmd_line")#define NATIVE_LIB_OF_WORKER        ("native_lib")#define HOST_OF_WORKER              ("host")#define PORT_OF_WORKER              ("port")#define TYPE_OF_WORKER              ("type")#define CACHE_OF_WORKER_DEPRECATED  ("cachesize")#define CACHE_OF_WORKER             ("connection_pool_size")#define CACHE_OF_WORKER_MIN         ("connection_pool_minsize")#define CACHE_TIMEOUT_DEPRECATED    ("cache_timeout")#define CACHE_TIMEOUT_OF_WORKER     ("connection_pool_timeout")#define RECOVERY_OPTS_OF_WORKER     ("recovery_options")#define CONNECT_TIMEOUT_OF_WORKER   ("connect_timeout")#define PREPOST_TIMEOUT_OF_WORKER   ("prepost_timeout")#define REPLY_TIMEOUT_OF_WORKER     ("reply_timeout")#define SOCKET_TIMEOUT_OF_WORKER    ("socket_timeout")#define SOCKET_BUFFER_OF_WORKER     ("socket_buffer")#define SOCKET_KEEPALIVE_OF_WORKER  ("socket_keepalive")#define RECYCLE_TIMEOUT_DEPRECATED  ("recycle_timeout")#define LOAD_FACTOR_OF_WORKER       ("lbfactor")#define DISTANCE_OF_WORKER          ("distance")#define BALANCED_WORKERS_DEPRECATED ("balanced_workers")#define BALANCE_WORKERS             ("balance_workers")#define STICKY_SESSION              ("sticky_session")#define STICKY_SESSION_FORCE        ("sticky_session_force")#define LOCAL_WORKER_DEPRECATED     ("local_worker")#define LOCAL_WORKER_ONLY_DEPRECATED ("local_worker_only")#define JVM_ROUTE_OF_WORKER_DEPRECATED ("jvm_route")#define ROUTE_OF_WORKER             ("route")#define DOMAIN_OF_WORKER            ("domain")#define REDIRECT_OF_WORKER          ("redirect")#define MOUNT_OF_WORKER             ("mount")#define METHOD_OF_WORKER            ("method")#define LOCK_OF_WORKER              ("lock")#define IS_WORKER_DISABLED_DEPRECATED ("disabled")#define IS_WORKER_STOPPED_DEPRECATED  ("stopped")#define ACTIVATION_OF_WORKER        ("activation")#define WORKER_RECOVER_TIME         ("recover_time")#define MAX_REPLY_TIMEOUTS_OF_WORKER ("max_reply_timeouts")#define WORKER_MAX_PACKET_SIZE      ("max_packet_size")#define STYLE_SHEET_OF_WORKER       ("css")#define NAMESPACE_OF_WORKER         ("ns")#define XML_NAMESPACE_OF_WORKER     ("xmlns")#define XML_DOCTYPE_OF_WORKER       ("doctype")#define PROP_PREFIX_OF_WORKER       ("prefix")#define READ_ONLY_OF_WORKER         ("read_only")#define USER_OF_WORKER              ("user")#define USER_CASE_OF_WORKER         ("user_case_insensitive")#define GOOD_RATING_OF_WORKER       ("good")#define BAD_RATING_OF_WORKER        ("bad")#define DEFAULT_WORKER_TYPE         JK_AJP13_WORKER_NAME#define SECRET_KEY_OF_WORKER        ("secretkey")#define RETRIES_OF_WORKER           ("retries")#define STATUS_FAIL_OF_WORKER       ("fail_on_status")#define DEFAULT_WORKER              JK_AJP13_WORKER_NAME#define WORKER_LIST_PROPERTY_NAME     ("worker.list")#define LIST_PROPERTY_NAME            ("list")#define WORKER_MAINTAIN_PROPERTY_NAME ("worker.maintain")#define MAINTAIN_PROPERTY_NAME        ("maintain")#define DEFAULT_MAINTAIN_TIME       (60)#define DEFAULT_LB_FACTOR           (1)#define DEFAULT_DISTANCE            (0)#define TOMCAT32_BRIDGE_NAME        ("tomcat32")#define TOMCAT33_BRIDGE_NAME        ("tomcat33")#define TOMCAT40_BRIDGE_NAME        ("tomcat40")#define TOMCAT41_BRIDGE_NAME        ("tomcat41")#define TOMCAT50_BRIDGE_NAME        ("tomcat5")#define HUGE_BUFFER_SIZE (8*1024)#define MAKE_WORKER_PARAM(P)     \        strcpy(buf, "worker.");  \        strcat(buf, wname);      \        strcat(buf, ".");        \        strcat(buf, P)/* * define the log format, we're using by default the one from error.log * * [Mon Mar 26 19:44:48 2001] [jk_uri_worker_map.c (155)]: Into jk_uri_worker_map_t::uri_worker_map_alloc * log format used by apache in error.log */#define JK_TIME_CONV_MILLI    "%Q"#define JK_TIME_CONV_MICRO    "%q"#define JK_TIME_PATTERN_MILLI "000"#define JK_TIME_PATTERN_MICRO "000000"#define JK_TIME_FORMAT_NONE   "[%a %b %d %H:%M:%S %Y] "#define JK_TIME_FORMAT_MILLI  "[%a %b %d %H:%M:%S." JK_TIME_CONV_MILLI " %Y] "#define JK_TIME_FORMAT_MICRO  "[%a %b %d %H:%M:%S." JK_TIME_CONV_MICRO " %Y] "#define JK_TIME_SUBSEC_NONE   (0)#define JK_TIME_SUBSEC_MILLI  (1)#define JK_TIME_SUBSEC_MICRO  (2)#define JK_TIME_MAX_SIZE      (64)/* Visual C++ Toolkit 2003 support */#if defined (_MSC_VER) && (_MSC_VER == 1310)    extern long _ftol(double); /* defined by VC6 C libs */    extern long _ftol2(double dblSource) { return _ftol(dblSource); }#endifstatic const char *list_properties[] = {    BALANCE_WORKERS,    MOUNT_OF_WORKER,    USER_OF_WORKER,    GOOD_RATING_OF_WORKER,    BAD_RATING_OF_WORKER,    STATUS_FAIL_OF_WORKER,    "list",    NULL};static const char *unique_properties[] = {    SECRET_OF_WORKER,    HOST_OF_WORKER,    PORT_OF_WORKER,    TYPE_OF_WORKER,    CACHE_OF_WORKER_DEPRECATED,    CACHE_OF_WORKER,    CACHE_OF_WORKER_MIN,    CACHE_TIMEOUT_DEPRECATED,    CACHE_TIMEOUT_OF_WORKER,    RECOVERY_OPTS_OF_WORKER,    CONNECT_TIMEOUT_OF_WORKER,    PREPOST_TIMEOUT_OF_WORKER,    REPLY_TIMEOUT_OF_WORKER,    SOCKET_TIMEOUT_OF_WORKER,    SOCKET_BUFFER_OF_WORKER,    SOCKET_KEEPALIVE_OF_WORKER,    RECYCLE_TIMEOUT_DEPRECATED,    LOAD_FACTOR_OF_WORKER,    STICKY_SESSION,    STICKY_SESSION_FORCE,    LOCAL_WORKER_DEPRECATED,    LOCAL_WORKER_ONLY_DEPRECATED,    JVM_ROUTE_OF_WORKER_DEPRECATED,    ROUTE_OF_WORKER,    DOMAIN_OF_WORKER,    REDIRECT_OF_WORKER,    METHOD_OF_WORKER,    LOCK_OF_WORKER,    IS_WORKER_DISABLED_DEPRECATED,    IS_WORKER_STOPPED_DEPRECATED,    ACTIVATION_OF_WORKER,    WORKER_RECOVER_TIME,    MAX_REPLY_TIMEOUTS_OF_WORKER,    WORKER_MAX_PACKET_SIZE,    STYLE_SHEET_OF_WORKER,    READ_ONLY_OF_WORKER,    RETRIES_OF_WORKER,    WORKER_MAINTAIN_PROPERTY_NAME,    NAMESPACE_OF_WORKER,    XML_NAMESPACE_OF_WORKER,    XML_DOCTYPE_OF_WORKER,    PROP_PREFIX_OF_WORKER,    USER_CASE_OF_WORKER,    NULL};static const char *deprecated_properties[] = {    SYSPROPS_OF_WORKER,    STDERR_OF_WORKER,    STDOUT_OF_WORKER,    MX_OF_WORKER,    MS_OF_WORKER,    CP_OF_WORKER,    BRIDGE_OF_WORKER,    JVM_OF_WORKER,    LIBPATH_OF_WORKER,    CMD_LINE_OF_WORKER,    NATIVE_LIB_OF_WORKER,    CACHE_OF_WORKER_DEPRECATED,    CACHE_TIMEOUT_DEPRECATED,    RECYCLE_TIMEOUT_DEPRECATED,    BALANCED_WORKERS_DEPRECATED,    JVM_ROUTE_OF_WORKER_DEPRECATED,    LOCAL_WORKER_DEPRECATED,    LOCAL_WORKER_ONLY_DEPRECATED,    IS_WORKER_DISABLED_DEPRECATED,    IS_WORKER_STOPPED_DEPRECATED,    NULL};static const char *supported_properties[] = {    SYSPROPS_OF_WORKER,    STDERR_OF_WORKER,    STDOUT_OF_WORKER,    SECRET_OF_WORKER,    MX_OF_WORKER,    MS_OF_WORKER,    CP_OF_WORKER,    BRIDGE_OF_WORKER,    JVM_OF_WORKER,    LIBPATH_OF_WORKER,    CMD_LINE_OF_WORKER,    NATIVE_LIB_OF_WORKER,    HOST_OF_WORKER,    PORT_OF_WORKER,    TYPE_OF_WORKER,    CACHE_OF_WORKER_DEPRECATED,    CACHE_OF_WORKER,    CACHE_OF_WORKER_MIN,    CACHE_TIMEOUT_DEPRECATED,    CACHE_TIMEOUT_OF_WORKER,    RECOVERY_OPTS_OF_WORKER,    CONNECT_TIMEOUT_OF_WORKER,    PREPOST_TIMEOUT_OF_WORKER,    REPLY_TIMEOUT_OF_WORKER,    SOCKET_TIMEOUT_OF_WORKER,    SOCKET_BUFFER_OF_WORKER,    SOCKET_KEEPALIVE_OF_WORKER,    RECYCLE_TIMEOUT_DEPRECATED,    LOAD_FACTOR_OF_WORKER,    DISTANCE_OF_WORKER,    BALANCED_WORKERS_DEPRECATED,    BALANCE_WORKERS,    STICKY_SESSION,    STICKY_SESSION_FORCE,    LOCAL_WORKER_DEPRECATED,    LOCAL_WORKER_ONLY_DEPRECATED,    JVM_ROUTE_OF_WORKER_DEPRECATED,    ROUTE_OF_WORKER,    DOMAIN_OF_WORKER,    REDIRECT_OF_WORKER,    MOUNT_OF_WORKER,    METHOD_OF_WORKER,    LOCK_OF_WORKER,    IS_WORKER_DISABLED_DEPRECATED,    IS_WORKER_STOPPED_DEPRECATED,    ACTIVATION_OF_WORKER,    WORKER_RECOVER_TIME,    MAX_REPLY_TIMEOUTS_OF_WORKER,    WORKER_MAX_PACKET_SIZE,    STYLE_SHEET_OF_WORKER,    NAMESPACE_OF_WORKER,    XML_NAMESPACE_OF_WORKER,    XML_DOCTYPE_OF_WORKER,    PROP_PREFIX_OF_WORKER,    READ_ONLY_OF_WORKER,    USER_OF_WORKER,    USER_CASE_OF_WORKER,    GOOD_RATING_OF_WORKER,    BAD_RATING_OF_WORKER,    SECRET_KEY_OF_WORKER,    RETRIES_OF_WORKER,    STATUS_FAIL_OF_WORKER,    LIST_PROPERTY_NAME,    MAINTAIN_PROPERTY_NAME};static const char *jk_level_verbs[] = {    "[" JK_LOG_TRACE_VERB "] ",    "[" JK_LOG_DEBUG_VERB "] ",    "[" JK_LOG_INFO_VERB "] ",    "[" JK_LOG_WARN_VERB "] ",    "[" JK_LOG_ERROR_VERB "] ",    "[" JK_LOG_EMERG_VERB "] ",    NULL};const char *jk_get_bool(int v){    if (v == 0)        return "False";    else        return "True";}int jk_get_bool_code(const char *v, int def){    if (!v) {        return def;    }    else if (!strcasecmp(v, "off") ||             *v == 'F' || *v == 'f' ||             *v == 'N' || *v == 'n' ||             *v == '0') {        return 0;    }    else if (!strcasecmp(v, "on") ||             *v == 'T' || *v == 't' ||             *v == 'Y' || *v == 'y' ||             *v == '1') {        return 1;    }    return def;}/* Sleep for 100ms */void jk_sleep(int ms){#ifdef OS2    DosSleep(ms);#elif defined(BEOS)    snooze(ms * 1000);#elif defined(NETWARE)    delay(ms);#elif defined(WIN32)    Sleep(ms);#else    struct timeval tv;    tv.tv_usec = ms * 1000;    tv.tv_sec = 0;    select(0, NULL, NULL, NULL, &tv);#endif}void jk_set_time_fmt(jk_logger_t *l, const char *jk_log_fmt){    if (l) {        char *s;        char log_fmt_safe[JK_TIME_MAX_SIZE];        char *fmt;        if (!jk_log_fmt) {#ifndef NO_GETTIMEOFDAY            jk_log_fmt = JK_TIME_FORMAT_MILLI;#else            jk_log_fmt = JK_TIME_FORMAT_NONE;#endif        }        l->log_fmt_type = JK_TIME_SUBSEC_NONE;        l->log_fmt_offset = 0;        l->log_fmt_size = 0;        l->log_fmt_subsec = jk_log_fmt;        l->log_fmt = jk_log_fmt;        fmt = (char *)malloc(JK_TIME_MAX_SIZE + strlen(JK_TIME_PATTERN_MICRO));        if (fmt) {            strncpy(log_fmt_safe, jk_log_fmt, JK_TIME_MAX_SIZE);            if ((s = strstr(log_fmt_safe, JK_TIME_CONV_MILLI))) {                size_t offset = s - log_fmt_safe;                size_t len = strlen(JK_TIME_PATTERN_MILLI);                l->log_fmt_type = JK_TIME_SUBSEC_MILLI;                l->log_fmt_offset = offset;                strncpy(fmt, log_fmt_safe, offset);                strncpy(fmt + offset, JK_TIME_PATTERN_MILLI, len);                strncpy(fmt + offset + len,                        s + strlen(JK_TIME_CONV_MILLI),                        JK_TIME_MAX_SIZE - offset - len);                fmt[JK_TIME_MAX_SIZE-1] = '\0';                l->log_fmt_subsec = fmt;                l->log_fmt_size = strlen(fmt);            }            else if ((s = strstr(log_fmt_safe, JK_TIME_CONV_MICRO))) {                size_t offset = s - log_fmt_safe;                size_t len = strlen(JK_TIME_PATTERN_MICRO);                l->log_fmt_type = JK_TIME_SUBSEC_MICRO;                l->log_fmt_offset = offset;                strncpy(fmt, log_fmt_safe, offset);                strncpy(fmt + offset, JK_TIME_PATTERN_MICRO, len);                strncpy(fmt + offset + len,                        s + strlen(JK_TIME_CONV_MICRO),                        JK_TIME_MAX_SIZE - offset - len);                fmt[JK_TIME_MAX_SIZE-1] = '\0';                l->log_fmt_subsec = fmt;                l->log_fmt_size = strlen(fmt);            }        }    }}static int set_time_str(char *str, int len, jk_logger_t *l){    time_t t;    struct tm *tms;    int done;    char log_fmt[JK_TIME_MAX_SIZE];    if (!l || !l->log_fmt) {        return 0;    }    log_fmt[0] = '\0';#ifndef NO_GETTIMEOFDAY    if ( l->log_fmt_type != JK_TIME_SUBSEC_NONE ) {        struct timeval tv;        int rc = 0;#ifdef WIN32        gettimeofday(&tv, NULL);#else        rc = gettimeofday(&tv, NULL);#endif        if (rc == 0) {            char subsec[7];            t = tv.tv_sec;            strncpy(log_fmt, l->log_fmt_subsec, l->log_fmt_size + 1);            if (l->log_fmt_type == JK_TIME_SUBSEC_MILLI) {                sprintf(subsec, "%03d", (int)(tv.tv_usec/1000));                strncpy(log_fmt + l->log_fmt_offset, subsec, 3);            }            else if (l->log_fmt_type == JK_TIME_SUBSEC_MICRO) {                sprintf(subsec, "%06d", (int)(tv.tv_usec));                strncpy(log_fmt + l->log_fmt_offset, subsec, 6);            }        }        else {            t = time(NULL);        }    }    else {        t = time(NULL);    }#else    t = time(NULL);#endif    tms = localtime(&t);    if (log_fmt[0])        done = (int)strftime(str, len, log_fmt, tms);    else        done = (int)strftime(str, len, l->log_fmt, tms);    return done;}static int JK_METHOD log_to_file(jk_logger_t *l, int level, int used, char *what){    if (l &&        (l->level <= level || level == JK_LOG_REQUEST_LEVEL) &&        l->logger_private && what) {        jk_file_logger_t *p = l->logger_private;        if (p->logfile) {            what[used++] = '\n';            what[used] = '\0';            fputs(what, p->logfile);            /* [V] Flush the dam' thing! */            fflush(p->logfile);        }        return JK_TRUE;    }    return JK_FALSE;}int jk_parse_log_level(const char *level){    if (0 == strcasecmp(level, JK_LOG_TRACE_VERB)) {        return JK_LOG_TRACE_LEVEL;    }    if (0 == strcasecmp(level, JK_LOG_DEBUG_VERB)) {        return JK_LOG_DEBUG_LEVEL;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?