static const char *parse_spaces = " ";
/*
+ * A copy of cf_section_parse that initializes pointers before
+ * parsing them.
+ */
+static void cf_section_parse_init(CONF_SECTION *cs, void *base,
+ const CONF_PARSER *variables)
+{
+ int i;
+ void *data;
+
+ for (i = 0; variables[i].name != NULL; i++) {
+ if (variables[i].type == PW_TYPE_SUBSECTION) {
+ CONF_SECTION *subcs;
+ subcs = cf_section_sub_find(cs, variables[i].name);
+ if (!subcs) continue;
+
+ if (!variables[i].dflt) continue;
+
+ cf_section_parse_init(subcs, base,
+ (const CONF_PARSER *) variables[i].dflt);
+ continue;
+ }
+
+ if ((variables[i].type != PW_TYPE_STRING_PTR) &&
+ (variables[i].type != PW_TYPE_FILENAME)) {
+ continue;
+ }
+
+ if (variables[i].data) {
+ data = variables[i].data; /* prefer this. */
+ } else if (base) {
+ data = ((char *)base) + variables[i].offset;
+ } else {
+ continue;
+ }
+
+ *(char **) data = NULL;
+ } /* for all variables in the configuration section */
+}
+
+/*
* Parse a configuration section into user-supplied variables.
*/
int cf_section_parse(CONF_SECTION *cs, void *base,
cs->name1, cs->name2);
}
+ cf_section_parse_init(cs, base, variables);
+
/*
* Handle the known configuration parameters.
*/
goto error;
}
- if ((variables[i].type == PW_TYPE_STRING_PTR) ||
- (variables[i].type == PW_TYPE_FILENAME)) {
- *(char **) data = NULL;
- }
-
/*
* Parse the pair we found, or a default value.
*/