---- Sorin Manolache <[email protected]> wrote: > On 2012-06-30 22:33, [email protected] 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 > > > >
Hi Sorin, I had been following info in a book, but either missed that part about creating the configuration object. That's why I was having a hard time understanding how to actually use the configuration info in my module (e.g., how to get a reference to the object). I've since found this tutorial: http://threebit.net/tutorials/apache2_modules/tut2/tutorial2.html and will be revising and testing my code, and will post back. Thanks again, Jim
