echo ""; echo ""; echo ""; echo ""; if(!is_admin){echo "";} » Apache中的Hook(挂钩)剖析(3) 仲子说

2008-04-25

Apache中的Hook(挂钩)剖析(3)

Posted in Apache at 18:10 Author:仲远

标签:

5.5.7 ????

???????????????????????????????????????????——????????????????????????????????Hook_A?????????????????????????????????????????Hook_A???????????????????Apache??????????????????????????????????????????????????????????

???????????????????????????AP_DECLARE_HOOK????????????????????

AP_DECLARE_HOOK(int , optional_hook , (request_rec *r , int n))

???????????????????????????????????????????????????????AP_HOOK_STRUCT????????????????????????????????????????????????AP_HOOK_STRUCT???????????????

??????????????????AP_IMPLEMENT_HOOK_RUN_ALL?????AP_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL

5.5.7.1??????

?Apache2.0??????????????????Apache????????Apache???????????????s_phOptionalHooks?s_phOptionalFunctions???????????????????????S_phOptionalHooks??????????????????Key???????????????????Value????????????Apr_hooks.c??Apache??????????apr_optional_hook_get?apr_optional_hook_add?

apr_optional_hook_get????????s_phOptionalHooks????????????????????????????NULL?

apr_optional_hook_add??????????

APU_DECLARE(void) apr_optional_hook_add(const char *szName,void (*pfn)(void),

                    const char * const *aszPre,

                    const char * const *aszSucc,int nOrder)

??????????szName????????????????????pfn???aszPre?aszSucc??nOrder???????????

?????????????????????szName??????????????apr_optional_hook_get???????????????????????????????NULL????????????????????????????????????szName????????????

??szName??????????????apr_array_push????????????

????????????????apr_LINK__optional_t??????APR_DECLARE_EXTERNAL_HOOK??????apr_LINK__optional_t?????????

typedef struct ap_LINK_optional_t

    {

         ap_HOOK_optional_t *pFunc;

         const char *szName;

         const char * const *aszPredecessors;

         const char * const *aszSuccessors;

         int nOrder;

    } ap_LINK_optional_t;

5.5.7.2 ??????(APR_OPTIONAL_HOOK)

?????????????????ap_hook_name????????????????????????????????????????AP_HOOK_STRUCT?????????????????????????????????Apache???????????APR_OPTIONAL_HOOK?????

APR_OPTIONAL_HOOK????ap_optional_hooks.h??

#define APR_OPTIONAL_HOOK(ns,name,pfn,aszPre,aszSucc,nOrder) do { \

 ns##_HOOK_##name##_t *apu__hook = pfn; \

 apr_optional_hook_add(#name,(void (*)(void))apu__hook,aszPre, aszSucc, nOrder); \

} while (0)

5.5.7.3 APR_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL

????????????VOID?FIRST?ALL????????????????????ALL????APR_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL????????

#define APR_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL(ns,link,ret,name,args_decl,args_use,ok,decline) \

