bool xccdf_tailoring_remove_profile(struct xccdf_tailoring *tailoring, struct xccdf_profile *profile) { assert(xccdf_profile_get_tailoring(profile)); // We have to make sure there is no other profile in tailoring that inherits // the profile we are about to remove. const char *profile_id = xccdf_profile_get_id(profile); struct xccdf_profile_iterator* it = xccdf_tailoring_get_profiles(tailoring); while (xccdf_profile_iterator_has_more(it)) { struct xccdf_profile* prof = xccdf_profile_iterator_next(it); if (prof == profile) continue; const char *extends = xccdf_profile_get_extends(prof); if (oscap_strcmp(profile_id, extends) == 0) { oscap_seterr(OSCAP_EFAMILY_XML, "Can't remove given profile '%s' from tailoring. Other profiles are inheriting from it!", profile_id); return false; xccdf_profile_iterator_free(it); } } xccdf_profile_iterator_free(it); return oscap_list_remove(tailoring->profiles, XITEM(profile), (oscap_cmp_func)_list_ptreq_cmp, NULL); }
static struct xccdf_profile *_xccdf_tailoring_profile_get_real_parent(struct xccdf_tailoring *tailoring, struct xccdf_profile *profile) { const char *extends = xccdf_profile_get_extends(profile); struct xccdf_profile *parent_from_tailoring = xccdf_tailoring_get_profile_by_id(tailoring, extends); if (parent_from_tailoring != NULL && parent_from_tailoring != profile) { return parent_from_tailoring; } else { return XPROFILE(xccdf_benchmark_get_member(xccdf_profile_get_benchmark(profile), XCCDF_PROFILE, extends)); } }