Remove all matching attributes from the list. Both the attribute name
and value have to match in order for the attribute to be removed from
the list.
+.IP ==
+Remove all non-matching attributes from the list. Both the attribute
+name and value have to match in order for the attribute to remain in
+the list.
.IP <=
Enforce that the integer value of the attribute is less than or equal
to the value given here. If there is no attribute of the same name in
VALUE_PAIR *cf_pairtovp(CONF_PAIR *pair);
const char *cf_section_name1(const CONF_SECTION *);
const char *cf_section_name2(const CONF_SECTION *);
-int dump_config(void);
+int dump_config(CONF_SECTION *cs);
CONF_SECTION *cf_subsection_find_next(CONF_SECTION *section,
CONF_SECTION *subsection,
const char *name1);
goto do_set;
case T_OP_ADD:
+ case T_OP_CMP_EQ:
case T_OP_SUB:
case T_OP_LE:
case T_OP_GE:
return 0;
}
-int dump_config(void)
+int dump_config(CONF_SECTION *cs)
{
- return dump_config_section(mainconfig.config, 0);
+ return dump_config_section(cs, 0);
}
#endif
* "to"
*/
if ((from_list[i]->operator == T_OP_SUB) ||
+ (from_list[i]->operator == T_OP_CMP_EQ) ||
(from_list[i]->operator == T_OP_LE) ||
(from_list[i]->operator == T_OP_GE)) {
int rcode;
from_list[i]->operator = old_op;
switch (old_op) {
+ case T_OP_CMP_EQ:
+ if (rcode != 0) goto delete;
+ break;
+
case T_OP_SUB:
if (rcode == 0) {
+ delete:
DEBUG4("::: DELETING %s FROM %d TO %d",
from_list[i]->name, i, j);
pairfree(&to_list[j]);
}
if ((vp->operator != T_OP_EQ) &&
+ (vp->operator != T_OP_CMP_EQ) &&
(vp->operator != T_OP_ADD) &&
(vp->operator != T_OP_SUB) &&
(vp->operator != T_OP_LE) &&