]> granicus.if.org Git - apache/blob - server/provider.c
finished that boring job:
[apache] / server / provider.c
1 /* ====================================================================
2  * The Apache Software License, Version 1.1
3  *
4  * Copyright (c) 2000-2003 The Apache Software Foundation.  All rights
5  * reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  *
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in
16  *    the documentation and/or other materials provided with the
17  *    distribution.
18  *
19  * 3. The end-user documentation included with the redistribution,
20  *    if any, must include the following acknowledgment:
21  *       "This product includes software developed by the
22  *        Apache Software Foundation (http://www.apache.org/)."
23  *    Alternately, this acknowledgment may appear in the software itself,
24  *    if and wherever such third-party acknowledgments normally appear.
25  *
26  * 4. The names "Apache" and "Apache Software Foundation" must
27  *    not be used to endorse or promote products derived from this
28  *    software without prior written permission. For written
29  *    permission, please contact apache@apache.org.
30  *
31  * 5. Products derived from this software may not be called "Apache",
32  *    nor may "Apache" appear in their name, without prior written
33  *    permission of the Apache Software Foundation.
34  *
35  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
36  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
37  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
38  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
39  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
41  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
42  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
43  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
44  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
45  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
46  * SUCH DAMAGE.
47  * ====================================================================
48  *
49  * This software consists of voluntary contributions made by many
50  * individuals on behalf of the Apache Software Foundation.  For more
51  * information on the Apache Software Foundation, please see
52  * <http://www.apache.org/>.
53  *
54  */
55
56 #include "apr_pools.h"
57 #include "apr_hash.h"
58
59 #include "ap_provider.h"
60
61 static apr_hash_t *global_providers = NULL;
62
63 static apr_status_t cleanup_global_providers(void *ctx)
64 {
65     global_providers = NULL;
66     return APR_SUCCESS;
67 }
68
69 AP_DECLARE(apr_status_t) ap_register_provider(apr_pool_t *pool,
70                                               const char *provider_group,
71                                               const char *provider_name,
72                                               const char *provider_version,
73                                               const void *provider)
74 {
75     apr_hash_t *provider_group_hash;
76     apr_hash_t *provider_version_hash;
77
78     if (global_providers == NULL) {
79         global_providers = apr_hash_make(pool);
80         apr_pool_cleanup_register(pool, NULL, cleanup_global_providers,
81                                   apr_pool_cleanup_null);
82     }
83
84     provider_group_hash = apr_hash_get(global_providers, provider_group,
85                                        APR_HASH_KEY_STRING);
86
87     if (!provider_group_hash) {
88         provider_group_hash = apr_hash_make(pool);
89         apr_hash_set(global_providers, provider_group, APR_HASH_KEY_STRING,
90                      provider_group_hash);
91         
92     }
93
94     provider_version_hash = apr_hash_get(provider_group_hash, provider_name,
95                                          APR_HASH_KEY_STRING);
96
97     if (!provider_version_hash) {
98         provider_version_hash = apr_hash_make(pool);
99         apr_hash_set(provider_group_hash, provider_name, APR_HASH_KEY_STRING,
100                      provider_version_hash);
101         
102     }
103
104     /* just set it. no biggy if it was there before. */
105     apr_hash_set(provider_version_hash, provider_version, APR_HASH_KEY_STRING,
106                  provider);
107
108     return APR_SUCCESS;
109 }
110
111 AP_DECLARE(void *) ap_lookup_provider(const char *provider_group,
112                                       const char *provider_name,
113                                       const char *provider_version)
114 {
115     apr_hash_t *provider_group_hash, *provider_name_hash;
116
117     if (global_providers == NULL) {
118         return NULL;
119     }
120
121     provider_group_hash = apr_hash_get(global_providers, provider_group,
122                                        APR_HASH_KEY_STRING);
123
124     if (provider_group_hash == NULL) {
125         return NULL;
126     }
127
128     provider_name_hash = apr_hash_get(provider_group_hash, provider_name,
129                                       APR_HASH_KEY_STRING);
130
131     if (provider_name_hash == NULL) {
132         return NULL;
133     }
134
135     return apr_hash_get(provider_name_hash, provider_version,
136                         APR_HASH_KEY_STRING);
137 }