blob: 07f28cb84380d125f21ec02dc015a908e9cc1288 [file] [log] [blame]
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* 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 acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" 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 name, 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
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
#ifndef APACHE_AP_HOOKS_H
#define APACHE_AP_HOOKS_H
#include "ap_config.h"
/* For apr_array_header_t */
#include "apr_lib.h"
/**
* @package Apache hooks functions
*/
#define AP_DECLARE_HOOK(ret,name,args) \
typedef ret HOOK_##name args; \
API_EXPORT(void) ap_hook_##name(HOOK_##name *pf,const char * const *aszPre, \
const char * const *aszSucc,int nOrder); \
API_EXPORT(ret) ap_run_##name args; \
typedef struct _LINK_##name \
{ \
HOOK_##name *pFunc; \
const char *szName; \
const char * const *aszPredecessors; \
const char * const *aszSuccessors; \
int nOrder; \
} LINK_##name;
#define AP_HOOK_STRUCT(members) \
static struct { members } _hooks;
#define AP_HOOK_LINK(name) \
apr_array_header_t *link_##name;
#define AP_IMPLEMENT_HOOK_BASE(name) \
API_EXPORT(void) ap_hook_##name(HOOK_##name *pf,const char * const *aszPre, \
const char * const *aszSucc,int nOrder) \
{ \
LINK_##name *pHook; \
if(!_hooks.link_##name) \
{ \
_hooks.link_##name=apr_make_array(ap_global_hook_pool,1,sizeof(LINK_##name)); \
ap_hook_sort_register(#name,&_hooks.link_##name); \
} \
pHook=apr_push_array(_hooks.link_##name); \
pHook->pFunc=pf; \
pHook->aszPredecessors=aszPre; \
pHook->aszSuccessors=aszSucc; \
pHook->nOrder=nOrder; \
pHook->szName=ap_debug_module_name; \
if(ap_debug_module_hooks) \
ap_show_hook(#name,aszPre,aszSucc); \
}
/* RUN_ALL runs to the first one to return other than ok or decline
RUN_FIRST runs to the first one to return other than decline
VOID runs all
*/
#define AP_IMPLEMENT_HOOK_VOID(name,args_decl,args_use) \
AP_IMPLEMENT_HOOK_BASE(name) \
API_EXPORT(void) ap_run_##name args_decl \
{ \
LINK_##name *pHook; \
int n; \
\
if(!_hooks.link_##name) \
return; \
\
pHook=(LINK_##name *)_hooks.link_##name->elts; \
for(n=0 ; n < _hooks.link_##name->nelts ; ++n) \
pHook[n].pFunc args_use; \
}
/* FIXME: note that this returns ok when nothing is run. I suspect it should
really return decline, but that breaks Apache currently - Ben
*/
#define AP_IMPLEMENT_HOOK_RUN_ALL(ret,name,args_decl,args_use,ok,decline) \
AP_IMPLEMENT_HOOK_BASE(name) \
API_EXPORT(ret) ap_run_##name args_decl \
{ \
LINK_##name *pHook; \
int n; \
ret rv; \
\
if(!_hooks.link_##name) \
return ok; \
\
pHook=(LINK_##name *)_hooks.link_##name->elts; \
for(n=0 ; n < _hooks.link_##name->nelts ; ++n) \
{ \
rv=pHook[n].pFunc args_use; \
\
if(rv != ok && rv != decline) \
return rv; \
} \
return ok; \
}
#define AP_IMPLEMENT_HOOK_RUN_FIRST(ret,name,args_decl,args_use,decline) \
AP_IMPLEMENT_HOOK_BASE(name) \
API_EXPORT(ret) ap_run_##name args_decl \
{ \
LINK_##name *pHook; \
int n; \
ret rv; \
\
if(!_hooks.link_##name) \
return decline; \
\
pHook=(LINK_##name *)_hooks.link_##name->elts; \
for(n=0 ; n < _hooks.link_##name->nelts ; ++n) \
{ \
rv=pHook[n].pFunc args_use; \
\
if(rv != decline) \
return rv; \
} \
return decline; \
}
/* Hook orderings */
#define AP_HOOK_REALLY_FIRST (-10)
#define AP_HOOK_FIRST 0
#define AP_HOOK_MIDDLE 10
#define AP_HOOK_LAST 20
#define AP_HOOK_REALLY_LAST 30
/**
* The global pool used to allocate any memory needed by the hooks.
* @defvar apr_pool_t *ap_global_hook_pool
*/
extern API_VAR_EXPORT apr_pool_t *ap_global_hook_pool;
/**
* A global variable to determine if debugging information about the
* hooks functions should be printed
* @defvar apr_pool_t *ap_debug_module_hooks
*/
extern API_VAR_EXPORT int ap_debug_module_hooks;
/**
* The name of the module that is currently registering a function
* @defvar apr_pool_t *ap_debug_module_name
*/
extern API_VAR_EXPORT const char *ap_debug_module_name;
/**
* Register a hook function to be sorted
* @param szHookName The name of the Hook the function is registered for
* @param aHooks The array which stores all of the functions for this hook
* @deffunc void ap_hook_sort_register(const char *szHookName, ap_arry_header_t **aHooks)
*/
API_EXPORT(void) ap_hook_sort_register(const char *szHookName,
apr_array_header_t **aHooks);
/**
* Sort all of the registerd functions for a given hook
* @deffunc void ap_sort_hooks(void)
*/
API_EXPORT(void) ap_sort_hooks(void);
/**
* Print all of the information about the current hook. This is used for
* debugging purposes.
* @param szName The name of the hook
* @param aszPre All of the functions in the predecessor array
* @param aszSucc All of the functions in the successor array
* @deffunc void ap_show_hook(const char *szName, const char *const *aszPre, const char *const *aszSucc)
*/
API_EXPORT(void) ap_show_hook(const char *szName,const char * const *aszPre,
const char * const *aszSucc);
/**
* Remove all currently registered functions.
* @deffunc void ap_hook_deregister_all(void)
*/
API_EXPORT(void) ap_hook_deregister_all(void);
#endif /* ndef(AP_HOOKS_H) */