On Sat, May 18, 2002 at 12:32:20PM -0500, William A. Rowe, Jr. wrote:
>...
> Ok, segfault  is gone.  So is some validation that ServerRoot occured in a 
> global
> context.  Actually, that means that LoadModule and others are not tested to be
> in the global context either.

(see further below)

>...
> I'm just getting my head wrapped around cfg parsing, so anyone with a whole
> lot more background here might be able to provide pointers.  Notice that we
> can't defer ServerRoot processing unless we defer LoadModule processing.

EXEC_ON_READ is *ONLY* intended to be used for things like LoadModule.
Essentially, LoadModule needs to be executed right away so that we can
properly *parse* the rest of the file.

Outside of the initial parse into the configuration tree, and whatever is
needed to build that tree, NOTHING should ever be EXEC_ON_READ. I know that
some things have gotten a bit sloppy with that, but I've never had the time
or inclination to go and do a review.

Once you get the tree loaded, then you should be able to simply scan it for
the validation. You should be able to detect an improperly positioned
ServerRoot just by looking at the tree.

Note that the ideal config parse/load looks like:

1) process the config, constructing the tree. invoke any EXEC_ON_READ
   directives, as these are required to complete this step

2) process the tree to find logging directives and execute them
   [ these might be EXEC_ON_READ today, which would be abdness ]

3) process the tree for all the directives, now that logging is available

Note that we really only need to hit the file once to parse the tree. The
logic was never completed for this, however, so we actually read/parse the
tree twice.

> If we REALLY get a better handle on this, I see no reason to maintain the
> test-load then re-load configuration logic.  If we can pre-process what we must
> with EXEC_ON_READ, then open logs and the like, we should be able to
> directly proceed to run_mpm, without dumping it all and reloading.

Yup.

> On Win32, we load-unload-reload the parent, then load-unload-reload the child
> config.  Losing both redundant unload-load sequences will be a huge win at
> startup.

Yup. If we process the tree in a much smarter fashion, then nothing should
need to be unloaded.

>...

Regarding the first question, about validating ServerRoot. As I mentioned
above, you can go do the validation during the second pass. Of course, that
means that it was a bit "late". It may be possible to build in some flags
that say "this directive can only occur at the top level". When the parser
sees a directive with that flag set, and it isn't at the top level, then it
would simply barf it up.

[ I think the "only at top level" makes a lot more sense than the flags we
  have nowadays. the current flags are a confusing much of where a directive
  can or can't appear; the names are bad, the combinations aren't clear, and
  even the symbols aren't properly namespace (e.g. OR_LIMIT) ]

Cheers,
-g

-- 
Greg Stein, http://www.lyra.org/

Reply via email to