void cf_register(struct cfitem *items)
{
- if(items[0].type!=CT_SECTION)
- die("Invalid configuration section, first item must be of type CT_SECTION");
+ if(items[0].type!=CT_SECTION && items[0].type!=CT_INCOMPLETE_SECTION)
+ die("cf_register: Invalid section type");
items[0].var=cfsection;
cfsection=items;
}
struct cfitem *cf_get_item(byte *sect, byte *name)
{
- struct cfitem *item;
+ struct cfitem *item, *section;
item=cfsection;
while(item && strcasecmp(item->name,sect))
item=item->var;
if(!item) /* unknown section */
return NULL;
+ section = item;
for(item++; item->type && strcasecmp(item->name,name); item++);
+ if (!item->type && section->type == CT_INCOMPLETE_SECTION)
+ return NULL;
return item; /* item->type == 0 if not found */
}
* the name of the section. The configuration sections are registered by
* calling cf_register().
*
+ * CT_INCOMPLETE_SECTION is identical to CT_SECTION, but when an unknown variable
+ * is spotted, we ignore it instead of bailing out with an error message.
+ *
* item->var is a pointer to the destination variable or to the special parsing
* function.
*/
-enum cftype { CT_STOP, CT_SECTION, CT_INT, CT_STRING, CT_FUNCTION };
+enum cftype { CT_STOP, CT_SECTION, CT_INCOMPLETE_SECTION, CT_INT, CT_STRING, CT_FUNCTION };
struct cfitem {
byte *name;