jk_map.c

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

C
855
字号
                                       strlen(*v) + strlen(oldv) + 3);            if (tmpv) {                char sep = '*';                if (jk_is_path_property(prp))                    sep = PATH_SEPERATOR;                else if (jk_is_cmd_line_property(prp))                    sep = ' ';                else if (jk_is_list_property(prp))                    sep = ',';                sprintf(tmpv, "%s%c%s", oldv, sep, *v);            }            *v = tmpv;            if (JK_IS_DEBUG_LEVEL(l))                jk_log(l, JK_LOG_DEBUG,                       "Concatenated value is: %s -> %s",                       prp, *v);            return JK_FALSE;        }        else {            jk_log(l, JK_LOG_WARNING,                   "Duplicate key '%s' detected - previous value '%s'"                   " will be overwritten with '%s'.",                   prp, oldv ? oldv : "(null)", v ? *v : "(null)");            return JK_TRUE;        }    }    else {        return JK_TRUE;    }}int jk_map_read_property(jk_map_t *m, const char *str,                         int treatment, jk_logger_t *l){    int rc = JK_TRUE;    char buf[LENGTH_OF_LINE + 1];    char *prp = &buf[0];    if (strlen(str) > LENGTH_OF_LINE) {        jk_log(l, JK_LOG_WARNING,               "Line to long (%d > %d), ignoring entry",               strlen(str), LENGTH_OF_LINE);        return JK_FALSE;    }    strcpy(prp, str);    if (trim(prp)) {        char *v = strchr(prp, '=');        if (v) {            *v = '\0';            v++;            trim(prp);            trim(v);            if (strlen(v) && strlen(prp)) {                if (treatment == JK_MAP_HANDLE_RAW) {                    v = jk_pool_strdup(&m->p, v);                }                else {                    if (jk_map_validate_property(prp, l) == JK_FALSE)                        return JK_FALSE;                    v = jk_map_replace_properties(m, v);                    if (jk_map_handle_duplicates(m, prp, &v, treatment, l) == JK_TRUE)                        v = jk_pool_strdup(&m->p, v);                }                if (v) {                    if (JK_IS_DEBUG_LEVEL(l))                        jk_log(l, JK_LOG_DEBUG,                               "Adding property '%s' with value '%s' to map.",                               prp, v);                    jk_map_put(m, prp, v, NULL);                }                else {                    JK_LOG_NULL_PARAMS(l);                    rc = JK_FALSE;                }            }        }    }    return rc;}int jk_map_read_properties(jk_map_t *m, const char *f, time_t *modified,                           int treatment, jk_logger_t *l){    int rc = JK_FALSE;    if (m && f) {        struct stat statbuf;        FILE *fp;        if (jk_stat(f, &statbuf) == -1)            return JK_FALSE;#if defined(AS400) && !defined(AS400_UTF8)        fp = fopen(f, "r, o_ccsid=0");#else        fp = fopen(f, "r");#endif        if (fp) {            char buf[LENGTH_OF_LINE + 1];            char *prp;            rc = JK_TRUE;            while (NULL != (prp = fgets(buf, LENGTH_OF_LINE, fp))) {                trim_prp_comment(prp);                if (*prp) {                    if ((rc = jk_map_read_property(m, prp, treatment, l)) == JK_FALSE)                        break;                }            }            fclose(fp);            if (modified)                *modified = statbuf.st_mtime;        }    }    return rc;}int jk_map_size(jk_map_t *m){    if (m) {        return m->size;    }    return -1;}const char *jk_map_name_at(jk_map_t *m, int idex){    if (m && idex >= 0) {        return m->names[idex];  /* DIRTY */    }    return NULL;}void *jk_map_value_at(jk_map_t *m, int idex){    if (m && idex >= 0) {        return (void *)m->values[idex]; /* DIRTY */    }    return NULL;}void jk_map_dump(jk_map_t *m, jk_logger_t *l){    if (m) {        if (JK_IS_DEBUG_LEVEL(l)) {            int s = jk_map_size(m);            int i;            for (i=0;i<s;i++) {                jk_log(l, JK_LOG_DEBUG,                       "Dump of map: '%s' -> '%s'",                       jk_map_name_at(m, i), jk_map_value_at(m, i));            }        }    }}static void trim_prp_comment(char *prp){#if defined(AS400) && !defined(AS400_UTF8)    char *comment;    /* lots of lines that translate a '#' realtime deleted   */    comment = strchr(prp, *APR_NUMBERSIGN);#else    char *comment = strchr(prp, '#');#endif    if (comment) {        *comment = '\0';    }}static size_t trim(char *s){    size_t i;    /* check for empty strings */    if (!(i = strlen(s)))        return 0;    for (i = i - 1; (i >= 0) &&         isspace((int)((unsigned char)s[i])); i--);    s[i + 1] = '\0';    for (i = 0; ('\0' != s[i]) &&         isspace((int)((unsigned char)s[i])); i++);    if (i > 0) {        strcpy(s, &s[i]);    }    return strlen(s);}static int map_realloc(jk_map_t *m){    if (m->size == m->capacity) {        char **names;        void **values;        unsigned int *keys;        int capacity = m->capacity + CAPACITY_INC_SIZE;        names = (char **)jk_pool_alloc(&m->p, sizeof(char *) * capacity);        values = (void **)jk_pool_alloc(&m->p, sizeof(void *) * capacity);        keys = (unsigned int *)jk_pool_alloc(&m->p, sizeof(unsigned int) * capacity);        if (values && names) {            if (m->capacity && m->names)                memcpy(names, m->names, sizeof(char *) * m->capacity);            if (m->capacity && m->values)                memcpy(values, m->values, sizeof(void *) * m->capacity);            if (m->capacity && m->keys)                memcpy(keys, m->keys, sizeof(unsigned int) * m->capacity);            m->names = (const char **)names;            m->values = (const void **)values;            m->keys = keys;            m->capacity = capacity;            return JK_TRUE;        }    }    return JK_FALSE;}/** *  Replace $(property) in value. * */char *jk_map_replace_properties(jk_map_t *m, const char *value){    char *rc = (char *)value;    char *env_start = rc;    int rec = 0;    while ((env_start = strstr(env_start, "$(")) != NULL) {        char *env_end = strstr(env_start, ")");        if (rec++ > 20)            return rc;        if (env_end) {            char env_name[LENGTH_OF_LINE + 1] = "";            const char *env_value;#if defined(WIN32)            char env_buf[LENGTH_OF_LINE + 1];#endif            *env_end = '\0';            strcpy(env_name, env_start + 2);            *env_end = ')';            env_value = jk_map_get_string(m, env_name, NULL);            if (!env_value) {                env_value = getenv(env_name);            }#if defined(WIN32)            if (!env_value) {                /* Try the env block from calling process */                if (GetEnvironmentVariable(env_name, env_buf,                                           sizeof(env_buf)))                    env_value = &env_buf[0];            }#endif            if (env_value) {                size_t offset = 0;                char *new_value = jk_pool_alloc(&m->p,                                                (sizeof(char) *                                                (strlen(rc) +                                                strlen(env_value))));                if (!new_value) {                    break;                }                *env_start = '\0';                strcpy(new_value, rc);                strcat(new_value, env_value);                strcat(new_value, env_end + 1);                offset = env_start - rc + strlen(env_value);                rc = new_value;                /* Avoid recursive subst */                env_start = rc + offset;            }            else {                env_start = env_end;            }        }        else {            break;        }    }    return rc;}/** *  Resolve references * */int jk_map_resolve_references(jk_map_t *m, const char *prefix,                              int wildcard, int depth, jk_logger_t *l){    int rc = JK_FALSE;    JK_TRACE_ENTER(l);    if (m && prefix) {        if (depth <= JK_MAP_RECURSION) {            size_t prelen = strlen(prefix);            unsigned int i;            rc = JK_TRUE;            if (JK_IS_DEBUG_LEVEL(l))                jk_log(l, JK_LOG_DEBUG,                       "Checking for references with prefix %s with%s wildcard (recursion %d)",                       prefix, wildcard? "" : "out", depth);            for (i = 0; i < m->size; i++) {                if (m->values[i] && !strncmp(m->names[i], prefix, prelen)) {                    size_t remain = strlen(m->names[i]) - prelen;                    if ((remain == JK_MAP_REFERENCE_SZ ) || (wildcard && remain > JK_MAP_REFERENCE_SZ)) {                        remain = strlen(m->names[i]) - JK_MAP_REFERENCE_SZ;                        if (!strncmp(m->names[i] + remain, JK_MAP_REFERENCE, JK_MAP_REFERENCE_SZ)) {                            char *from = jk_pool_alloc(&m->p,                                                       (sizeof(char) *                                                       (strlen(m->values[i]) + 2)));                            char *to = jk_pool_alloc(&m->p,                                                     (sizeof(char) *                                                     (remain + 2)));                            if (!from || !to) {                                jk_log(l, JK_LOG_ERROR,                                       "Error in string allocation");                                rc = JK_FALSE;                                break;                            }                            strcpy(from, m->values[i]);                            *(from+strlen(m->values[i]))   = '.';                            *(from+strlen(m->values[i])+1) = '\0';                            strncpy(to, m->names[i], remain);                            *(to+remain)   = '.';                            *(to+remain+1) = '\0';                            rc = jk_map_resolve_references(m, m->values[i], 0, depth+1, l);                            if (rc == JK_FALSE) {                                break;                            }                            if (JK_IS_DEBUG_LEVEL(l))                                jk_log(l, JK_LOG_DEBUG,                                       "Copying values from %s to %s",                                       from, to);                            rc = jk_map_inherit_properties(m, from, to, l);                            if (rc == JK_FALSE) {                                break;                            }                            m->values[i] = NULL;                        }                    }                }            }        }        else {            jk_log(l, JK_LOG_ERROR,                   "Recursion limit %d for worker references with prefix '%s' reached",                   JK_MAP_RECURSION, prefix);        }    }    else {        JK_LOG_NULL_PARAMS(l);    }    JK_TRACE_EXIT(l);    return rc;}/** *  Inherit properties * */int jk_map_inherit_properties(jk_map_t *m, const char *from, const char *to, jk_logger_t *l){    int rc = JK_FALSE;    const char *prp;    char *to_prp;    if (m && from && to) {        unsigned int i;        for (i = 0; i < m->size; i++) {            if (!strncmp(m->names[i], from, strlen(from))) {                rc = JK_TRUE;                prp = m->names[i] + strlen(from);                to_prp = jk_pool_alloc(&m->p,                                       (sizeof(char) *                                       (strlen(to) +                                       strlen(prp) + 1)));                if (!to_prp) {                    jk_log(l, JK_LOG_ERROR,                           "Error in string allocation for attribute '%s.%s'",                           to, prp);                    rc = JK_FALSE;                    break;                }                strcpy(to_prp, to);                strcat(to_prp, prp);                if (jk_map_get_id(m, to_prp) < 0 ) {                    rc = jk_map_add(m, to_prp, m->values[i]);                    if (rc == JK_FALSE) {                        jk_log(l, JK_LOG_ERROR,                               "Error when adding attribute '%s'",                               to_prp);                        break;                    }                }            }        }        if ( rc == JK_FALSE) {            jk_log(l, JK_LOG_ERROR,                   "Reference '%s' not found",                   from);        }    }    else {        JK_LOG_NULL_PARAMS(l);    }    return rc;}

⌨️ 快捷键说明

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