这是第一次尝试编写将mod_mmap_static
模块转换为Apache 2.0 时所学的课程。这绝不是确定的,在某些方面甚至可能都不正确,但这只是一个开始。
这些现在必须是类型,apr_status_t
并返回该类型的值。通常,APR_SUCCESS
除非有必要发信号通知清理错误,否则返回值将是
。请注意,即使您发出错误信号,也并非所有代码都会检查错误并采取措施。
现在应将其重命名,以更好地表明它们在整个过程中所处的位置。因此,名称从更改
mmap_init
为mmap_post_config
。通过的论点发生了根本变化,现在看起来像
apr_pool_t *p
apr_pool_t *plog
apr_pool_t *ptemp
server_rec *s
许多数据类型已移至APR中。这意味着某些名称已更改,例如上面显示的名称。以下是您可能需要进行的一些更改的简要列表。
pool
变成 apr_pool_t
table
变成 apr_table_t
新的体系结构使用一系列挂钩来调用您的函数。您需要通过新功能将这些添加到模块中static void register_hooks(void)
。一旦您了解需要完成的功能,该功能实际上就相当简单。在请求处理的某个阶段需要调用的每个函数都需要注册,而处理程序则不需要。可以在多个阶段添加函数,对于每个阶段,您都可以高度控制地指定将调用函数的相对顺序。
这是添加到的代码mod_mmap_static
:
static void register_hooks(void) { static const char * const aszPre[]={ "http_core.c",NULL }; ap_hook_post_config(mmap_post_config,NULL,NULL,HOOK_MIDDLE); ap_hook_translate_name(mmap_static_xlat,aszPre,NULL,HOOK_LAST); };
这注册了两个需要调用的函数,一个在post_config
阶段(实际上每个模块都需要这个),另一个在translate_name
阶段。请注意,尽管函数名称不同,但每个函数的格式是相同的。那是什么格式?
ap_hook_phase_name(function_name,
predecessors, successors, position);
定义了3个挂钩位置...
HOOK_FIRST
HOOK_MIDDLE
HOOK_LAST
要定义位置,请使用该位置,然后使用前任和后继进行修改。每个修饰符都可以是应该运行的函数的列表,可以在函数运行之前(前继)或在函数运行之后(后继)。
在这种mod_mmap_static
情况下,我不在乎
post_config
阶段,但是mmap_static_xlat
必须在核心模块完成名称转换后调用,因此必须使用aszPre来为position定义修饰符HOOK_LAST
。
现在,在创建模块定义时无需担心很多步骤。旧的定义看起来像
module MODULE_VAR_EXPORT module_name_module = { STANDARD_MODULE_STUFF, /* initializer */ /* dir config creater */ /* dir merger --- default is to override */ /* server config */ /* merge server config */ /* command handlers */ /* handlers */ /* filename translation */ /* check_user_id */ /* check auth */ /* check access */ /* type_checker */ /* fixups */ /* logger */ /* header parser */ /* child_init */ /* child_exit */ /* post read-request */ };
新的结构要简单得多。
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 */ };
其中有些直接读懂,有些则不然。我将尝试总结下面应该做的事情。
直接读取的阶段:
/* dir config creater */
/* create per-directory config structures */
/* server config */
/* create per-server config structures */
/* dir merger */
/* merge per-directory config structures */
/* merge server config */
/* merge per-server config structures */
/* command table */
/* command apr_table_t */
/* handlers */
/* handlers */
其余的旧功能应注册为钩子。到目前为止,定义了以下钩子阶段...
ap_hook_pre_config
ap_hook_check_config
ap_hook_test_config
-t
选项一起执行ap_hook_open_logs
ap_hook_post_config
_init
程序注册的地方ap_hook_http_method
ap_hook_auth_checker
ap_hook_access_checker
ap_hook_check_user_id
ap_hook_default_port
ap_hook_pre_connection
ap_hook_process_connection
ap_hook_child_init
ap_hook_create_request
ap_hook_fixups
ap_hook_handler
ap_hook_header_parser
post_read_request
用于此ap_hook_insert_filter
ap_hook_log_transaction
ap_hook_optional_fn_retrieve
ap_hook_post_read_request
ap_hook_quick_handler
ap_hook_translate_name
ap_hook_type_checker