这是我的页面头部

apache2 模块编写

本文将介绍以下三种库:
1)动态连接库(动态加载模式)
2)动态连接库(预先加载模式)
3)静态库(编译时连接模式)
模块的函数调用流程:

static const cmd_rec my_cmds[] = {
AP_INIT_TAKE1("MyFirstDirective", my_first_cmd_func, my_ptr, OR_ALL,
"This is My First Directive"),
/* more directives as applicable */
{ NULL }
} ;
module MODULE_VAR_EXPORT module_name_module =
{
    STANDARD20_MODULE_STUFF,
    
/* create per-directory config structures */
    
/* merge per-directory config structures  */
    
/* create per-server config structures    */
    
/* merge per-server config structures     */
    
/* command handlers */
    
/* handlers */
    
/* register hooks */
};

 

 

/* *
 * filename :ap_config.h
 * Apache Core dso variables are declared with AP_MODULE_DECLARE_DATA.
 * This assures the appropriate indirection is invoked at compile time.
 *
 * @note AP_DECLARE_DATA extern type apr_variable; syntax is required for
 * declarations within headers to properly import the variable.
 * @code
 * AP_DECLARE_DATA type apr_variable
 * @endcode
 
*/
#define AP_DECLARE_DATA             __declspec(dllexport)

 

 

 

/**
 * file http_config.h 
 * Module structures.  Just about everything is dispatched through
 * these, directly or indirectly (through the command and handler
 * tables).
 
*/
typedef 
struct module_struct module;
struct module_struct {
    
/** API version, *not* module version; check that module is 
     * compatible with this version of the server.
     
*/
    
int version;
    
/** API minor version. Provides API feature milestones. Not checked 
     *  during module init 
*/
    
int minor_version;
    
/** Index to this modules structures in config vectors.  */
    
int module_index;

    
/** The name of the module's C file */
    
const char *name;
    
/** The handle for the DSO.  Internal use only */
    
void *dynamic_load_handle;

    
/** A pointer to the next module in the list
     *  @defvar module_struct *next 
*/
    
struct module_struct *next;

    
/** Magic Cookie to identify a module structure;  It's mainly 
     *  important for the DSO facility (see also mod_so).  
*/
    unsigned 
long magic;

    
/** Function to allow MPMs to re-write command line arguments.  This
     *  hook is only available to MPMs.
     *  @param The process that the server is running in.
     
*/
    
void (*rewrite_args) (process_rec *process);
    
/** Function to allow all modules to create per directory configuration
     *  structures.
     *  @param p The pool to use for all allocations.
     *  @param dir The directory currently being processed.
     *  @return The per-directory structure created
     
*/
    
void *(*create_dir_config) (apr_pool_t *p, char *dir);
    
/** Function to allow all modules to merge the per directory configuration
     *  structures for two directories.
     *  @param p The pool to use for all allocations.
     *  @param base_conf The directory structure created for the parent directory.
     *  @param new_conf The directory structure currently being processed.
     *  @return The new per-directory structure created
     
*/
    
void *(*merge_dir_config) (apr_pool_t *p, void *base_conf, void *new_conf);
    
/** Function to allow all modules to create per server configuration
     *  structures.
     *  @param p The pool to use for all allocations.
     *  @param s The server currently being processed.
     *  @return The per-server structure created
     
*/
    
void *(*create_server_config) (apr_pool_t *p, server_rec *s);
    
/** Function to allow all modules to merge the per server configuration
     *  structures for two servers.
     *  @param p The pool to use for all allocations.
     *  @param base_conf The directory structure created for the parent directory.
     *  @param new_conf The directory structure currently being processed.
     *  @return The new per-directory structure created
     
*/
    
void *(*merge_server_config) (apr_pool_t *p, void *base_conf, 
                                  
void *new_conf);

    
/** A command_rec table that describes all of the directives this module
     * defines. 
*/
    
const command_rec *cmds;

    
/** A hook to allow modules to hook other points in the request processing.
     *  In this function, modules should call the ap_hook_*() functions to
     *  register an interest in a specific step in processing the current
     *  request.
     *  @param p the pool to use for all allocations
     
*/
    
void (*register_hooks) (apr_pool_t *p);
};

 

 

 

 

 

 

    ap_mod_list *ml;
