📄 jk_util.c
字号:
/* ========================================================================= * * * * The Apache Software License, Version 1.1 * * * * Copyright (c) 1999-2001 The Apache Software Foundation. * * All rights reserved. * * * * ========================================================================= * * * * Redistribution and use in source and binary forms, with or without modi- * * fication, are permitted provided that the following conditions are met: * * * * 1. Redistributions of source code must retain the above copyright notice * * notice, this list of conditions and the following disclaimer. * * * * 2. Redistributions in binary form must reproduce the above copyright * * notice, this list of conditions and the following disclaimer in the * * documentation and/or other materials provided with the distribution. * * * * 3. The end-user documentation included with the redistribution, if any, * * must include the following acknowlegement: * * * * "This product includes software developed by the Apache Software * * Foundation <http://www.apache.org/>." * * * * Alternately, this acknowlegement may appear in the software itself, if * * and wherever such third-party acknowlegements normally appear. * * * * 4. The names "The Jakarta Project", "Jk", and "Apache Software * * Foundation" must not be used to endorse or promote products derived * * from this software without prior written permission. For written * * permission, please contact <apache@apache.org>. * * * * 5. Products derived from this software may not be called "Apache" nor may * * "Apache" appear in their names without prior written permission of the * * Apache Software Foundation. * * * * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES * * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * * THE APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY * * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * * POSSIBILITY OF SUCH DAMAGE. * * * * ========================================================================= * * * * This software consists of voluntary contributions made by many indivi- * * duals on behalf of the Apache Software Foundation. For more information * * on the Apache Software Foundation, please see <http://www.apache.org/>. * * * * ========================================================================= *//*************************************************************************** * Description: Utility functions (mainly configuration) * * Author: Gal Shachor <shachor@il.ibm.com> * * Author: Henri Gomez <hgomez@slib.fr> * * Version: $Revision: 1.19 $ * ***************************************************************************/#include "jk_util.h"#include "jk_ajp12_worker.h"#define SYSPROPS_OF_WORKER ("sysprops")#define STDERR_OF_WORKER ("stderr")#define STDOUT_OF_WORKER ("stdout")#define SECRET_OF_WORKER ("secret")#define CONF_OF_WORKER ("conf")#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 PREFIX_OF_WORKER ("worker")#define HOST_OF_WORKER ("host")#define PORT_OF_WORKER ("port")#define TYPE_OF_WORKER ("type")#define CACHE_OF_WORKER ("cachesize")#define CACHE_TIMEOUT_OF_WORKER ("cache_timeout")#define SOCKET_TIMEOUT_OF_WORKER ("socket_timeout")#define SOCKET_KEEPALIVE_OF_WORKER ("socket_keepalive")#define LOAD_FACTOR_OF_WORKER ("lbfactor")#define BALANCED_WORKERS ("balanced_workers")#define STICKY_SESSION ("sticky_session")#define LOCAL_WORKER_ONLY_FLAG ("local_worker_only")#define LOCAL_WORKER_FLAG ("local_worker")#define WORKER_AJP12 ("ajp12")#define DEFAULT_WORKER_TYPE JK_AJP12_WORKER_NAME#define SECRET_KEY_OF_WORKER ("secretkey")#define DEFAULT_WORKER JK_AJP12_WORKER_NAME#define WORKER_LIST_PROPERTY_NAME ("worker.list")#define DEFAULT_LB_FACTOR (1.0)#define LOG_FORMAT ("log_format")#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 LOG_LINE_SIZE (1024)struct file_logger { FILE *logfile;};typedef struct file_logger file_logger_t;/* * 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 */#ifndef JK_TIME_FORMAT #define JK_TIME_FORMAT "[%a %b %d %H:%M:%S %Y] "#endifconst char * jk_log_fmt = JK_TIME_FORMAT;static void set_time_str(char * str, int len){ time_t t = time(NULL); struct tm *tms; tms = localtime(&t); strftime(str, len, jk_log_fmt, tms);}static int JK_METHOD log_to_file(jk_logger_t *l, int level, const char *what){ if( l && (l->level <= level || level == JK_LOG_REQUEST_LEVEL) && l->logger_private && what) { unsigned sz = strlen(what); if(sz) { file_logger_t *p = l->logger_private; fwrite(what, 1, sz, 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_INFO_VERB)) { return JK_LOG_INFO_LEVEL; } if(0 == strcasecmp(level, JK_LOG_ERROR_VERB)) { return JK_LOG_ERROR_LEVEL; } if(0 == strcasecmp(level, JK_LOG_EMERG_VERB)) { return JK_LOG_EMERG_LEVEL; } return JK_LOG_DEBUG_LEVEL;}int jk_open_file_logger(jk_logger_t **l, const char *file, int level){ if(l && file) { jk_logger_t *rc = (jk_logger_t *)malloc(sizeof(jk_logger_t)); file_logger_t *p = (file_logger_t *)malloc(sizeof(file_logger_t)); if(rc && p) { rc->log = log_to_file; rc->level = level; rc->logger_private = p;#ifdef AS400 p->logfile = fopen(file, "a+, o_ccsid=0");#else p->logfile = fopen(file, "a+");#endif if(p->logfile) { *l = rc; return JK_TRUE; } } if(rc) { free(rc); } if(p) { free(p); } *l = NULL; } return JK_FALSE;}int jk_close_file_logger(jk_logger_t **l){ if(l && *l) { file_logger_t *p = (*l)->logger_private; fflush(p->logfile); fclose(p->logfile); free(p); free(*l); *l = NULL; return JK_TRUE; } return JK_FALSE;}int jk_log(jk_logger_t *l, const char *file, int line, int level, const char *fmt, ...){ int rc = 0; if(!l || !file || !fmt) { return -1; } if((l->level <= level) || (level == JK_LOG_REQUEST_LEVEL)) {#ifdef NETWARE/* On NetWare, this can get called on a thread that has a limited stack so *//* we will allocate and free the temporary buffer in this function */ char *buf;#else char buf[HUGE_BUFFER_SIZE];#endif char *f = (char *)(file + strlen(file) - 1); va_list args; int used = 0; while(f != file && '\\' != *f && '/' != *f) { f--; } if(f != file) { f++; }#ifdef USE_SPRINTF /* until we get a snprintf function */#ifdef NETWARE buf = (char *) malloc(HUGE_BUFFER_SIZE); if (NULL == buf) return -1;#endif set_time_str(buf, HUGE_BUFFER_SIZE); used = strlen(buf); if(line) used += sprintf(&buf[used], " [%s (%d)]: ", f, line);#else set_time_str(buf, HUGE_BUFFER_SIZE); used = strlen(buf); if(line) used += snprintf(&buf[used], HUGE_BUFFER_SIZE, " [%s (%d)]: ", f, line); #endif if(used < 0) { return 0; /* [V] not sure what to return... */ } va_start(args, fmt);#ifdef USE_VSPRINTF /* until we get a vsnprintf function */ rc = vsprintf(buf + used, fmt, args);#else rc = vsnprintf(buf + used, HUGE_BUFFER_SIZE - used, fmt, args);#endif va_end(args); l->log(l, level, buf);#ifdef NETWARE free(buf);#endif } return rc;}char *jk_get_worker_type(jk_map_t *m, const char *wname){ char buf[1024]; if(!m || !wname) { return NULL; } sprintf(buf, "%s.%s.%s", PREFIX_OF_WORKER, wname, TYPE_OF_WORKER); return map_get_string(m, buf, DEFAULT_WORKER_TYPE);}char *jk_get_worker_secret(jk_map_t *m, const char *wname){ char buf[1024]; char *secret; char *secret_file; if(!m || !wname) { return NULL; } sprintf(buf, "%s.%s.%s", PREFIX_OF_WORKER, wname, SECRET_OF_WORKER); secret=map_get_string(m, buf, NULL); return secret;}/* [V] I suggest that the following general purpose functions be used. *//* More should be added (double etc.), but now these were enough for me. *//* Functions that can be simulated with these should be "deprecated". */int jk_get_worker_str_prop(jk_map_t *m, const char *wname, const char *pname, char **prop){ char buf[1024]; if(m && prop && wname && pname) { sprintf(buf, "%s.%s.%s", PREFIX_OF_WORKER, wname, pname); *prop = map_get_string(m, buf, NULL); if(*prop) { return JK_TRUE; } } return JK_FALSE;}int jk_get_worker_int_prop(jk_map_t *m, const char *wname, const char *pname, int *prop){ char buf[1024]; if(m && prop && wname && pname) { int i; sprintf(buf, "%s.%s.%s", PREFIX_OF_WORKER, wname, pname); i = map_get_int(m, buf, -1); if(-1 != i) { *prop = i; return JK_TRUE; } } return JK_FALSE;}char *jk_get_worker_host(jk_map_t *m, const char *wname, const char *def){ char buf[1024]; if(!m || !wname) { return NULL; } sprintf(buf, "%s.%s.%s", PREFIX_OF_WORKER, wname, HOST_OF_WORKER); return map_get_string(m, buf, def);}int jk_get_worker_port(jk_map_t *m, const char *wname, int def){ char buf[1024]; if(!m || !wname) { return -1; } sprintf(buf, "%s.%s.%s", PREFIX_OF_WORKER, wname, PORT_OF_WORKER); return map_get_int(m, buf, def);}int jk_get_worker_cache_size(jk_map_t *m, const char *wname, int def){ char buf[1024]; if(!m || !wname) { return -1; } sprintf(buf, "%s.%s.%s", PREFIX_OF_WORKER, wname, CACHE_OF_WORKER); return map_get_int(m, buf, def);}int jk_get_worker_socket_timeout(jk_map_t *m, const char *wname, int def){ char buf[1024]; if(!m || !wname) { return -1; } sprintf(buf, "%s.%s.%s", PREFIX_OF_WORKER, wname, SOCKET_TIMEOUT_OF_WORKER); return map_get_int(m, buf, def);}int jk_get_worker_socket_keepalive(jk_map_t *m, const char *wname, int def){ char buf[1024]; if(!m || !wname) { return -1; } sprintf(buf, "%s.%s.%s", PREFIX_OF_WORKER, wname, SOCKET_KEEPALIVE_OF_WORKER); return map_get_int(m, buf, def);}int jk_get_worker_cache_timeout(jk_map_t *m, const char *wname, int def){ char buf[1024]; if(!m || !wname) { return -1; } sprintf(buf, "%s.%s.%s", PREFIX_OF_WORKER, wname, CACHE_TIMEOUT_OF_WORKER); return map_get_int(m, buf, def);}char * jk_get_worker_secret_key(jk_map_t *m, const char *wname){ char buf[1024]; if(!m || !wname) { return NULL; } sprintf(buf, "%s.%s.%s", PREFIX_OF_WORKER, wname, SECRET_KEY_OF_WORKER); return map_get_string(m, buf, NULL);}int jk_get_worker_list(jk_map_t *m, char ***list, unsigned *num_of_wokers){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -