int conf_test_metadata(const char *version, struct dev_policy *pol, int is_homehost) { /* If anyone said 'yes', that sticks. * else if homehost applies, use that * else if there is a 'no', say 'no'. * else 'yes'. */ struct dev_policy *p; int no=0, found_homehost=0; load_conffile(); pol = pol_find(pol, pol_auto); pol_for_each(p, pol, version) { if (strcmp(p->value, "yes") == 0) return 1; if (strcmp(p->value, "homehost") == 0) found_homehost = 1; if (strcmp(p->value, "no") == 0) no = 1; } if (is_homehost && found_homehost) return 1; if (no) return 0; return 1; }
void domain_merge(struct domainlist **domp, struct dev_policy *pollist, const char *metadata) { /* Add to 'domp' all the domains in pol that apply to 'metadata' * which are not already in domp */ struct dev_policy *pol; pollist = pol_find(pollist, pol_domain); pol_for_each(pol, pollist, metadata) domain_merge_one(domp, pol->value); }
static enum policy_action policy_action(struct dev_policy *plist, const char *metadata) { enum policy_action rv = act_default; struct dev_policy *p; plist = pol_find(plist, pol_act); pol_for_each(p, plist, metadata) { enum policy_action a = map_act(p->value); if (a > rv) rv = a; } return rv; }
int domain_test(struct domainlist *dom, struct dev_policy *pol, const char *metadata) { /* Check that all domains in pol (for metadata) are also in * dom. Both lists are sorted. * If pol has no domains, we don't really know about this device * so we allow caller to choose: * -1: has no domains * 0: has domains, not all match * 1: has domains, all match */ int found_any = -1; struct dev_policy *p; pol = pol_find(pol, pol_domain); pol_for_each(p, pol, metadata) { found_any = 1; while (dom && strcmp(dom->dom, p->value) < 0) dom = dom->next; if (!dom || strcmp(dom->dom, p->value) != 0) return 0; }