• 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
    };


  • 相关阅读:
    解决后退网页已过期或刷新询问是否重新提交表单的问题
    一行代码获取中文星期
    单例模式弹出窗体实现
    JAVA实现冒泡排序
    关于BufferedWriter.write超过30W条数据写入过慢问题。
    Ibatis的简单介绍
    链接注入(便于跨站请求伪造)(AppScan扫描结果)
    会话标识未更新(AppScan扫描结果)
    跨站点脚本编制实例(AppScan扫描结果)
    深入Java核心 Java内存分配原理精讲
  • 原文地址:https://www.cnblogs.com/diylab/p/1916262.html
Copyright © 2020-2023  润新知