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 + -
显示快捷键?