2012-11-19 81 views
3

Apache httpd框架中是否有任何機制允許我將自定義參數從Apache配置文件傳遞到自定義Apache模塊(使用C API編寫)?我真的只需要鍵/值對。將配置參數從apache.conf傳遞給定製apache C模塊?

喜歡的東西中的conf文件:

ConfigParameter foo bar 

然後在代碼:

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

回答

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

+0

你的第一個解決方案(SetEnv)不起作用,因爲它似乎沒有在我的模塊中運行childinit鉤子時執行。我最終通過爲我的模塊創建了一個單獨的配置文件來解決這個問題。 –