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