Config parsing (4/4): Proposed starting interface
Russ Allbery
rra at stanford.edu
Sat May 12 03:55:32 UTC 2001
Aidan Cully <aidan at panix.com> writes:
> How does one verify syntax using this API? E.g., make sure that the
> user didn't stick some garbage parameter name into the file?
I was going to tag that as one of the things I hadn't made a decision on
yet and then forgot. Thanks for pointing that out.
The main problem with finding a good way to do this is knowing what
parameters are allowed in convenience groups, the group { } groups
surrounding a bunch of groups that the client cares about that are only
there to set some default values. You can't really know what parameters
are valid for such a group without knowing what groups it contains.
Other than that, the fairly obvious interface (to me at least) is to add
something like:
struct vector *conf_params(config_group);
that returns a vector of parameter names that are set in that group. The
caller can then compare that against a list of valid parameters, and also
try calling config_param_<type> for each one with the expected type to
make sure that succeeds.
One solution that I thought of was to just return a vector that contains
all the parameters that are set, including all of the inherited ones. One
drawback is that that could be slower, but I don't think we care too much
there; full verification can be slow. Another drawback is that it could
mean reporting errors more than once if the error is in a parameter
inherited by a bunch of groups.
Oh, the other thing that is probably needed for verification purposes is
to modify:
>> /* config_find_group returns the first group of the given type found in the
>> tree rooted at its argument. config_next_group returns the next group in
>> the tree of the same type as the given group (or NULL if none is found).
>> This can be used to do such things as enumerate all "peer" groups in a
>> configuration file. */
>> config_group config_find_group(config_group, const char *type);
>> config_group config_next_group(config_group);
one of these slightly or add another similar interface to allow you to
iterate through all of the groups, regardless of type.
--
Russ Allbery (rra at stanford.edu) <http://www.eyrie.org/~eagle/>
More information about the inn-workers
mailing list