⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jk_util.c

📁 Tomcat 4.1与WebServer集成组件的源代码包.
💻 C
📖 第 1 页 / 共 2 页
字号:
/* ========================================================================= * *                                                                           * *                 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 + -