summaryrefslogtreecommitdiff
path: root/hooks/apr_hooks.c
diff options
context:
space:
mode:
authorben <ben@13f79535-47bb-0310-9956-ffa450edef68>2001-01-02 17:41:49 +0000
committerben <ben@13f79535-47bb-0310-9956-ffa450edef68>2001-01-02 17:41:49 +0000
commit3c3a25f63a9403a6b3fa071695f4885ff5599973 (patch)
tree20c5c6732b2afc4f6c58b77f9fc1bd6f8de1e1f5 /hooks/apr_hooks.c
parentf23258897ac22ce330dcd9beaa70aef3e5d4863c (diff)
downloadlibapr-util-3c3a25f63a9403a6b3fa071695f4885ff5599973.tar.gz
Generic hooks (and a demo content filter module).
git-svn-id: http://svn.apache.org/repos/asf/apr/apr-util/trunk@58020 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'hooks/apr_hooks.c')
-rw-r--r--hooks/apr_hooks.c57
1 files changed, 53 insertions, 4 deletions
diff --git a/hooks/apr_hooks.c b/hooks/apr_hooks.c
index 709c2d31..90109404 100644
--- a/hooks/apr_hooks.c
+++ b/hooks/apr_hooks.c
@@ -60,6 +60,7 @@
#include "apr_tables.h"
#include "apr.h"
#include "ap_hooks.h"
+#include "apr_hash.h"
#if APR_HAVE_STRINGS_H
#include <strings.h>
@@ -71,7 +72,7 @@
APU_DECLARE_DATA apr_pool_t *ap_global_hook_pool = NULL;
APU_DECLARE_DATA int ap_debug_module_hooks = 0;
-APU_DECLARE_DATA const char *ap_debug_module_name = NULL;
+APU_DECLARE_DATA const char *ap_current_hooking_module = NULL;
/* NB: This must echo the LINK_##name structure */
typedef struct
@@ -178,7 +179,8 @@ static TSort *tsort(TSort *pData,int nItems)
return pHead;
}
-static apr_array_header_t *sort_hook(apr_array_header_t *pHooks,const char *szName)
+static apr_array_header_t *sort_hook(apr_array_header_t *pHooks,
+ const char *szName)
{
apr_pool_t *p;
TSort *pSort;
@@ -212,7 +214,7 @@ typedef struct
} HookSortEntry;
APU_DECLARE(void) ap_hook_sort_register(const char *szHookName,
- apr_array_header_t **paHooks)
+ apr_array_header_t **paHooks)
{
HookSortEntry *pEntry;
@@ -233,6 +235,8 @@ APU_DECLARE(void) ap_sort_hooks()
}
}
+static apr_hash_t *s_phGenericHooks;
+
APU_DECLARE(void) ap_hook_deregister_all(void)
{
int n;
@@ -242,10 +246,11 @@ APU_DECLARE(void) ap_hook_deregister_all(void)
*pEntry->paHooks=NULL;
}
s_aHooksToSort=NULL;
+ s_phGenericHooks=NULL;
}
APU_DECLARE(void) ap_show_hook(const char *szName,const char * const *aszPre,
- const char * const *aszSucc)
+ const char * const *aszSucc)
{
int nFirst;
@@ -277,6 +282,50 @@ APU_DECLARE(void) ap_show_hook(const char *szName,const char * const *aszPre,
fputc('\n',stdout);
}
+/* Generic hook support */
+
+AP_DECLARE_EXTERNAL_HOOK(APU,void,_generic,(void))
+
+APU_DECLARE(apr_array_header_t *) ap_generic_hook_get(const char *szName)
+{
+ apr_array_header_t **ppArray;
+
+ if(!s_phGenericHooks)
+ return NULL;
+ ppArray=apr_hash_get(s_phGenericHooks,szName,strlen(szName));
+ if(!ppArray)
+ return NULL;
+ return *ppArray;
+}
+
+APU_DECLARE(void) ap_hook_generic(const char *szName,void (*pfn)(void),
+ const char * const *aszPre,
+ const char * const *aszSucc,int nOrder)
+{
+ apr_array_header_t *pArray=ap_generic_hook_get(szName);
+ LINK__generic *pHook;
+
+ if(!pArray) {
+ apr_array_header_t **ppArray;
+
+ pArray=apr_make_array(ap_global_hook_pool,1,sizeof(LINK__generic));
+ if(!s_phGenericHooks)
+ s_phGenericHooks=apr_make_hash(ap_global_hook_pool);
+ ppArray=apr_palloc(ap_global_hook_pool,sizeof *ppArray);
+ *ppArray=pArray;
+ apr_hash_set(s_phGenericHooks,szName,strlen(szName),ppArray);
+ ap_hook_sort_register(szName,ppArray);
+ }
+ pHook=apr_push_array(pArray);
+ pHook->pFunc=pfn;
+ pHook->aszPredecessors=aszPre;
+ pHook->aszSuccessors=aszSucc;
+ pHook->nOrder=nOrder;
+ pHook->szName=ap_current_hooking_module;
+ if(ap_debug_module_hooks)
+ ap_show_hook(szName,aszPre,aszSucc);
+}
+
#if 0
void main()
{