On 2/2/2014 10:53 PM, Nick Kew wrote:

On 2 Feb 2014, at 03:01, Kean Johnston wrote:

(this really belongs on modules-dev)
Apologies. Moving this reply there.


I have a question about the pre_config hook. I have a module that registers for 
that hook, but the function I specify is never called.

I expect it is, but …
Actually I found out why it wasn't (yet). I was attempting to use a config container using AP_INIT_RAW_ARGS, and with EXEC_ON_READ set, I was being called before pre_config had been run.

I have a hash table that needs to be initialized before any of my config 
directives are parsed, and I am getting a SIGSEGV because that is not the case.

Is the hash table a member of a configuration struct?
I expect it's initialised in the root context, but your config
directives are in some other context.
No, it's just a static variable in my module. Everything is limited to the root context. Here's what I am trying to do.

The module is for dealing with FastCGI servers, but without any form of process management as things like mod_fcgid do. For lack of a better word I call these "external" FastCGI servers. I wanted things configured thus:

<ExtfcgiServer "name">
  Option1 arg1 etc
  Option2 arg1 arg2 etc
  StillMoreOptions etc etc
</ExtfcgiServer>

My command_rec has, inter alia:
AP_INIT_RAW_ARGS("<ExtfcgiServer", new_ext_server, NULL,
                     EXEC_ON_READ | RSRC_CONF,
                     "Define a new external FastCGI application server"),

With EXEC_ON_READ set, new_ext_server was being called before the pre_config hook, which simply has:

static int extfcgi_pre_config(apr_pool_t *pconf, apr_pool_t *plog,
                              apr_pool_t *ptemp)
{
    extfcgi_servers = apr_hash_make(pconf);
    return OK;
}

extfcgi_servers is simply a hash with all of the defined external FastCGI application servers.


Is it acceptable to initialize that hash table in my register_hooks function 
instead?

Yes, if you can deal with the pool management.  But you'll probably
run up against exactly the same issue.
If I use EXEC_ON_READ, I move that initialization of extfcgi_servers into my register_hooks function, and allocate the hash in the pool that is the only argument to that function. Is that not safe?

If I don't use EXEC_ON_READ then the pre_config hook is run just fine before new_ext_server().

Attempting to use a configuration container like I am is proving to be quite tough for a neophyte. With EXEC_ON_READ, I find I can safely use ap_cfg_getline(), and use cmd->config_file as the third argument to that function. However, if I do NOT use EXEC_ON_READ, then cmd->config_file is NULL and ap_cfg_getline() of course coredumps.

Ideally I'd like to not use EXEC_ON_READ, but then I have to figure out what to pass as the third argument of ap_cfg_getline(), or find some other function that I can get config lines between <ExtfcgiServer> ... </ExtfcgiServer>.

An alternative approach is to give up on using a config container at all and just have a normal config directive and use ap_getword_conf(). Something along the lines of how mod_ext_filter does things. I'd prefer not to though, the container approach looks better. Advice greatly appreciated.

Sincerely,
Kean

Reply via email to