On Mon, Oct 22, 2012 at 4:05 PM, Sorin Manolache <sor...@gmail.com> wrote: > On 2012-10-22 21:29, Joshua Marantz wrote: >> >> Hi, >> >> Our module has multiple confirmation parameters. There is a case where if >> you have option A and option B, then you must also specify option C, >> otherwise Bad things can happen that are a lot easier to debug on startup >> than they are after the server is running. >> >> I know how to force 'apachectl' to exit with a nice error message if I >> don't like the value of option A or option B. I can do that in the >> function-pointer I provide in my option-table by returning a non-null >> char* >> message. >> >> But in this case I want to exit nicely from the function I have registered >> with ap_hook_child_init, having noticed that option A and B are set but >> not >> C. Is that possible? >> >> By "nicely", I mean that the user types: >> >> % sudo /etc/init.d/apachectl restart >> Error in pagespeed.conf: if you have option A and B specified, you must >> specify a value for option C. >> >> At that point either the server would not be running, or it would still be >> in whatever state it was previously in. >> >> Is this possible? >> >> Currently our solution is to log an error and call abort(), and it's not >> very nice!
exit(APEXIT_CHILDFATAL) is better than abort(), but if at all possible you should handle this in the parent > > > Don't do it in child_init. I don't think the child can stop the server. > > I think apachectl spawns apache with an appropriate -k argument (e.g. > "apache2 -k stop") to start/stop/reload apache. However, I don't think that > the child has sufficient privileges to stop the parent by exec'ing "apache2 > -k stop". Nor can it send the apropriate signal to the parent. > > But you can exit nicely in post_config, which is run (as root) after the > conf is read but before the children are spawned. It suffices to return a > non-ok code for apache to exit. I _think_, I'm not sure, that what you log > in post_config does not go on the console but goes to the server log. But > maybe there's a way to put the error message on the console too. where the output goes depends on the phase of initialization 1st time post-config is called: ap_log_error goes nowhere subsequent times post-config is called: ap_log_error goes to the error log Some other modules handle this issue with an open_logs hook that runs before core's open_logs hook. The module can then log an error that goes to the console and return an error so that startup is aborted. Example from server/mpm/prefork/prefork.c: static void prefork_hooks(apr_pool_t *p) { /* The prefork open_logs phase must run before the core's, or stderr * will be redirected to a file, and the messages won't print to the * console. */ static const char *const aszSucc[] = {"core.c", NULL}; ... ap_hook_open_logs(prefork_open_logs, NULL, aszSucc, APR_HOOK_MIDDLE); > > Sorin > -- Born in Roswell... married an alien... http://emptyhammock.com/