ap_cfg_getline(
char *buf, size_t bufsize, ap_configfile_t *cfp);

调用堆栈:
     libhttpd.dll
!load_module(cmd_parms_struct * cmd=0x0006fd0cvoid * dummy=0x0006fb24const char * modname=0x009fb940const char * filename=0x009fb958)  行158    C
     libhttpd.dll
!invoke_cmd(const command_struct * cmd=0x6ff3cee8, cmd_parms_struct * parms=0x0006fd0cvoid * mconfig=0x0006fb24const char * args=0x009f5834)  行800 + 0x18 字节    C
>    libhttpd.dll!execute_now(char * cmd_line=0x009fb8d0const char * args=0x009f580b, cmd_parms_struct * parms=0x0006fd0c, apr_pool_t * p=0x0090b940, apr_pool_t * ptemp=0x009e2680, ap_directive_t * * sub_tree=0x0006fb24, ap_directive_t * parent=0x00000000)  行1441 + 0x15 字节    C
     libhttpd.dll
!ap_build_config_sub(apr_pool_t * p=0x0090b940, apr_pool_t * temp_pool=0x009e2680const char * l=0x009f5800, cmd_parms_struct * parms=0x0006fd0c, ap_directive_t * * current=0x0006fb74, ap_directive_t * * curr_parent=0x0006fb78, ap_directive_t * * conftree=0x6ff5178c)  行1013 + 0x23 字节    C
     libhttpd.dll
!ap_build_config(cmd_parms_struct * parms=0x0006fd0c, apr_pool_t * p=0x0090b940, apr_pool_t * temp_pool=0x009e2680, ap_directive_t * * conftree=0x6ff5178c)  行1225 + 0x21 字节    C
     libhttpd.dll
!process_resource_config_nofnmatch(server_rec * s=0x009b7b10const char * fname=0x009e8490, ap_directive_t * * conftree=0x6ff5178c, apr_pool_t * p=0x0090b940, apr_pool_t * ptemp=0x009e2680, unsigned int depth=0x00000000)  行1634 + 0x15 字节    C
     libhttpd.dll
!ap_process_resource_config(server_rec * s=0x009b7b10const char * fname=0x009e8490, ap_directive_t * * conftree=0x6ff5178c, apr_pool_t * p=0x0090b940, apr_pool_t * ptemp=0x009e2680)  行1667 + 0x1b 字节    C
     libhttpd.dll
!ap_read_config(process_rec * process=0x009b30d0, apr_pool_t * ptemp=0x009e2680const char * filename=0x00404d10, ap_directive_t * * conftree=0x6ff5178c)  行2026 + 0x19 字节    C
     httpd.exe
!main(int argc=0x00000001const char * const * argv=0x00908b90)  行632 + 0x19 字节    C
     httpd.exe
!__tmainCRTStartup()  行586 + 0x19 字节    C
     httpd.exe
!mainCRTStartup()  行403    C

 

 

ap_config_hash

静态组件的编译和调用:


//modules.c
AP_DECLARE_DATA module *ap_prelinked_modules[] = {
  
&core_module,
  
&win32_module,
  
&mpm_winnt_module,
  
&http_module,
  
&so_module,
  NULL
};

ap_module_symbol_t ap_prelinked_module_symbols[] 
= {
  {
"core_module"&core_module},
  {
"win32_module"&win32_module},
  {
"mpm_winnt_module"&mpm_winnt_module},
  {
"http_module"&http_module},
  {
"so_module"&so_module},
  {NULL, NULL}
};

AP_DECLARE_DATA module 
*ap_preloaded_modules[] = {
  
&core_module,
  
&win32_module,
  
&mpm_winnt_module,
  
&http_module,
  
&so_module,
  NULL
};


posted @ 2010-12-24 18:05  范晨鹏  阅读(739)  评论(0编辑  收藏  举报