Skip to content

Commit

Permalink
Revert to working code
Browse files Browse the repository at this point in the history
  • Loading branch information
alandekok committed Feb 18, 2014
1 parent b7b1dd1 commit f0d7e84
Showing 1 changed file with 31 additions and 54 deletions.
85 changes: 31 additions & 54 deletions src/main/conffile.c
Expand Up @@ -2396,82 +2396,59 @@ CONF_SECTION *cf_section_sub_find_name2(CONF_SECTION const *cs,
char const *name1, char const *name2)
{
CONF_ITEM *ci;
CONF_SECTION *name1cs, *subcs;
CONF_SECTION mycs;

if (!cs) cs = root_config;
if (!cs) cs = mainconfig.config;
if (!cs) return NULL;

/*
* name1 is given. Do a simple search. name2 may be
* NULL, in which case we're looking for a matching
* (name1, NULL). In contrast, cf_section_sub_find()
* above doesn't check name2 at all.
*/
if (name1) {
name1cs = cf_section_sub_find(cs, name1);
if (!name1cs) return NULL;

if (!name1cs->name2_tree) {
if (!name1cs->name2 && name2) return NULL;
if (name1cs->name2 && !name2) return NULL;
CONF_SECTION mycs, *master_cs;

if (strcmp(name1cs->name2, name2) == 0) {
return name1cs;
}
return NULL;
}
rad_assert(cs->section_tree != NULL);

mycs.name1 = name1;
mycs.name2 = name2;

return rbtree_finddata(name1cs->name2_tree, &mycs);
}

/*
* Asking for (NULL, name2) means look for (name2, NULL)
* Yes, this is backwards.
*/
name1cs = cf_section_sub_find(cs, name2);
if (name1cs) {
if (!name1cs->name2_tree) {
/*
* No name2 tree, do the checks
* ourselves. If (name2, NULL) exists,
* return it.
*/
if (!name1cs->name2) return name1cs;
/* else fall through to (*, name2) */
master_cs = rbtree_finddata(cs->section_tree, &mycs);
if (!master_cs) return NULL;

} else {
mycs.name1 = name2;
mycs.name2 = NULL;
subcs = rbtree_finddata(name1cs->name2_tree, &mycs);
if (subcs) return subcs;
/* else fall through to (*, name2) */
if (!master_cs->name2_tree) {
if (!master_cs->name2 && name2) return NULL;
if (master_cs->name2 && !name2) return NULL;

if (strcmp(master_cs->name2, name2) == 0) {
return master_cs;
}
return NULL;
}
return rbtree_finddata(master_cs->name2_tree, &mycs);
}

/*
* No matching (name2, NULL). Look for (*, name2) by
* brute-force search over all of the children.
* Else do it the old-fashioned way.
*/
for (ci = cs->children; ci; ci = ci->next) {
CONF_SECTION *subcs;

if (ci->type != CONF_ITEM_SECTION)
continue;

subcs = cf_itemtosection(ci);
if (!subcs->name2 && name2) continue;
if (subcs->name2 && !name2) continue;

if (!subcs->name2 && !name2) return subcs;

if (strcmp(subcs->name2, name2) == 0) {
return subcs;
subcs = cf_itemtosection(ci);
if (!name1) {
if (!subcs->name2) {
if (strcmp(subcs->name1, name2) == 0) break;
} else {
if (strcmp(subcs->name2, name2) == 0) break;
}
continue; /* don't do the string comparisons below */
}

if ((strcmp(subcs->name1, name1) == 0) &&
(subcs->name2 != NULL) &&
(strcmp(subcs->name2, name2) == 0))
break;
}

return NULL;
return cf_itemtosection(ci);
}

/*
Expand Down

0 comments on commit f0d7e84

Please sign in to comment.