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

2008-04-23

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

Posted in 转载, Apache at 22:44 Author:仲远

标签:

????????????????Apache??Hook?????????????????????????????

5.5 ??(HOOK)

5.5.1 ???????

?Apache1.3?????HTTP?????????????????????????????????????????????MIME??????????????Apache1.3???????????????????????????????HOOK?????????????????????????????????ap_check_user_i??????????????????????auth_checker?????????????????logger????????????????????????????????????????????????????????????????????????????????ap_check_user_id???????????????????????????NULL???????????????????????????????????module???????????????????????????????????????????????????

????Apache 2.0??????????????????apache??????????????“??????”??????(Hooks)????Hooks??????????????????????????Hooks?????????????????????????????????????????????????????

????????????????????Apache2.0?HTTP???????

????????Apache?HTTP?????????????????????????????????????????????????HTTP?????????????????????????????????URL?????????????????????????Apache????????????“??(HOOK)”????Apache???????????????????????????????HTTP????????????????????????????????HTTP???????????????????????????????????????????????????????????????HTTP????????????

??????????????????????a???????Hook2.?1??????b??????1?6?5???c?????1?4?3?6??????Apache????????????????????????????HTTP????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????Apache?????????????????????????????????????????????4??????????????????????????????1?2?3????????????????????????????????????????????????????????????2.0???????

5.5.2 ????

Apache?????????????????????????????????????????????apr_hook.h?apr_hook.c?????config.c????????

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

#define AP_DECLARE_HOOK(ret,name,args) \

    APR_DECLARE_EXTERNAL_HOOK(ap,AP,ret,name,args)

??????????ret?????????????name???????????args??????????????????bracket????????????????????????????????do_something??????(request_rec *r?int n)????

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

??AP_DECLARE_HOOK???????APR_DECLARE_EXTERNAL_HOOK?????????

#define APR_DECLARE_EXTERNAL_HOOK(ns,link,ret,name,args) \

typedef ret ns##_HOOK_##name##_t args; \

link##_DECLARE(void) ns##_hook_##name(ns##_HOOK_##name##_t *pf, \

                                      const char * const *aszPre, \

                                      const char * const *aszSucc, int nOrder); \

link##_DECLARE(ret) ns##_run_##name args; \

APR_IMPLEMENT_HOOK_GET_PROTO(ns,link,name); \

typedef struct ns##_LINK_##name##_t \

{ \

    ns##_HOOK_##name##_t *pFunc; \

    const char *szName; \

    const char * const *aszPredecessors; \

    const char * const *aszSuccessors; \

    int nOrder; \

} ns##_LINK_##name##_t;

????????????????????????Apache???????????????????????????????????????????“##”?##????????????????

APR_DECLARE_EXTERNAL_HOOK?????????????????????????????????????????post_config????Http_config.?Apache???post_config?????

AP_DECLARE_HOOK(int,post_config,(apr_pool_t *pconf,apr_pool_t *plog, apr_pool_t *ptemp,server_rec *s))????????????

APR_DECLARE_EXTERNAL_HOOK(ap,AP,int,post_config, (apr_pool_t *pconf,apr_pool_t *plog, apr_pool_t *ptemp,server_rec *s))??????

(1)?typedef ret ns##_HOOK_##name##_t args;

     ???????????post_config?????????????post_config?????????????

     typedef int ap_HOOK_post_config_t (apr_pool_t *pconf,apr_pool_t *plog,apr_pool_t *ptemp,server_rec *s);

(2)?link##_DECLARE(void) ns##_hook_##name(ns##_HOOK_##name##_t *pf, \

                                      const char * const *aszPre, \

                                      const char * const *aszSucc, int nOrder); \

???????????????????ns##_HOOK_##name##_t *pf?????????????????????????????????????????????????????aszPre?aszSucc???????????????NULL?????????????{“mod_mime.c”,NULL}?aszPre????????????????????????????aszSucc??????????????????????????post_config???????????

     AP_DECLARE(void) ap_hook_post_config(ap_HOOK_post_config* pf;

const char * const *aszPre,

const char * const *aszSucc,

int nOrder);

????????nOrder???????????????????????????????????????????????????????????????????????????????????????????????????????????nOrder??????????????????????????????????Apache???5??????APR_HOOK_REALLY_FIRST?APR_HOOK_FIRST?APR_HOOK_MIDDLE?APR_HOOK_LAST?APR_HOOK_REALLY_LAST???????

#define APR_HOOK_REALLY_FIRST    (-10)

#define APR_HOOK_FIRST            0

#define APR_HOOK_MIDDLE           10

#define APR_HOOK_LAST             20

#define APR_HOOK_REALLY_LAST      30

????????nOrder???????-10?30??????????????????????????????APR_HOOK_FIRST??APR_HOOK_REALLY_FIRST????????????????????APR_HOOK_LAST??APR_HOOK_REALLY_LAST???????????????????APR_HOOK_MIDDLE?

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

(3)?link##_DECLARE(ret) ns##_run_##name args; \

????????????????Apache??????????????????????????ap_run_hookname()??????????????????

????post_config???????????????ap_run_post_config()?

