/* Performs a deep copy of a provided xccdf_check, returns a pointer to that copy */ struct xccdf_check *xccdf_check_clone(const struct xccdf_check* old_check) { struct xccdf_check *new_check = calloc(1, sizeof(struct xccdf_check)); new_check->id = oscap_strdup(old_check->id); new_check->system = oscap_strdup(old_check->system); new_check->selector = oscap_strdup(old_check->selector); new_check->content = oscap_strdup(old_check->content); new_check->oper = old_check->oper; new_check->flags = old_check->flags; new_check->imports = oscap_list_clone(old_check->imports, (oscap_clone_func) xccdf_check_import_clone); new_check->exports = oscap_list_clone(old_check->exports, (oscap_clone_func) xccdf_check_export_clone); new_check->content_refs = oscap_list_clone(old_check->content_refs, (oscap_clone_func) xccdf_check_content_ref_clone); new_check->children = oscap_list_clone(old_check->children, (oscap_clone_func) xccdf_check_clone); return new_check; }
struct cpe_testexpr * cpe_testexpr_clone(struct cpe_testexpr * old_expr) { struct cpe_testexpr * new_expr = cpe_testexpr_new(); new_expr->oper = old_expr->oper; switch (new_expr->oper & CPE_LANG_OPER_MASK) { case CPE_LANG_OPER_AND: case CPE_LANG_OPER_OR: new_expr->meta.expr = oscap_list_clone(old_expr->meta.expr, (oscap_clone_func) cpe_testexpr_clone); break; case CPE_LANG_OPER_MATCH: new_expr->meta.cpe = cpe_name_clone(old_expr->meta.cpe); break; case CPE_LANG_OPER_CHECK: new_expr->meta.check.system = oscap_strdup(old_expr->meta.check.system); new_expr->meta.check.href = oscap_strdup(old_expr->meta.check.href); new_expr->meta.check.id = oscap_strdup(old_expr->meta.check.id); break; default: break; } return new_expr; }