Return-Path: Delivered-To: apmail-httpd-cvs-archive@www.apache.org Received: (qmail 23209 invoked from network); 9 Sep 2005 12:24:04 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 9 Sep 2005 12:24:04 -0000 Received: (qmail 21036 invoked by uid 500); 9 Sep 2005 12:24:04 -0000 Delivered-To: apmail-httpd-cvs-archive@httpd.apache.org Received: (qmail 21008 invoked by uid 500); 9 Sep 2005 12:24:03 -0000 Mailing-List: contact cvs-help@httpd.apache.org; run by ezmlm Precedence: bulk Reply-To: dev@httpd.apache.org list-help: list-unsubscribe: List-Post: List-Id: Delivered-To: mailing list cvs@httpd.apache.org Received: (qmail 20994 invoked by uid 99); 9 Sep 2005 12:24:03 -0000 X-ASF-Spam-Status: No, hits=-9.8 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [209.237.227.194] (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.29) with SMTP; Fri, 09 Sep 2005 05:24:02 -0700 Received: (qmail 23189 invoked by uid 65534); 9 Sep 2005 12:24:02 -0000 Message-ID: <20050909122402.23188.qmail@minotaur.apache.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r279750 - in /httpd/httpd/trunk: CHANGES include/ap_provider.h server/provider.c Date: Fri, 09 Sep 2005 12:24:01 -0000 To: cvs@httpd.apache.org From: jim@apache.org X-Mailer: svnmailer-1.0.5 X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Author: jim Date: Fri Sep 9 05:23:56 2005 New Revision: 279750 URL: http://svn.apache.org/viewcvs?rev=279750&view=rev Log: New provider function, ap_list_provider_names(), which lists all available registered providers for a specified group and version number. Visible change so add CHANGES entry. Modified: httpd/httpd/trunk/CHANGES httpd/httpd/trunk/include/ap_provider.h httpd/httpd/trunk/server/provider.c Modified: httpd/httpd/trunk/CHANGES URL: http://svn.apache.org/viewcvs/httpd/httpd/trunk/CHANGES?rev=279750&r1=279749&r2=279750&view=diff ============================================================================== --- httpd/httpd/trunk/CHANGES [utf-8] (original) +++ httpd/httpd/trunk/CHANGES [utf-8] Fri Sep 9 05:23:56 2005 @@ -2,6 +2,9 @@ Changes with Apache 2.3.0 [Remove entries to the current 2.0 and 2.2 section below, when backported] + *) New provider function to list all available provider names in a + specific group and version (ap_list_provider_names). [Jim Jagielski] + *) httpd.exe/apachectl -V: display the DYNAMIC_MODULE_LIMIT setting, as in 1.3. [Jeff Trawick] Modified: httpd/httpd/trunk/include/ap_provider.h URL: http://svn.apache.org/viewcvs/httpd/httpd/trunk/include/ap_provider.h?rev=279750&r1=279749&r2=279750&view=diff ============================================================================== --- httpd/httpd/trunk/include/ap_provider.h (original) +++ httpd/httpd/trunk/include/ap_provider.h Fri Sep 9 05:23:56 2005 @@ -28,6 +28,11 @@ #include "ap_config.h" +typedef struct { + const char *provider_name; +} ap_list_provider_names_t; + + /** * This function is used to register a provider with the global * provider pool. @@ -55,6 +60,19 @@ AP_DECLARE(void *) ap_lookup_provider(const char *provider_group, const char *provider_name, const char *provider_version); + +/** + * This function is used to retrieve a list (array) of provider + * names from the specified group with the specified version. + * @param pool The pool to create any storage from + * @param provider_group The group to look for this provider in + * @param provider_version The version for the provider + * @return pointer to array of ap_list_provider_names_t of provider names (could be empty) + */ + +AP_DECLARE(apr_array_header_t *) ap_list_provider_names(apr_pool_t *pool, + const char *provider_group, + const char *provider_version); #endif /** @} */ Modified: httpd/httpd/trunk/server/provider.c URL: http://svn.apache.org/viewcvs/httpd/httpd/trunk/server/provider.c?rev=279750&r1=279749&r2=279750&view=diff ============================================================================== --- httpd/httpd/trunk/server/provider.c (original) +++ httpd/httpd/trunk/server/provider.c Fri Sep 9 05:23:56 2005 @@ -16,14 +16,19 @@ #include "apr_pools.h" #include "apr_hash.h" +#include "apr_tables.h" +#include "apr_strings.h" #include "ap_provider.h" static apr_hash_t *global_providers = NULL; +static apr_hash_t *global_providers_names = NULL; + static apr_status_t cleanup_global_providers(void *ctx) { global_providers = NULL; + global_providers_names = NULL; return APR_SUCCESS; } @@ -33,15 +38,16 @@ const char *provider_version, const void *provider) { - apr_hash_t *provider_group_hash; - apr_hash_t *provider_version_hash; + apr_hash_t *provider_group_hash, *provider_version_hash; if (global_providers == NULL) { global_providers = apr_hash_make(pool); + global_providers_names = apr_hash_make(pool);; apr_pool_cleanup_register(pool, NULL, cleanup_global_providers, apr_pool_cleanup_null); } + /* First, deal with storing the provider away */ provider_group_hash = apr_hash_get(global_providers, provider_group, APR_HASH_KEY_STRING); @@ -66,6 +72,31 @@ apr_hash_set(provider_version_hash, provider_version, APR_HASH_KEY_STRING, provider); + /* Now, tuck away the provider names in an easy-to-get format */ + provider_group_hash = apr_hash_get(global_providers_names, provider_group, + APR_HASH_KEY_STRING); + + if (!provider_group_hash) { + provider_group_hash = apr_hash_make(pool); + apr_hash_set(global_providers_names, provider_group, APR_HASH_KEY_STRING, + provider_group_hash); + + } + + provider_version_hash = apr_hash_get(provider_group_hash, provider_version, + APR_HASH_KEY_STRING); + + if (!provider_version_hash) { + provider_version_hash = apr_hash_make(pool); + apr_hash_set(provider_group_hash, provider_version, APR_HASH_KEY_STRING, + provider_version_hash); + + } + + /* just set it. no biggy if it was there before. */ + apr_hash_set(provider_version_hash, provider_name, APR_HASH_KEY_STRING, + provider_name); + return APR_SUCCESS; } @@ -95,4 +126,40 @@ return apr_hash_get(provider_name_hash, provider_version, APR_HASH_KEY_STRING); +} + +AP_DECLARE(apr_array_header_t *) ap_list_provider_names(apr_pool_t *pool, + const char *provider_group, + const char *provider_version) +{ + apr_array_header_t *ret = apr_array_make(pool, 10, sizeof(ap_list_provider_names_t)); + ap_list_provider_names_t *entry; + apr_hash_t *provider_group_hash, *h; + apr_hash_index_t *hi; + char *val, *key; + + if (global_providers_names == NULL) { + return ret; + } + + provider_group_hash = apr_hash_get(global_providers_names, provider_group, + APR_HASH_KEY_STRING); + + if (provider_group_hash == NULL) { + return ret; + } + + h = apr_hash_get(provider_group_hash, provider_version, + APR_HASH_KEY_STRING); + + if (h == NULL) { + return ret; + } + + for (hi = apr_hash_first(pool, h); hi; hi = apr_hash_next(hi)) { + apr_hash_this(hi, (void *)&key, NULL, (void *)&val); + entry = apr_array_push(ret); + entry->provider_name = apr_pstrdup(pool, val); + } + return ret; }