jk_context.c
来自「Tomcat 4.1与WebServer集成组件的源代码包.」· C语言 代码 · 共 332 行
C
332 行
/* ========================================================================= * * * * 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: Context handling (Autoconf) * * Author: Henri Gomez <hgomez@slib.fr> * * Version: $Revision: 1.7 $ * ***************************************************************************/#include "jk_global.h"#include "jk_context.h"#include "jk_ajp_common.h"/* * Set the virtual name of the context */int context_set_virtual(jk_context_t *c, char *virtual){ if (c) { if (virtual) { c->virtual = jk_pool_strdup(&c->p, virtual); if (! c->virtual) return JK_FALSE; } return JK_TRUE; } return JK_FALSE;}/* * Init the context info struct */int context_open(jk_context_t *c, char *virtual){ if (c) { jk_open_pool(&c->p, c->buf, sizeof(jk_pool_atom_t) * SMALL_POOL_SIZE); c->size = 0; c->capacity = 0; c->contexts = NULL; return context_set_virtual(c, virtual); } return JK_FALSE;}/* * Close the context info struct */int context_close(jk_context_t *c){ if (c) { jk_close_pool(&c->p); return JK_TRUE; } return JK_FALSE;}/* * Allocate and open context */int context_alloc(jk_context_t **c, char * virtual){ if (c) return context_open(*c = (jk_context_t *)malloc(sizeof(jk_context_t)), virtual); return JK_FALSE;} /* * Close and destroy context */int context_free(jk_context_t **c){ if (c && *c) { context_close(*c); free(*c); *c = NULL; return JK_TRUE; } return JK_FALSE;}/* * Ensure there will be memory in context info to store Context Bases */static int context_realloc(jk_context_t *c){ if (c->size == c->capacity) { jk_context_item_t **contexts; int capacity = c->capacity + CBASE_INC_SIZE; contexts = (jk_context_item_t **)jk_pool_alloc(&c->p, sizeof(jk_context_item_t *) * capacity); if (! contexts) return JK_FALSE; if (c->capacity && c->contexts) memcpy(contexts, c->contexts, sizeof(jk_context_item_t *) * c->capacity); c->contexts = contexts; c->capacity = capacity; } return JK_TRUE;}/* * Ensure there will be memory in context info to URIS */ static int context_item_realloc(jk_context_t *c, jk_context_item_t *ci){ if (ci->size == ci->capacity) { char **uris; int capacity = ci->capacity + URI_INC_SIZE; uris = (char **)jk_pool_alloc(&c->p, sizeof(char *) * capacity); if (! uris) return JK_FALSE; memcpy(uris, ci->uris, sizeof(char *) * ci->capacity); ci->uris = uris; ci->capacity = capacity; } return JK_TRUE;} /* * Locate a context base in context list */jk_context_item_t * context_find_base(jk_context_t *c, char *cbase){ int i; jk_context_item_t * ci; if (! c || ! cbase) return NULL; for (i = 0 ; i < c->size ; i++) { ci = c->contexts[i]; if (! ci) continue; if (! strcmp(ci->cbase, cbase)) return ci; } return NULL;}/* * Locate an URI in a context item */char * context_item_find_uri(jk_context_item_t *ci, char *uri){ int i; if (! ci || ! uri) return NULL; for (i = 0 ; i < ci->size ; i++) { if (! strcmp(ci->uris[i], uri)) return ci->uris[i]; } return NULL;}void context_dump_uris(jk_context_t *c, char *cbase, FILE * f){ jk_context_item_t * ci; int i; ci = context_find_base(c, cbase); if (! ci) return; for (i = 0; i < ci->size; i++) fprintf(f, "/%s/%s\n", ci->cbase, ci->uris[i]); fflush(f); }/* * Add a new context item to context */jk_context_item_t * context_add_base(jk_context_t *c, char *cbase){ jk_context_item_t * ci; if (! c || !cbase) return NULL; /* Check if the context base was not allready created */ ci = context_find_base(c, cbase); if (ci) return ci; if (context_realloc(c) != JK_TRUE) return NULL; ci = (jk_context_item_t *)jk_pool_alloc(&c->p, sizeof(jk_context_item_t)); if (! ci) return NULL; c->contexts[c->size] = ci; c->size++; ci->cbase = jk_pool_strdup(&c->p, cbase); ci->status = 0; ci->size = 0; ci->capacity = 0; ci->uris = NULL; return ci;}/* * Add a new URI to a context item */int context_add_uri(jk_context_t *c, char *cbase, char * uri){ jk_context_item_t * ci; if (! uri) return JK_FALSE; /* Get/Create the context base */ ci = context_add_base(c, cbase); if (! ci) return JK_FALSE; if (context_item_find_uri(ci, uri) != NULL) return JK_TRUE; if (context_item_realloc(c, ci) == JK_FALSE) return JK_FALSE; ci->uris[ci->size] = jk_pool_strdup(&c->p, uri); if (ci->uris[ci->size] == NULL) return JK_FALSE; ci->size++; return JK_TRUE;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?