summaryrefslogtreecommitdiffstats
path: root/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.c
diff options
context:
space:
mode:
Diffstat (limited to 'rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.c')
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.c296
1 files changed, 296 insertions, 0 deletions
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.c
new file mode 100644
index 00000000..f65ba836
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.c
@@ -0,0 +1,296 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Context handling (Autoconf) *
+ * Author: Henri Gomez <hgomez@apache.org> *
+ * Version: $Revision: 466585 $ *
+ ***************************************************************************/
+
+#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 *virt)
+{
+ if (c) {
+
+ if (virt) {
+ c->virt = jk_pool_strdup(&c->p, virt);
+
+ if (!c->virt)
+ return JK_FALSE;
+ }
+
+ return JK_TRUE;
+ }
+
+ return JK_FALSE;
+}
+
+/*
+ * Init the context info struct
+ */
+
+int context_open(jk_context_t *c, char *virt)
+{
+ 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, virt);
+ }
+
+ 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 *virt)
+{
+ if (c)
+ return context_open(*c =
+ (jk_context_t *)calloc(1, sizeof(jk_context_t)),
+ virt);
+
+ 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;
+}