将配置参数从apache.conf传递到自定义apache C模块?

时间:2012-11-19 16:13:24

标签: c apache

Apache httpd框架中是否有任何机制允许我将自定义参数从Apache配置文件传递到自定义Apache模块(使用C API编写)?我真的只需要键/值对。

conf文件中的内容:

ConfigParameter foo bar

然后在代码中:

string foo = GetApacheConfigParameter("foo"); // = "bar"

1 个答案:

答案 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.有很好的例子。