On 2012-06-30 22:33, oh...@cox.net wrote:
Hi,

I got my 1st module working and now I need to add support for a configuration directive 
that sets a string that my module needs in various places, i.e., if my directive is 
"SetMyVar", and httpd.conf has:

SetMyVar    "foo123"

then, in my module, I need to able to access the string, "foo123", that got set via the 
"SetMyVar" directive.  This directive would only be used at the server level.

I think that I know how to do the code to set the variable into my module, but 
the question that I have is how do I *access* it after it is set?

Here's the code I have to handle the directive:

/*
  * Stuff for Directive handling
  */

// Struct for Directives
typedef struct txt_cfg {
     const char * MyVar;
} txt_cfg;


// Function to get GxInterceptorURL
static const char * txt_set_MyVar(cmd_parms* cmd, void* cfg, const char* val) {
     printf("In set_MyVar: Setting MyVar to [%s]\n", val);
     ((txt_cfg*) cfg)->MyVar = val;
} // end txt_set_MyVar()


//
static const command_rec txt_cmds[] = {
     AP_INIT_TAKE1("SetMyVar", txt_set_MyVar, NULL, OR_ALL,
             "This is MyVar"),
     { NULL }
};
.
.
.
module AP_MODULE_DECLARE_DATA my_module =
{
     STANDARD20_MODULE_STUFF,
     NULL,                       /* dir config creater */
     NULL,                       /* dir merger --- default is to override */
     NULL,                       /* server config */
     NULL,                       /* merge server configs */
     txt_cmds,                       /* command apr_table_t */
     register_hooks              /* register hooks */
};


Can anyone tell me how, in my module code, I can access that "MyVar" string?


You don't get a valid configuration object (txt_cfg) in the cfg argument of the txt_set_MyVar unless you create that configuration object. As your code looks now, cfg in txt_set_MyVar should be null.

You'll have to set a callback function for creating the configuration object. The configuration object configuration functions are dir_config_creater (first after STANDARD20_MODULE_STUFF in my_module) and server_config (third after STANDARD20_MODULE_STUFF).

The dir_config creator will put your configuration object in r->per_dir_config and you get it with

txt_cfg *cfg = (txt_cfg *)ap_get_module_config(r->per_dir_config, &my_module);

The server_config_creator will put your configuration object in r->server->module_config and you get it with

txt_cfg *cfg = (txt_cfg *)ap_get_module_config(r->server->module_config, &my_module);


Have a look in include/http_config.h at all those OR_* macros and especially at RSRC_CONF and ACCESS_CONF.

RSRC_CONF is used mainly to define server-wide directives. ACCESS_CONF is used to define directory-wide configuration directives.

In your cfg argument of the txt_set_MyVar configuration directive handler, you'll get the _directory-wide_ configuration object (if you've created one by using the dir_config_creator in module my_module). If you want to set your variable just for the directory, you can keep txt_set_MyVar as it is now. Later in the module, you can retrieve the value as I showed above, i.e. from r->per_dir_config.

If you want to set it server-wide, then don't use cfg. Write

txt_cfg *srv_cfg = (txt_cfg *)ap_get_module_config(cmd->server->module_config, &my_module).

Later in the module, you can retrieve the value as I showed above, i.e. from r->server->module_config.

Remember that in any case, you have to create the respective configuration object (via the callbacks in my_module).

S


Thanks,
Jim



Reply via email to