(4)?APR_IMPLEMENT_HOOK_GET_PROTO(ns,link,name); \

?????????

#define APR_IMPLEMENT_HOOK_GET_PROTO(ns,link,name) \

link##_DECLARE(apr_array_header_t *) ns##_hook_get_##name(void)

????????????????????????????????????????????ns?link??????????????????????????ap?AP?name???????????????AP_DECLARE(apr_array_header_t *) ap_hook_get_name(void)?????post_config????????????AP_DECLARE(apr_array_header_t *) ap_hook_get_post_config(void)???????Apache????????????

(5)?typedef struct ns##_LINK_##name##_t \

{ \

    ns##_HOOK_##name##_t *pFunc; \

    const char *szName; \

    const char * const *aszPredecessors; \

    const char * const *aszSuccessors; \

    int nOrder; \

} ns##_LINK_##name##_t;

?????????????????????????????????????????????????????????????????????post_config???????????????????????????????????????

typedef struct ap_LINK_post_config_t

{

    ap_HOOK_post_config_t *pFunc;

    const char *szName;

    const char * const *aszPredecessors;

    const char * const *aszSuccessors;

    int nOrder;

} ap_LINK_post_config_t;

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

5.5.3 ?????(APR_HOOK_LINK)

?Apache?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????UNIX???????????????????????????????

Apache????????????????pre_config?post_config?open_logs??child_init???????pre_connection?process_connection?create_request???Apache?????????????????????????????????????????????????post_config??????core.c?????????core_post_config??status??mod_status.c?????????status_init???include??mod_include.c??????????include_post_config?????????????????????????????????????????????????Apache??apr_array_header_t???????

???????????????????????apr_array_header_t???????????????????????????APR_HOOK_LINK(post_config)????????

apr_array_header_t *link_post_config;

????????post_config?????????????link_post_config????link_post_config????????????ap_LINK_post_config_t??????????????????????????ap_LINK_XXXX???????????????????????

5.5.4 ????(APR_HOOK_STRUCT)

???????????????Apache??????apr_array_header_t?????????????????????????????????config.c??Apache???header_parser?pre_config?post_config?open_logs?child_init??handler?quick_handler?optional_fn_retrieve???????????????????????????????????????????????Apache????????????????????????????????????????????????????????????????????????????????????

??Apache2.0???????????????????????????????“??”???Apache2.0????APR_HOOK_STRUCT?????????

#define APR_HOOK_STRUCT(members) \

static struct { members } _hooks;

???????????????????????_hook?????????????????????_hook??????config.c??APR_HOOK_STRUCT?????

APR_HOOK_STRUCT(

           APR_HOOK_LINK(header_parser)

           APR_HOOK_LINK(pre_config)

           APR_HOOK_LINK(post_config)

           APR_HOOK_LINK(open_logs)

           APR_HOOK_LINK(child_init)

           APR_HOOK_LINK(handler)

           APR_HOOK_LINK(quick_handler)

           APR_HOOK_LINK(optional_fn_retrieve)

)

?????????

static struct{

           apr_array_header_t *link_header_parser;

           apr_array_header_t *link_pre_config;

           apr_array_header_t *link_post_config;

           apr_array_header_t *link_open_logs;

           apr_array_header_t *link_child_init;

           apr_array_header_t *link_handler;

           apr_array_header_t *link_quick_handler;

           apr_array_header_t *link_optional_fn_retrieve;

}_hook;

?????????????????_hook??????????????????post_config????????????????????

    ap_LINK_post_config_t *pHook;

    if (!_hooks.link_post_config) {

        _hooks.link_post_config = apr_array_make(apr_hook_global_pool, 1,

                                                 sizeof(ap_LINK_post_config_t));

        apr_hook_sort_register(”post_config”, &_hooks.link_post_config);

    }

    pHook = apr_array_push(_hooks.link_post_config);

    pHook->pFunc = …;

    pHook->aszPredecessors = …;

    pHook->aszSuccessors = …;

    pHook->nOrder = …;

    pHook->szName = …;

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

(1)?_hook??????????????????????????????????????????????“????????????”?

(2)?_hook????static????????????????????????????????_hook?????_hook???????????????????????????????_hook??????????static?????????“??”????????

(3)????????????????post_config????????????post_config?????????????????_hook????????????????????????????????????????ap_hook_name?????????post_config????????ap_hook_post_config??????????????????????????????????????

static void register_hooks(apr_pool_t *p)

{

    ap_hook_handler(status_handler, NULL, NULL, APR_HOOK_MIDDLE);

    ap_hook_post_config(status_init, NULL, NULL, APR_HOOK_MIDDLE);

}

register_hooks???mod_status.c???????????????Apache????????handler?status_init???????????status_handler?status_init?

???????Apache???????????????ap_hook_handler?ap_hook_post_config?????????????????ap_hook_HOOKNAME????????????????????????????Apache?????????????????????????APR_IMPLEMENT_EXTERNAL_HOOK_BASE???

????
???????????????????????????????????????????Apache????????????Apache????????????Apache??????????????Apache??????????flydish1234 at sina.com.cn????!

本文可以自由转载,转载时请保留全文并注明出处:
转载自仲子说 [ 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