Apache httpd框架中是否有任何机制允许我将自定义参数从Apache配置文件传递到自定义Apache模块(使用C API编写)?我真的只需要键/值对。
conf文件中的内容:
ConfigParameter foo bar
然后在代码中:
string foo = GetApacheConfigParameter("foo"); // = "bar"
答案 0 :(得分:5)
没有;不直接。肮脏的黑客将是
SetEnv foo bar
配置文件中的- 和
char * bar = getenv("foo");
在你的模块中。除此之外的任何事情都需要在每个目录,服务器等上使用适当的结构。通常,该结构将包含许多特定的东西。在你的情况下,它只是一个表。
所以有点干净的方法就是简单地使用一个表 - 然后把它留在那里:
static const command_rec xxx_cmds[] = {
AP_INIT_TAKE2("ConfigParameter", add_configparam, NULL, RSRC_CONF,
"Arbitrary key value pair"),
{NULL}
};
static void * create_dir_config(apr_pool_t *p, char *dirspec ) {
return ap_table_palloc(p);
}
static const char *add_configparam(cmd_parms *cmd, void *mconfig,
char *key, char *val)
{
ap_table_t *pairs = (ap_table_rec *) mconfig;
ap_table_set(pairs, key, val);
return NULL;
}
AP_DECLARE_MODULE(xxxx_module) =
{
STANDARD20_MODULE_STUFF,
xxx_create_dir_config, /* per-directory config creator */
...
xxx_cmds, /* command table */
然后,在任何你想要使用它的地方:
apr_table_t * pairs = (apr_table_p *) ap_get_module_config(r->request_config, &xxxx_module);
或
apr_table_t * pairs = ap_get_module_config(s->module_config, &xxxx_module);
取决于我们使用的位置 - 然后使用:
char * bar = apr_table_get(pairs,"foo");
或类似的。请参阅mod_example_hooks和各种our_ *调用以获取指针。上面的例子省略了服务器级别的配置和配置的合并。如果需要,可以添加它们 - 对表有相应的合并调用。 mod_alias.c et.al.有很好的例子。