link##_DECLARE(ret) ns##_run_##name args_decl \

    { \

    ns##_LINK_##name##_t *pHook; \

    int n; \

    ret rv; \

    apr_array_header_t *pHookArray=apr_optional_hook_get(#name); \

    if(!pHookArray) \

     return ok; \

    pHook=(ns##_LINK_##name##_t *)pHookArray->elts; \

    for(n=0 ; n < pHookArray->nelts ; ++n) \

     { \

     rv=(pHook[n].pFunc)args_use; \

\

     if(rv != ok && rv != decline) \

         return rv; \

     } \

    return ok; \

    }

?status??mod_status.c????????status_hook?????????????????

APR_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL(ap, STATUS, int, status_hook,

                                    (request_rec *r, int flags),

                                    (r, flags),

                                    OK, DECLINED)

     ?????????ap_run_status_hook???????????????????

     AP_DECLARE(int) ap_run_status_hook(request_rec* r,int flags)

     {

         ap_LINK_status_hook_t *pHook;

         int n;

         int rv;

    apr_array_header_t *pHookArray=apr_optional_hook_get(status_name);

    if(!pHookArray)

return ok;

    pHook=(ap_LINK_status_hook_t *)pHookArray->elts;

    for(n=0 ; n < pHookArray->nelts ; ++n)

{

rv=(pHook[n].pFunc)(r,flags);

if(rv != ok && rv != decline)

    return rv;

}

    return ok;

     }

5.5.8 ????

????????????????????????????Apache?????????????????????????????????DSO????????????????????????DSO?????????????????????????????????????DSO??????

?????????????????????Apache????????????????????Apache??????????????????????????????????????????????????????????????????????????????

??????????????????????????????????

5.5.8.1.???????

???????????APR_DECLARE_OPTIONAL_FN???????????????optional_fun????????int??????????????????????

APR_DECLARE_OPTIONAL_FN(int,optional_fun,(const char* params))

APR_DECLARE_OPTIONAL_FN??????

 #define APR_DECLARE_OPTIONAL_FN(ret,name,args) \

typedef ret (APR_OPTIONAL_FN_TYPE(name)) args

?????????????????????????apr_OFN_optional_fun_t????????

typedef int (apr_OFN_optional_fun_t)(const char* params)

?????????????????????????????????????????

int optional_fun(const char* params)

{

       ……

       return 0;

}

5.5.8.2.???????

?????Apache???????????????Apache?????????????s_phOptionalFunctions????????????????????????????????Apache????????s_phOptionalFunctions???????????????APR_REGISTER_OPTIONAL_FN???APR_REGISTER_OPTIONAL_FN?????

#define APR_REGISTER_OPTIONAL_FN(name) do { \

 APR_OPTIONAL_FN_TYPE(name) *apu__opt = name; \

 apr_dynamic_fn_register(#name,(apr_opt_fn_t *)apu__opt); \

} while(0)

???????????apr_dynamic_fn_register????????????Apache????????????s_phOptionalFunctions??????apr_dynamic_fn_register??????apr_register_optional_fn?apr_dynamic_fn_retrieve?apr_retrieve_optional_fn?????apr_retrieve_optional_fn?apr_register_optional_fn?Apache2.0??????????????

apr_dynamic_fn_register??????

APU_DECLARE_NONSTD(void) apr_dynamic_fn_register(const char *szName,

                                                  apr_opt_fn_t *pfn)

??szName?????????pfn??????????????s_phOptionalFunctions???????????????apr_hash_set????????

apr_dynamic_fn_retrieve?????

APU_DECLARE(apr_opt_fn_t *) apr_dynamic_fn_retrieve(const char *szName)

??????????????????????

??????????????????????Apache?????????????????APR_REGISTER_OPTIONAL_FN?APR_RETRIEVE_OPTIONAL_FN?

??optional_fun????????????

APR_REGISTER_OPTIONAL_FN(optional_fun);

???????????????????????????????

APR_OPTIONAL_FN_TYPE(some_fn) *pfn;

pfn=APR_RETRIEVE_OPTIONAL_FN(some_fn);

5.5.8.3.???????

5.5.9????

5.5.10??????

?????????????????????????????????????????????????????????

???????????????????????????????????????????????????????register_hooks???????????????????????????????????????????ap_hook_xxx???????????????abc?xyz?

?????????????????????????????????????????????????????ap_run_xxx?????????????????????????????????????????

???????????????????????????

???????????????????????register_hook?????????????????????????????????????????register_hooks????????????register_hooks?

AP_DECLARE_DATA module core_module = {

    STANDARD20_MODULE_STUFF,

    create_core_dir_config,       /* create per-directory config structure */

    merge_core_dir_configs,       /* merge per-directory config structures */

    create_core_server_config,    /* create per-server config structure */

    merge_core_server_configs,    /* merge per-server config structures */

    core_cmds,                    /* command apr_table_t */

    register_hooks                /* register hooks */

};

????register_hooks??????

static void register_hooks(apr_pool_t *p)

{

    ap_hook_create_connection(core_create_conn, NULL, NULL,

                              APR_HOOK_REALLY_LAST);

    ap_hook_pre_connection(core_pre_connection, NULL, NULL,

                           APR_HOOK_REALLY_LAST);

    ap_hook_post_config(core_post_config,NULL,NULL,APR_HOOK_REALLY_FIRST);

    ap_hook_translate_name(ap_core_translate,NULL,NULL,APR_HOOK_REALLY_LAST);

    ap_hook_map_to_storage(core_map_to_storage,NULL,NULL,APR_HOOK_REALLY_LAST);

    ap_hook_open_logs(ap_open_logs,NULL,NULL,APR_HOOK_REALLY_FIRST);

    ap_hook_handler(default_handler,NULL,NULL,APR_HOOK_REALLY_LAST);

    ap_hook_type_checker(do_nothing,NULL,NULL,APR_HOOK_REALLY_LAST);

    ap_hook_fixups(core_override_type,NULL,NULL,APR_HOOK_REALLY_FIRST);

    ap_hook_access_checker(do_nothing,NULL,NULL,APR_HOOK_REALLY_LAST);

    ap_hook_create_request(core_create_req, NULL, NULL, APR_HOOK_MIDDLE);

    APR_OPTIONAL_HOOK(proxy, create_req, core_create_proxy_req, NULL, NULL,

                      APR_HOOK_MIDDLE);

    ap_hook_pre_mpm(ap_create_scoreboard, NULL, NULL, APR_HOOK_MIDDLE);

……

}

???????????????????????????????????????????

本文可以自由转载,转载时请保留全文并注明出处:
转载自仲子说 [ http://www.wangzhongyuan.com/ ]
原文链接:

Leave a Comment

*
To prove you're a person (not a spam script), type the security text shown in the picture. Click here to regenerate some new text.
Click to hear an audio file of the anti-spam word