1b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence/*
2b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * Copyright 2011 Tresys Technology, LLC. All rights reserved.
3b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence *
4b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * Redistribution and use in source and binary forms, with or without
5b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * modification, are permitted provided that the following conditions are met:
6b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence *
7b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence *    1. Redistributions of source code must retain the above copyright notice,
8b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence *       this list of conditions and the following disclaimer.
9b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence *
10b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence *    2. Redistributions in binary form must reproduce the above copyright notice,
11b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence *       this list of conditions and the following disclaimer in the documentation
12b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence *       and/or other materials provided with the distribution.
13b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence *
14b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
15b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
16b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
17b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
18b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
19b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
21b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
22b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
23b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence *
25b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * The views and conclusions contained in the software and documentation are those
26b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * of the authors and should not be interpreted as representing official policies,
27b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence * either expressed or implied, of Tresys Technology, LLC.
28b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence */
29b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
30b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#include <stdlib.h>
31b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#include <stdio.h>
32b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#include <string.h>
33b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
34b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#include "cil_internal.h"
35b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#include "cil_log.h"
36b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#include "cil_mem.h"
37b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#include "cil_tree.h"
38b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#include "cil_list.h"
39b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#include "cil_symtab.h"
40b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#include "cil_copy_ast.h"
41b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#include "cil_build_ast.h"
42b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence#include "cil_strpool.h"
43b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
44b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencestruct cil_args_copy {
45b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_tree_node *dest;
46b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_db *db;
47b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence};
48b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
49b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid cil_copy_list(struct cil_list *data, struct cil_list **copy)
50b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
51b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_list *new;
52b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_list_item *orig_item;
53b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
54b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_list_init(&new, data->flavor);
55b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
56b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_list_for_each(orig_item, data) {
57b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		switch (orig_item->flavor) {
58b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		case CIL_STRING:
59b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			cil_list_append(new, CIL_STRING, orig_item->data);
60b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			break;
61b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		case CIL_LIST: {
62b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			struct cil_list *new_sub = NULL;
63b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			cil_copy_list((struct cil_list*)orig_item->data, &new_sub);
64b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			cil_list_append(new, CIL_LIST, new_sub);
65b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			break;
66b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		}
6780afe7b2ce0b06f93b6b3a07e58cab1aee8afc91Steve Lawrence		case CIL_PARAM: {
6880afe7b2ce0b06f93b6b3a07e58cab1aee8afc91Steve Lawrence			struct cil_param *po = orig_item->data;
6980afe7b2ce0b06f93b6b3a07e58cab1aee8afc91Steve Lawrence			struct cil_param *pn;
7080afe7b2ce0b06f93b6b3a07e58cab1aee8afc91Steve Lawrence			cil_param_init(&pn);
7180afe7b2ce0b06f93b6b3a07e58cab1aee8afc91Steve Lawrence			pn->str = po->str;
7280afe7b2ce0b06f93b6b3a07e58cab1aee8afc91Steve Lawrence			pn->flavor = po->flavor;
7380afe7b2ce0b06f93b6b3a07e58cab1aee8afc91Steve Lawrence			cil_list_append(new, CIL_PARAM, pn);
7480afe7b2ce0b06f93b6b3a07e58cab1aee8afc91Steve Lawrence		}
7580afe7b2ce0b06f93b6b3a07e58cab1aee8afc91Steve Lawrence			break;
7680afe7b2ce0b06f93b6b3a07e58cab1aee8afc91Steve Lawrence
77b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		default:
78b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			cil_list_append(new, orig_item->flavor, orig_item->data);
79b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			break;
8080afe7b2ce0b06f93b6b3a07e58cab1aee8afc91Steve Lawrence		}
81b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
82b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
83b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
84b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
85b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
86b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_node(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
87b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
88b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	char *new = NULL;
89b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
90b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (data != NULL) {
91b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		new = data;
92b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
93b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
94b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
95b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
96b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
97b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
98b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_block(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
99b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
100b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_block *orig = data;
101b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	char *key = orig->datum.name;
102b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_symtab_datum *datum = NULL;
103b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
104b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_symtab_get_datum(symtab, key, &datum);
105b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (datum == NULL) {
106b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		struct cil_block *new;
107b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_block_init(&new);
108b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		*copy = new;
109b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
110b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		*copy = datum;;
111b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
112b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
113b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
114b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
115b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
116b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_blockabstract(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
117b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
118b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_blockabstract *orig = data;
119b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_blockabstract *new = NULL;
120b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
121b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_blockabstract_init(&new);
122b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
123b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->block_str = orig->block_str;
124b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
125b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
126b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
127b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
128b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
129b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
130b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_blockinherit(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
131b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
132b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_blockinherit *orig = data;
133b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_blockinherit *new = NULL;
134b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
135b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_blockinherit_init(&new);
136b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
137b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->block_str = orig->block_str;
13876ba6eaa7333483a8cc0c73a7880f7acf99c2656Steve Lawrence	new->block = orig->block;
139b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
140b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
141b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
142b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
143b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
144b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
145b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_policycap(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
146b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
147b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_policycap *orig = data;
148b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	char *key = orig->datum.name;
149b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_symtab_datum *datum = NULL;
150b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
151b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_symtab_get_datum(symtab, key, &datum);
152b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (datum == NULL) {
153b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		struct cil_policycap *new;
154b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_policycap_init(&new);
155b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		*copy = new;
156b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
157b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		*copy = datum;
158b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
159b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
160b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
161b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
162b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
163b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_perm(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
164b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
165b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_perm *orig = data;
166b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	char *key = orig->datum.name;
167b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_symtab_datum *datum = NULL;
168b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
169b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_symtab_get_datum(symtab, key, &datum);
170b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (datum == NULL) {
171b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		struct cil_perm *new;
172b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_perm_init(&new);
173b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		*copy = new;
174b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
175b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		*copy = datum;
176b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
177b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
178b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
179b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
180b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
181b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid cil_copy_classperms(struct cil_classperms *orig, struct cil_classperms **new)
182b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
183b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_classperms_init(new);
184b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	(*new)->class_str = orig->class_str;
185b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_copy_list(orig->perm_strs, &((*new)->perm_strs));
186b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
187b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
188b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid cil_copy_classperms_set(struct cil_classperms_set *orig, struct cil_classperms_set **new)
189b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
190b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_classperms_set_init(new);
191b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	(*new)->set_str = orig->set_str;
192b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
193b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
194b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid cil_copy_classperms_list(struct cil_list *orig, struct cil_list **new)
195b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
196b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_list_item *orig_item;
197b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
198b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig == NULL) {
199b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		return;
200b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
201b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
202b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_list_init(new, CIL_LIST_ITEM);
203b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_list_for_each(orig_item, orig) {
204b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		if (orig_item->flavor == CIL_CLASSPERMS) {
205b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			struct cil_classperms *cp;
206b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			cil_copy_classperms(orig_item->data, &cp);
207b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			cil_list_append(*new, CIL_CLASSPERMS, cp);
208b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		} else {
209b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			struct cil_classperms_set *cp_set;
210b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			cil_copy_classperms_set(orig_item->data, &cp_set);
211b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			cil_list_append(*new, CIL_CLASSPERMS_SET, cp_set);
212b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		}
213b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
214b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
215b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
216b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_classmapping(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
217b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
218b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_classmapping *orig = data;
219b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_classmapping *new = NULL;
220b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
221b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_classmapping_init(&new);
222b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
223b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->map_class_str = orig->map_class_str;
224b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->map_perm_str = orig->map_perm_str;
225b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
226b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_copy_classperms_list(orig->classperms, &new->classperms);
227b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
228b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
229b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
230b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
231b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
232b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
233b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_class(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
234b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
235b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_class *orig = data;
236b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_class *new = NULL;
237b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	char *key = orig->datum.name;
238b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_symtab_datum *datum = NULL;
239b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
240b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_symtab_get_datum(symtab, key, &datum);
241b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (datum != NULL) {
242b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_log(CIL_INFO, "cil_copy_class: class cannot be redefined\n");
243b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		return SEPOL_ERR;
244b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
245b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
246b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_class_init(&new);
247b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
248b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->common = NULL;
249b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
250b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
251b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
252b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
253b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
254b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
255b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_classorder(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
256b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
257b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_classorder *orig = data;
258b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_classorder *new = NULL;
259b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
260b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_classorder_init(&new);
261b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig->class_list_str != NULL) {
262b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_copy_list(orig->class_list_str, &new->class_list_str);
263b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
264b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
265b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
266b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
267b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
268b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
269b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
270b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_classpermission(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
271b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
272b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_classpermission *orig = data;
273b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_classpermission *new = NULL;
274b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	char *key = orig->datum.name;
275b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_symtab_datum *datum = NULL;
276b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
277b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (key != NULL) {
278b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_symtab_get_datum(symtab, key, &datum);
279b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		if (datum != NULL) {
280b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			cil_log(CIL_INFO, "classpermission cannot be redefined\n");
281b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			return SEPOL_ERR;
282b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		}
283b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
284b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
2851fe89056ea918d900c598fd2e384c855826f80aaSteve Lawrence	cil_classpermission_init(&new);
2861fe89056ea918d900c598fd2e384c855826f80aaSteve Lawrence
287b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_copy_classperms_list(orig->classperms, &new->classperms);
288b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
289b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
290b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
291b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
292b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
293b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
294b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_classpermissionset(__attribute__((unused)) struct cil_db *db, void *data, void **copy,  __attribute__((unused)) symtab_t *symtab)
295b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
296b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_classpermissionset *orig = data;
297b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_classpermissionset *new = NULL;
298b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
2991fe89056ea918d900c598fd2e384c855826f80aaSteve Lawrence	cil_classpermissionset_init(&new);
3001fe89056ea918d900c598fd2e384c855826f80aaSteve Lawrence
301b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->set_str = orig->set_str;
302b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
303b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_copy_classperms_list(orig->classperms, &new->classperms);
304b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
305b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
306b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
307b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
308b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
309b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
310b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_classcommon(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
311b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
312b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_classcommon *orig = data;
313b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_classcommon *new = NULL;
314b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
315b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_classcommon_init(&new);
316b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
317b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->class_str = orig->class_str;
318b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->common_str = orig->common_str;
319b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
320b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
321b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
322b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
323b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
324b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
325b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_sid(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
326b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
327b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_sid *orig = data;
328b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	char *key = orig->datum.name;
329b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_symtab_datum *datum = NULL;
330b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
331b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_symtab_get_datum(symtab, key, &datum);
332b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (datum == NULL) {
333b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		struct cil_sid *new;
334b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_sid_init(&new);
335b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		*copy = new;
336b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
337b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		*copy = datum;
338b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
339b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
340b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
341b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
342b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
343b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_sidcontext(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
344b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
345b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_sidcontext *orig = data;
346b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_sidcontext *new = NULL;
347b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
348b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_sidcontext_init(&new);
349b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
350b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig->context_str != NULL) {
351b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		new->context_str = orig->context_str;
352b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
353b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_context_init(&new->context);
354b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_copy_fill_context(db, orig->context, new->context);
355b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
356b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
357b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
358b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
359b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
360b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
361b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
362b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_sidorder(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
363b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
364b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_sidorder *orig = data;
365b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_sidorder *new = NULL;
366b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
367b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_sidorder_init(&new);
368b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig->sid_list_str != NULL) {
369b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_copy_list(orig->sid_list_str, &new->sid_list_str);
370b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
371b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
372b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
373b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
374b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
375b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
376b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
377b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_user(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
378b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
379b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_user *orig = data;
380b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	char *key = orig->datum.name;
381b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_symtab_datum *datum = NULL;
382b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
383b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_symtab_get_datum(symtab, key, &datum);
384b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (datum == NULL) {
385b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		struct cil_user *new;
386b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_user_init(&new);
387b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		*copy = new;
388b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
389b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		*copy = datum;
390b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
391b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
392b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
393b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
394b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
39577779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiyint cil_copy_userattribute(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
39677779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy{
39777779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy	struct cil_userattribute *orig = data;
39877779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy	struct cil_userattribute *new = NULL;
39977779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy	char *key = orig->datum.name;
40077779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy	struct cil_symtab_datum *datum = NULL;
40177779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy
40277779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy	cil_symtab_get_datum(symtab, key, &datum);
40377779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy	if (datum == NULL) {
40477779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy		cil_userattribute_init(&new);
40577779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy		*copy = new;
40677779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy	} else {
40777779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy		*copy = datum;
40877779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy	}
40977779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy
41077779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy	return SEPOL_OK;
41177779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy}
41277779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy
41377779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiyint cil_copy_userattributeset(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
41477779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy{
41577779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy	struct cil_userattributeset *orig = data;
41677779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy	struct cil_userattributeset *new = NULL;
41777779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy
41877779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy	cil_userattributeset_init(&new);
41977779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy
42077779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy	new->attr_str = orig->attr_str;
42177779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy
42277779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy	cil_copy_expr(db, orig->str_expr, &new->str_expr);
42377779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy	cil_copy_expr(db, orig->datum_expr, &new->datum_expr);
42477779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy
42577779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy	*copy = new;
42677779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy
42777779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy	return SEPOL_OK;
42877779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy}
42977779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy
430b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_userrole(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
431b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
432b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_userrole *orig = data;
433b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_userrole *new = NULL;
434b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
435b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_userrole_init(&new);
436b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
437b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->user_str = orig->user_str;
438b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->role_str = orig->role_str;
439b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
440b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
441b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
442b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
443b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
444b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
445b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_userlevel(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
446b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
447b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_userlevel *orig = data;
448b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_userlevel *new = NULL;
449b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
450b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_userlevel_init(&new);
451b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
452b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->user_str = orig->user_str;
453b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
454b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig->level_str != NULL) {
455b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		new->level_str = orig->level_str;
456b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
457b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_copy_fill_level(db, orig->level, &new->level);
458b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
459b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
460b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
461b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
462b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
463b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
464b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
465b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_userrange(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
466b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
467b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_userrange *orig = data;
468b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_userrange *new = NULL;
469b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
470b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_userrange_init(&new);
471b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
472b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->user_str = orig->user_str;
473b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
474b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig->range_str != NULL) {
475b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		new->range_str = orig->range_str;
476b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
477b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_levelrange_init(&new->range);
478b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_copy_fill_levelrange(db, orig->range, new->range);
479b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
480b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
481b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
482b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
483b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
484b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
485b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
486b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_userprefix(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
487b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
488b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_userprefix *orig = data;
489b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_userprefix *new = NULL;
490b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
491b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_userprefix_init(&new);
492b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
493b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->user_str = orig->user_str;
494b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->prefix_str = orig->prefix_str;
495b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
496b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
497b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
498b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
499b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
500b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
501b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_role(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
502b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
503b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_role *orig = data;
504b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	char *key = orig->datum.name;
505b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_symtab_datum *datum = NULL;
506b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
507b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_symtab_get_datum(symtab, key, &datum);
508b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (datum == NULL) {
509b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		struct cil_role *new;
510b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_role_init(&new);
511b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		*copy = new;
512b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
513b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		*copy = datum;
514b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
515b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
516b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
517b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
518b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
519b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_roletype(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
520b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
521b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_roletype *orig = data;
522b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_roletype *new = NULL;
523b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
524b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_roletype_init(&new);
525b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
526b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->role_str = orig->role_str;
527b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->type_str = orig->type_str;
528b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
529b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
530b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
531b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
532b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
533b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
534b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_roleattribute(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
535b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
536b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_roleattribute *orig = data;
537b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	char *key = orig->datum.name;
538b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_symtab_datum *datum = NULL;
539b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
540b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_symtab_get_datum(symtab, key, &datum);
541b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (datum == NULL) {
542b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		struct cil_roleattribute *new;
543b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_roleattribute_init(&new);
544b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		*copy = new;
545b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
546b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		*copy = datum;
547b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
548b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
549b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
550b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
551b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
552b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_roleattributeset(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
553b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
554b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_roleattributeset *orig = data;
555b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_roleattributeset *new = NULL;
556b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
557b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_roleattributeset_init(&new);
558b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
559b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->attr_str = orig->attr_str;
560b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
561b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_copy_expr(db, orig->str_expr, &new->str_expr);
562b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_copy_expr(db, orig->datum_expr, &new->datum_expr);
563b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
564b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
565b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
566b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
567b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
568b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
569b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_roleallow(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
570b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
571b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_roleallow *orig = data;
572b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_roleallow *new = NULL;
573b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
574b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_roleallow_init(&new);
575b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
576b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->src_str = orig->src_str;
577b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->tgt_str = orig->tgt_str;
578b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
579b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
580b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
581b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
582b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
583b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
584b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_type(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
585b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
586b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_type *orig = data;
587b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	char *key = orig->datum.name;
588b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_symtab_datum *datum = NULL;
589b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
590b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_symtab_get_datum(symtab, key, &datum);
591b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (datum == NULL) {
592b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		struct cil_type *new;
593b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_type_init(&new);
594b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		*copy = new;
595b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
596b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		*copy = datum;
597b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
598b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
599b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
600b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
601b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
602b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_typepermissive(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
603b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
604b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_typepermissive *orig = data;
605b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_typepermissive *new = NULL;
606b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
607b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_typepermissive_init(&new);
608b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
609b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->type_str = orig->type_str;
610b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
611b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
612b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
613b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
614b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
615b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
616b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_typeattribute(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
617b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
618b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_typeattribute *orig = data;
619b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	char *key = orig->datum.name;
620b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_symtab_datum *datum = NULL;
621b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
622b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_symtab_get_datum(symtab, key, &datum);
623b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (datum == NULL) {
624b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		struct cil_typeattribute *new;
625b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_typeattribute_init(&new);
626b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		*copy = new;
627b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
628b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		*copy = datum;
629b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
630b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
631b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
632b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
633b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
634b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_typeattributeset(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
635b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
636b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_typeattributeset *orig = data;
637b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_typeattributeset *new = NULL;
638b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
639b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_typeattributeset_init(&new);
640b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
641b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->attr_str = orig->attr_str;
642b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
643b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_copy_expr(db, orig->str_expr, &new->str_expr);
644b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_copy_expr(db, orig->datum_expr, &new->datum_expr);
645b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
646b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
647b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
648b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
649b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
650b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
6511089665e31a647a5f0ba2eabe8ac6232b384bed9Jeff Vander Stoepint cil_copy_expandtypeattribute(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
6521089665e31a647a5f0ba2eabe8ac6232b384bed9Jeff Vander Stoep{
6531089665e31a647a5f0ba2eabe8ac6232b384bed9Jeff Vander Stoep	struct cil_expandtypeattribute *orig = data;
6541089665e31a647a5f0ba2eabe8ac6232b384bed9Jeff Vander Stoep	struct cil_expandtypeattribute *new = NULL;
6551089665e31a647a5f0ba2eabe8ac6232b384bed9Jeff Vander Stoep
6561089665e31a647a5f0ba2eabe8ac6232b384bed9Jeff Vander Stoep	fprintf(stderr, "%s %u\n", __func__, __LINE__);
6571089665e31a647a5f0ba2eabe8ac6232b384bed9Jeff Vander Stoep	cil_expandtypeattribute_init(&new);
6581089665e31a647a5f0ba2eabe8ac6232b384bed9Jeff Vander Stoep
6591089665e31a647a5f0ba2eabe8ac6232b384bed9Jeff Vander Stoep	if (orig->attr_strs != NULL) {
6601089665e31a647a5f0ba2eabe8ac6232b384bed9Jeff Vander Stoep		cil_copy_list(orig->attr_strs, &new->attr_strs);
6611089665e31a647a5f0ba2eabe8ac6232b384bed9Jeff Vander Stoep	}
6621089665e31a647a5f0ba2eabe8ac6232b384bed9Jeff Vander Stoep
6631089665e31a647a5f0ba2eabe8ac6232b384bed9Jeff Vander Stoep	if (orig->attr_datums != NULL) {
6641089665e31a647a5f0ba2eabe8ac6232b384bed9Jeff Vander Stoep		cil_copy_list(orig->attr_datums, &new->attr_datums);
6651089665e31a647a5f0ba2eabe8ac6232b384bed9Jeff Vander Stoep	}
6661089665e31a647a5f0ba2eabe8ac6232b384bed9Jeff Vander Stoep
6671089665e31a647a5f0ba2eabe8ac6232b384bed9Jeff Vander Stoep	new->expand = orig->expand;
6681089665e31a647a5f0ba2eabe8ac6232b384bed9Jeff Vander Stoep
6691089665e31a647a5f0ba2eabe8ac6232b384bed9Jeff Vander Stoep	*copy = new;
6701089665e31a647a5f0ba2eabe8ac6232b384bed9Jeff Vander Stoep
6711089665e31a647a5f0ba2eabe8ac6232b384bed9Jeff Vander Stoep	return SEPOL_OK;
6721089665e31a647a5f0ba2eabe8ac6232b384bed9Jeff Vander Stoep}
6731089665e31a647a5f0ba2eabe8ac6232b384bed9Jeff Vander Stoep
674b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_alias(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
675b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
676b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_alias *orig = data;
677b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_alias *new = NULL;
678b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	char *key = orig->datum.name;
679b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_symtab_datum *datum = NULL;
680b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
681b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_symtab_get_datum(symtab, key, &datum);
682b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (datum != NULL) {
683b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_log(CIL_INFO, "cil_copy_alias: alias cannot be redefined\n");
684b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		return SEPOL_ERR;
685b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
686b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
687b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_alias_init(&new);
688b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
689b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
690b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
691b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
692b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
693b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
694b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_aliasactual(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused))symtab_t *symtab)
695b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
696b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_aliasactual *orig = data;
697b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_aliasactual *new = NULL;
698b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
699b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_aliasactual_init(&new);
700b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
701b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->alias_str = orig->alias_str;
702b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->actual_str = orig->actual_str;
703b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
704b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
705b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
706b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
707b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
708b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
709b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_roletransition(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
710b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
711b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_roletransition *orig = data;
712b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_roletransition *new = NULL;
713b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
714b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_roletransition_init(&new);
715b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
716b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->src_str = orig->src_str;
717b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->tgt_str = orig->tgt_str;
718b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->obj_str = orig->obj_str;
719b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->result_str = orig->result_str;
720b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
721b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
722b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
723b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
724b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
725b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
726b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_nametypetransition(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
727b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
728b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_nametypetransition *orig = data;
729b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_nametypetransition *new = NULL;
730b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
731b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_nametypetransition_init(&new);
732b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
733b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->src_str = orig->src_str;
734b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->tgt_str = orig->tgt_str;
735b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->obj_str = orig->obj_str;
736b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->name_str = orig->name_str;
737b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->result_str = orig->result_str;
738b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
739b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
740b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
741b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
742b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
743b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
744b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
745b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_rangetransition(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
746b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
747b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_rangetransition *orig = data;
748b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_rangetransition *new = NULL;
749b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
750b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_rangetransition_init(&new);
751b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
752b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->src_str = orig->src_str;
753b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->exec_str = orig->exec_str;
754b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->obj_str = orig->obj_str;
755b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
756b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig->range_str != NULL) {
757b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		new->range_str = orig->range_str;
758b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
759b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_levelrange_init(&new->range);
760b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_copy_fill_levelrange(db, orig->range, new->range);
761b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
762b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
763b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
764b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
765b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
766b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
767b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
768b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_bool(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
769b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
770b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_bool *orig = data;
771b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_bool *new = NULL;
772b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	char *key = orig->datum.name;
773b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_symtab_datum *datum = NULL;
774b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
775b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_symtab_get_datum(symtab, key, &datum);
776b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (datum != NULL) {
777b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_log(CIL_INFO, "cil_copy_bool: boolean cannot be redefined\n");
778b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		return SEPOL_ERR;
779b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
780b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
781b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_bool_init(&new);
782b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->value = orig->value;
783b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
784b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
785b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
786b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
787b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
788b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_tunable(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
789b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
790b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_tunable *orig = data;
791b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_tunable *new = NULL;
792b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	char *key = orig->datum.name;
793b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_symtab_datum *datum = NULL;
794b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
795b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_symtab_get_datum(symtab, key, &datum);
796b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (datum != NULL) {
797b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_log(CIL_INFO, "cil_copy_tunable: tunable cannot be redefined\n");
798b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		return SEPOL_ERR;
799b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
800b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
801b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_tunable_init(&new);
802b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->value = orig->value;
803b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
804b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
805b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
806b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
807b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
808f5602f5ff980435ee2aefed35ba643310ceeac25Steve Lawrencevoid cil_copy_fill_permissionx(struct cil_db *db, struct cil_permissionx *orig, struct cil_permissionx *new)
809f5602f5ff980435ee2aefed35ba643310ceeac25Steve Lawrence{
810f5602f5ff980435ee2aefed35ba643310ceeac25Steve Lawrence	new->kind = orig->kind;
811f5602f5ff980435ee2aefed35ba643310ceeac25Steve Lawrence	new->obj_str = orig->obj_str;
812f5602f5ff980435ee2aefed35ba643310ceeac25Steve Lawrence	cil_copy_expr(db, orig->expr_str, &new->expr_str);
813f5602f5ff980435ee2aefed35ba643310ceeac25Steve Lawrence}
814f5602f5ff980435ee2aefed35ba643310ceeac25Steve Lawrence
815172ce53ffa793e69632923b5323fc8c2220b3294Nicolas Ioossint cil_copy_avrule(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
816b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
817b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_avrule *orig = data;
818b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_avrule *new = NULL;
819b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
820b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_avrule_init(&new);
821b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
822f5602f5ff980435ee2aefed35ba643310ceeac25Steve Lawrence	new->is_extended = orig->is_extended;
823b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->rule_kind = orig->rule_kind;
824b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->src_str = orig->src_str;
825b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->tgt_str = orig->tgt_str;
826f5602f5ff980435ee2aefed35ba643310ceeac25Steve Lawrence
827f5602f5ff980435ee2aefed35ba643310ceeac25Steve Lawrence	if (!new->is_extended) {
828f5602f5ff980435ee2aefed35ba643310ceeac25Steve Lawrence		cil_copy_classperms_list(orig->perms.classperms, &new->perms.classperms);
829f5602f5ff980435ee2aefed35ba643310ceeac25Steve Lawrence	} else {
830f5602f5ff980435ee2aefed35ba643310ceeac25Steve Lawrence		if (new->perms.x.permx_str != NULL) {
831f5602f5ff980435ee2aefed35ba643310ceeac25Steve Lawrence			new->perms.x.permx_str = orig->perms.x.permx_str;
832f5602f5ff980435ee2aefed35ba643310ceeac25Steve Lawrence		} else {
833f5602f5ff980435ee2aefed35ba643310ceeac25Steve Lawrence			cil_permissionx_init(&new->perms.x.permx);
834f5602f5ff980435ee2aefed35ba643310ceeac25Steve Lawrence			cil_copy_fill_permissionx(db, orig->perms.x.permx, new->perms.x.permx);
835f5602f5ff980435ee2aefed35ba643310ceeac25Steve Lawrence		}
836f5602f5ff980435ee2aefed35ba643310ceeac25Steve Lawrence	}
837b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
838b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
839b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
840b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
841b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
842b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
843ef93dfe0393c4a60483c3f7729dd98a2f886606aSteve Lawrenceint cil_copy_permissionx(struct cil_db *db, void *data, void **copy, symtab_t *symtab)
844ef93dfe0393c4a60483c3f7729dd98a2f886606aSteve Lawrence{
845ef93dfe0393c4a60483c3f7729dd98a2f886606aSteve Lawrence	struct cil_permissionx *orig = data;
846ef93dfe0393c4a60483c3f7729dd98a2f886606aSteve Lawrence	struct cil_permissionx *new = NULL;
847ef93dfe0393c4a60483c3f7729dd98a2f886606aSteve Lawrence	char *key = orig->datum.name;
848ef93dfe0393c4a60483c3f7729dd98a2f886606aSteve Lawrence	struct cil_symtab_datum *datum = NULL;
849ef93dfe0393c4a60483c3f7729dd98a2f886606aSteve Lawrence
850ef93dfe0393c4a60483c3f7729dd98a2f886606aSteve Lawrence
851ef93dfe0393c4a60483c3f7729dd98a2f886606aSteve Lawrence	cil_symtab_get_datum(symtab, key, &datum);
852ef93dfe0393c4a60483c3f7729dd98a2f886606aSteve Lawrence	if (datum != NULL) {
853ef93dfe0393c4a60483c3f7729dd98a2f886606aSteve Lawrence		cil_log(CIL_INFO, "cil_copy_permissionx: permissionx cannot be redefined\n");
854ef93dfe0393c4a60483c3f7729dd98a2f886606aSteve Lawrence		return SEPOL_ERR;
855ef93dfe0393c4a60483c3f7729dd98a2f886606aSteve Lawrence	}
856ef93dfe0393c4a60483c3f7729dd98a2f886606aSteve Lawrence
857ef93dfe0393c4a60483c3f7729dd98a2f886606aSteve Lawrence	cil_permissionx_init(&new);
858ef93dfe0393c4a60483c3f7729dd98a2f886606aSteve Lawrence	cil_copy_fill_permissionx(db, orig, new);
859ef93dfe0393c4a60483c3f7729dd98a2f886606aSteve Lawrence
860ef93dfe0393c4a60483c3f7729dd98a2f886606aSteve Lawrence	*copy = new;
861ef93dfe0393c4a60483c3f7729dd98a2f886606aSteve Lawrence
862ef93dfe0393c4a60483c3f7729dd98a2f886606aSteve Lawrence	return SEPOL_OK;
863ef93dfe0393c4a60483c3f7729dd98a2f886606aSteve Lawrence}
864ef93dfe0393c4a60483c3f7729dd98a2f886606aSteve Lawrence
865b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_type_rule(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
866b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
867b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_type_rule  *orig = data;
868b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_type_rule *new = NULL;
869b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
870b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_type_rule_init(&new);
871b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
872b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->rule_kind = orig->rule_kind;
873b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->src_str = orig->src_str;
874b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->tgt_str = orig->tgt_str;
875b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->obj_str = orig->obj_str;
876b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->result_str = orig->result_str;
877b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
878b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
879b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
880b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
881b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
882b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
883b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_sens(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
884b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
885b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_sens *orig = data;
886b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	char *key = orig->datum.name;
887b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_symtab_datum *datum = NULL;
888b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
889b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_symtab_get_datum(symtab, key, &datum);
890b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (datum == NULL) {
891b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		struct cil_sens *new;
892b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_sens_init(&new);
893b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		*copy = new;
894b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
895b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		*copy = datum;
896b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
897b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
898b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
899b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
900b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
901b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_cat(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
902b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
903b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_cat *orig = data;
904b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	char *key = orig->datum.name;
905b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_symtab_datum *datum = NULL;
906b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
907b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_symtab_get_datum(symtab, key, &datum);
908b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (datum == NULL) {
909b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		struct cil_cat *new;
910b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_cat_init(&new);
911b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		*copy = new;
912b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
913b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		*copy = datum;
914b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
915b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
916b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
917b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
918b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
919b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid cil_copy_cats(struct cil_db *db, struct cil_cats *orig, struct cil_cats **new)
920b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
921b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_cats_init(new);
922b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_copy_expr(db, orig->str_expr, &(*new)->str_expr);
923b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_copy_expr(db, orig->datum_expr, &(*new)->datum_expr);
924b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
925b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
926b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_catset(struct cil_db *db, void *data, void **copy, symtab_t *symtab)
927b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
928b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_catset *orig = data;
929b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_catset *new = NULL;
930b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	char *key = orig->datum.name;
931b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_symtab_datum *datum = NULL;
932b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
933b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_symtab_get_datum(symtab, key, &datum);
934b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (datum != NULL) {
935b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_log(CIL_INFO, "cil_copy_catset: categoryset cannot be redefined\n");
936b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		return SEPOL_ERR;
937b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
938b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
939b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_catset_init(&new);
940b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
941b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_copy_cats(db, orig->cats, &new->cats);
942b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
943b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
944b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
945b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
946b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
947b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
948b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_senscat(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
949b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
950b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_senscat *orig = data;
951b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_senscat *new = NULL;
952b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
953b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_senscat_init(&new);
954b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
955b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->sens_str = orig->sens_str;
956b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
957b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_copy_cats(db, orig->cats, &new->cats);
958b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
959b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
960b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
961b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
962b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
963b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
964b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_catorder(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
965b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
966b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_catorder *orig = data;
967b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_catorder *new = NULL;
968b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
969b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_catorder_init(&new);
970b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig->cat_list_str != NULL) {
971b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_copy_list(orig->cat_list_str, &new->cat_list_str);
972b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
973b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
974b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
975b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
976b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
977b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
978b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
979b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_sensitivityorder(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
980b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
981b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_sensorder *orig = data;
982b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_sensorder *new = NULL;
983b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
984b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_sensorder_init(&new);
985b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig->sens_list_str != NULL) {
986b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_copy_list(orig->sens_list_str, &new->sens_list_str);
987b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
988b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
989b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
990b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
991b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
992b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
993b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
994b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid cil_copy_fill_level(struct cil_db *db, struct cil_level *orig, struct cil_level **new)
995b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
996b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_level_init(new);
997b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
998b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	(*new)->sens_str = orig->sens_str;
999b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1000b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig->cats != NULL) {
1001b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_copy_cats(db, orig->cats, &(*new)->cats);
1002b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1003b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1004b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1005b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_level(struct cil_db *db, void *data, void **copy, symtab_t *symtab)
1006b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1007b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_level *orig = data;
1008b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_level *new = NULL;
1009b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	char *key = orig->datum.name;
1010b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_symtab_datum *datum = NULL;
1011b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1012b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (key != NULL) {
1013b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_symtab_get_datum(symtab, key, &datum);
1014b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		if (datum != NULL) {
1015b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			cil_log(CIL_INFO, "cil_copy_level: level cannot be redefined\n");
1016b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			return SEPOL_ERR;
1017b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		}
1018b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1019b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1020b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_copy_fill_level(db, orig, &new);
1021b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1022b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
1023b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1024b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1025b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1026b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1027b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid cil_copy_fill_levelrange(struct cil_db *db, struct cil_levelrange *data, struct cil_levelrange *new)
1028b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1029b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (data->low_str != NULL) {
1030b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		new->low_str = data->low_str;
1031b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
1032b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_copy_fill_level(db, data->low, &new->low);
1033b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1034b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1035b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (data->high_str != NULL) {
1036b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		new->high_str = data->high_str;
1037b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
1038b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_copy_fill_level(db, data->high, &new->high);
1039b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1040b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1041b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1042b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_levelrange(struct cil_db *db, void *data, void **copy, symtab_t *symtab)
1043b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1044b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_levelrange *orig = data;
1045b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_levelrange *new = NULL;
1046b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	char *key = orig->datum.name;
1047b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_symtab_datum *datum = NULL;
1048b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1049b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (key != NULL) {
1050b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_symtab_get_datum(symtab, key, &datum);
1051b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		if (datum != NULL) {
1052b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			cil_log(CIL_INFO, "cil_copy_levelrange: levelrange cannot be redefined\n");
1053b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			return SEPOL_ERR;
1054b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		}
1055b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1056b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1057b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_levelrange_init(&new);
1058b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_copy_fill_levelrange(db, orig, new);
1059b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1060b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
1061b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1062b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1063b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1064b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1065b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid cil_copy_fill_context(struct cil_db *db, struct cil_context *data, struct cil_context *new)
1066b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1067b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->user_str = data->user_str;
1068b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->role_str = data->role_str;
1069b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->type_str = data->type_str;
1070b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1071b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (data->range_str != NULL) {
1072b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		new->range_str = data->range_str;
1073b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
1074b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_levelrange_init(&new->range);
1075b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_copy_fill_levelrange(db, data->range, new->range);
1076b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1077b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1078b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1079b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_context(struct cil_db *db, void *data, void **copy, symtab_t *symtab)
1080b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1081b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_context *orig = data;
1082b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_context *new = NULL;
1083b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	char *key = orig->datum.name;
1084b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_symtab_datum *datum = NULL;
1085b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1086b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (key != NULL) {
1087b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_symtab_get_datum(symtab, key, &datum);
1088b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		if (datum != NULL) {
1089b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			cil_log(CIL_INFO, "cil_copy_context: context cannot be redefined\n");
1090b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			return SEPOL_ERR;
1091b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		}
1092b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1093b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1094b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_context_init(&new);
1095b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_copy_fill_context(db, orig, new);
1096b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1097b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
1098b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1099b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1100b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1101b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1102b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_netifcon(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
1103b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1104b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_netifcon *orig = data;
1105b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_netifcon *new = NULL;
1106b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1107b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_netifcon_init(&new);
1108b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1109b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->interface_str = orig->interface_str;
1110b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1111b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig->if_context_str != NULL) {
1112b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		new->if_context_str = orig->if_context_str;
1113b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
1114b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_context_init(&new->if_context);
1115b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_copy_fill_context(db, orig->if_context, new->if_context);
1116b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1117b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1118b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig->packet_context_str != NULL) {
1119b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		new->packet_context_str = orig->packet_context_str;
1120b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
1121b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_context_init(&new->packet_context);
1122b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_copy_fill_context(db, orig->packet_context, new->packet_context);
1123b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1124b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1125b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
1126b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1127b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1128b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1129b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1130b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_genfscon(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
1131b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1132b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_genfscon *orig = data;
1133b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_genfscon *new = NULL;
1134b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1135b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_genfscon_init(&new);
1136b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1137b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->fs_str = orig->fs_str;
1138b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->path_str = orig->path_str;
1139b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1140b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig->context_str != NULL) {
1141b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		new->context_str = orig->context_str;
1142b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
1143b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_context_init(&new->context);
1144b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_copy_fill_context(db, orig->context, new->context);
1145b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1146b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1147b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
1148b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1149b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1150b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1151b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1152b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_filecon(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
1153b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1154b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_filecon *orig = data;
1155b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_filecon *new = NULL;
1156b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1157b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_filecon_init(&new);
1158b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1159b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->path_str = orig->path_str;
1160b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->type = orig->type;
1161b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1162b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig->context_str != NULL) {
1163b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		new->context_str = orig->context_str;
1164b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else if (orig->context != NULL) {
1165b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_context_init(&new->context);
1166b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_copy_fill_context(db, orig->context, new->context);
1167b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1168b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1169b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
1170b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1171b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1172b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1173b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1174b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_nodecon(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
1175b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1176b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_nodecon *orig = data;
1177b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_nodecon *new = NULL;
1178b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1179b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_nodecon_init(&new);
1180b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1181b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig->addr_str != NULL) {
1182b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		new->addr_str = orig->addr_str;
1183b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
1184b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_ipaddr_init(&new->addr);
1185b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_copy_fill_ipaddr(orig->addr, new->addr);
1186b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1187b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1188b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig->mask_str != NULL) {
1189b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		new->mask_str = orig->mask_str;
1190b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
1191b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_ipaddr_init(&new->mask);
1192b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_copy_fill_ipaddr(orig->mask, new->mask);
1193b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1194b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1195b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig->context_str != NULL) {
1196b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		new->context_str = orig->context_str;
1197b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
1198b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_context_init(&new->context);
1199b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_copy_fill_context(db, orig->context, new->context);
1200b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1201b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1202b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
1203b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1204b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1205b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1206b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1207b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_portcon(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
1208b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1209b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_portcon *orig = data;
1210b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_portcon *new = NULL;
1211b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1212b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_portcon_init(&new);
1213b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1214b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->proto = orig->proto;
1215b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->port_low = orig->port_low;
1216b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->port_high = orig->port_high;
1217b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1218b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig->context_str != NULL) {
1219b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		new->context_str = orig->context_str;
1220b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
1221b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_context_init(&new->context);
1222b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_copy_fill_context(db, orig->context, new->context);
1223b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1224b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1225b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
1226b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1227b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1228b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1229b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1230b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_pirqcon(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
1231b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1232b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_pirqcon *orig = data;
1233b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_pirqcon *new = NULL;
1234b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1235b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_pirqcon_init(&new);
1236b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1237b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->pirq = orig->pirq;
1238b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1239b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig->context_str != NULL) {
1240b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		new->context_str = orig->context_str;
1241b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
1242b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_context_init(&new->context);
1243b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_copy_fill_context(db, orig->context, new->context);
1244b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1245b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1246b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
1247b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1248b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1249b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1250b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1251b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_iomemcon(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
1252b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1253b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_iomemcon *orig = data;
1254b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_iomemcon *new = NULL;
1255b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1256b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_iomemcon_init(&new);
1257b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1258b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->iomem_low = orig->iomem_low;
1259b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->iomem_high = orig->iomem_high;
1260b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1261b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig->context_str != NULL) {
1262b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		new->context_str = orig->context_str;
1263b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
1264b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_context_init(&new->context);
1265b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_copy_fill_context(db, orig->context, new->context);
1266b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1267b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1268b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
1269b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1270b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1271b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1272b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1273b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_ioportcon(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
1274b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1275b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_ioportcon *orig = data;
1276b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_ioportcon *new = NULL;
1277b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1278b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_ioportcon_init(&new);
1279b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1280b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->ioport_low = orig->ioport_low;
1281b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->ioport_high = orig->ioport_high;
1282b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1283b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig->context_str != NULL) {
1284b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		new->context_str = orig->context_str;
1285b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
1286b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_context_init(&new->context);
1287b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_copy_fill_context(db, orig->context, new->context);
1288b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1289b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1290b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
1291b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1292b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1293b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1294b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1295b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_pcidevicecon(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
1296b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1297b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_pcidevicecon *orig = data;
1298b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_pcidevicecon *new = NULL;
1299b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1300b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_pcidevicecon_init(&new);
1301b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1302b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->dev = orig->dev;
1303b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1304b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig->context_str != NULL) {
1305b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		new->context_str = orig->context_str;
1306b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
1307b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_context_init(&new->context);
1308b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_copy_fill_context(db, orig->context, new->context);
1309b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1310b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1311b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
1312b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1313b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1314b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1315b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1316f0290677091e7eee4a3724a2a86ede9e11f93802Daniel De Graafint cil_copy_devicetreecon(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
1317f0290677091e7eee4a3724a2a86ede9e11f93802Daniel De Graaf{
1318f0290677091e7eee4a3724a2a86ede9e11f93802Daniel De Graaf	struct cil_devicetreecon *orig = data;
1319f0290677091e7eee4a3724a2a86ede9e11f93802Daniel De Graaf	struct cil_devicetreecon *new = NULL;
1320f0290677091e7eee4a3724a2a86ede9e11f93802Daniel De Graaf
1321f0290677091e7eee4a3724a2a86ede9e11f93802Daniel De Graaf	cil_devicetreecon_init(&new);
1322f0290677091e7eee4a3724a2a86ede9e11f93802Daniel De Graaf
1323f0290677091e7eee4a3724a2a86ede9e11f93802Daniel De Graaf	new->path = orig->path;
1324f0290677091e7eee4a3724a2a86ede9e11f93802Daniel De Graaf
1325f0290677091e7eee4a3724a2a86ede9e11f93802Daniel De Graaf	if (orig->context_str != NULL) {
1326f0290677091e7eee4a3724a2a86ede9e11f93802Daniel De Graaf		new->context_str = orig->context_str;
1327f0290677091e7eee4a3724a2a86ede9e11f93802Daniel De Graaf	} else {
1328f0290677091e7eee4a3724a2a86ede9e11f93802Daniel De Graaf		cil_context_init(&new->context);
1329f0290677091e7eee4a3724a2a86ede9e11f93802Daniel De Graaf		cil_copy_fill_context(db, orig->context, new->context);
1330f0290677091e7eee4a3724a2a86ede9e11f93802Daniel De Graaf	}
1331f0290677091e7eee4a3724a2a86ede9e11f93802Daniel De Graaf
1332f0290677091e7eee4a3724a2a86ede9e11f93802Daniel De Graaf	*copy = new;
1333f0290677091e7eee4a3724a2a86ede9e11f93802Daniel De Graaf
1334f0290677091e7eee4a3724a2a86ede9e11f93802Daniel De Graaf	return SEPOL_OK;
1335f0290677091e7eee4a3724a2a86ede9e11f93802Daniel De Graaf}
1336f0290677091e7eee4a3724a2a86ede9e11f93802Daniel De Graaf
1337b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_fsuse(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
1338b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1339b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_fsuse *orig = data;
1340b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_fsuse *new = NULL;
1341b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1342b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_fsuse_init(&new);
1343b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1344b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->type = orig->type;
1345b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->fs_str = orig->fs_str;
1346b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1347b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig->context_str != NULL) {
1348b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		new->context_str = orig->context_str;
1349b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
1350b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_context_init(&new->context);
1351b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_copy_fill_context(db, orig->context, new->context);
1352b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1353b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1354b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
1355b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1356b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1357b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1358b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1359b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_expr(struct cil_db *db, struct cil_list *orig, struct cil_list **new)
1360b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1361b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_list_item *curr;
1362b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1363b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig == NULL) {
1364b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		*new = NULL;
1365b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		return SEPOL_OK;
1366b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1367b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1368b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_list_init(new, orig->flavor);
1369b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1370b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_list_for_each(curr, orig) {
1371b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		switch (curr->flavor) {
1372b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		case CIL_LIST: {
1373b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			struct cil_list *sub_list;
1374b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			cil_copy_expr(db, curr->data, &sub_list);
1375b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			cil_list_append(*new, CIL_LIST, sub_list);
1376b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			break;
1377b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		}
1378b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		case CIL_STRING:
1379b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			cil_list_append(*new, CIL_STRING, curr->data);
1380b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			break;
1381b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		case CIL_DATUM:
1382b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			cil_list_append(*new, curr->flavor, curr->data);
1383b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			break;
1384b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		case CIL_OP:
1385b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			cil_list_append(*new, curr->flavor, curr->data);
1386b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			break;
1387b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		case CIL_CONS_OPERAND:
1388b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			cil_list_append(*new, curr->flavor, curr->data);
1389b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			break;
1390b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		default:
1391b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			cil_log(CIL_INFO, "Unknown flavor %d in expression being copied\n",curr->flavor);
1392b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			cil_list_append(*new, curr->flavor, curr->data);
1393b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			break;
1394b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		}
1395b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1396b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1397b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1398b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1399b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1400b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_constrain(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
1401b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1402b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_constrain *orig = data;
1403b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_constrain *new = NULL;
1404b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1405b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_constrain_init(&new);
1406b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_copy_classperms_list(orig->classperms, &new->classperms);
1407b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1408b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_copy_expr(db, orig->str_expr, &new->str_expr);
1409b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_copy_expr(db, orig->datum_expr, &new->datum_expr);
1410b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1411b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
1412b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1413b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1414b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1415b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1416b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_validatetrans(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
1417b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1418b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_validatetrans *orig = data;
1419b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_validatetrans *new = NULL;
1420b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1421b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_validatetrans_init(&new);
1422b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1423b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->class_str = orig->class_str;
1424b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1425b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_copy_expr(db, orig->str_expr, &new->str_expr);
1426b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_copy_expr(db, orig->datum_expr, &new->datum_expr);
1427b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1428b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
1429b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1430b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1431b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1432b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1433b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_call(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
1434b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1435b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_call *orig = data;
1436b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_call *new = NULL;
1437b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	int rc = SEPOL_ERR;
1438b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1439b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_call_init(&new);
1440b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1441b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->macro_str = orig->macro_str;
144276ba6eaa7333483a8cc0c73a7880f7acf99c2656Steve Lawrence	new->macro = orig->macro;
1443b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1444b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig->args_tree != NULL) {
1445b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_tree_init(&new->args_tree);
1446b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		rc = cil_copy_ast(db, orig->args_tree->root, new->args_tree->root);
1447b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		if (rc != SEPOL_OK) {
1448b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			goto exit;
1449b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		}
1450b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1451b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1452b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->copied = orig->copied;
1453b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1454b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
1455b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1456b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1457b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1458b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceexit:
1459b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_destroy_call(new);
1460b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return rc;
1461b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1462b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1463b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_macro(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
1464b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1465b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_macro *orig = data;
1466b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	char *key = orig->datum.name;
1467b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_symtab_datum *datum = NULL;
1468b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1469b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_symtab_get_datum(symtab, key, &datum);
1470b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (datum == NULL) {
1471b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		struct cil_macro *new;
1472b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_macro_init(&new);
147376ba6eaa7333483a8cc0c73a7880f7acf99c2656Steve Lawrence		if (orig->params != NULL) {
147476ba6eaa7333483a8cc0c73a7880f7acf99c2656Steve Lawrence			cil_copy_list(orig->params, &new->params);
147576ba6eaa7333483a8cc0c73a7880f7acf99c2656Steve Lawrence		}
1476b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1477b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		*copy = new;
1478b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1479b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
1480b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		struct cil_list_item *curr_orig = NULL;
1481b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		struct cil_list_item *curr_new = NULL;
1482b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		struct cil_param *param_orig = NULL;
1483b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		struct cil_param *param_new = NULL;
1484b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1485b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		if (((struct cil_macro*)datum)->params != NULL) {
1486b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			curr_new = ((struct cil_macro*)datum)->params->head;
1487b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		}
1488b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1489b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		if (orig->params != NULL) {
1490b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			curr_orig = orig->params->head;
1491b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		}
1492b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1493b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		if (curr_orig != NULL && curr_new != NULL) {
1494b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			while (curr_orig != NULL) {
1495b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence				if (curr_new == NULL) {
1496b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence					goto exit;
1497b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence				}
1498b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1499b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence				param_orig = (struct cil_param*)curr_orig->data;
1500b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence				param_new = (struct cil_param*)curr_new->data;
1501b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence				if (param_orig->str != param_new->str) {
1502b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence					goto exit;
1503b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence				} else if (param_orig->flavor != param_new->flavor) {
1504b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence					goto exit;
1505b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence				}
1506b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1507b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence				curr_orig = curr_orig->next;
1508b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence				curr_new = curr_new->next;
1509b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			}
1510b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1511b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			if (curr_new != NULL) {
1512b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence				goto exit;
1513b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			}
1514b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		} else if (!(curr_orig == NULL && curr_new == NULL)) {
1515b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			goto exit;
1516b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		}
1517b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1518b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		*copy = datum;
1519b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1520b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1521b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1522b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1523b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceexit:
1524b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_log(CIL_INFO, "cil_copy_macro: macro cannot be redefined\n");
1525b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_ERR;
1526b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1527b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1528b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_optional(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
1529b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1530b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_optional *orig = data;
1531b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	char *key = orig->datum.name;
1532b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_symtab_datum *datum = NULL;
1533b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1534b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_symtab_get_datum(symtab, key, &datum);
1535b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (datum == NULL) {
1536b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		struct cil_optional *new;
1537b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_optional_init(&new);
1538b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		*copy = new;
1539b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
1540b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		*copy = datum;
1541b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1542b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1543b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1544b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1545b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1546b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrencevoid cil_copy_fill_ipaddr(struct cil_ipaddr *data, struct cil_ipaddr *new)
1547b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1548b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->family = data->family;
1549b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	memcpy(&new->ip, &data->ip, sizeof(data->ip));
1550b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1551b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1552b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_ipaddr(__attribute__((unused)) struct cil_db *db, void *data, void **copy, symtab_t *symtab)
1553b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1554b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_ipaddr *orig = data;
1555b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_ipaddr *new = NULL;
1556b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	char * key = orig->datum.name;
1557b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_symtab_datum *datum = NULL;
1558b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1559b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_symtab_get_datum(symtab, key, &datum);
1560b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (datum != NULL) {
1561b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_log(CIL_INFO, "cil_copy_ipaddr: ipaddress cannot be redefined\n");
1562b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		return SEPOL_ERR;
1563b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1564b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1565b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_ipaddr_init(&new);
1566b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_copy_fill_ipaddr(orig, new);
1567b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1568b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
1569b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1570b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1571b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1572b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1573b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_condblock(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
1574b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1575b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_condblock *orig = data;
1576b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_condblock *new = *copy;
1577b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_condblock_init(&new);
1578b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->flavor = orig->flavor;
1579b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
1580b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1581b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1582b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1583b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1584b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_boolif(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
1585b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1586b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_booleanif *orig = data;
1587b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_booleanif *new = NULL;
1588b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1589b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_boolif_init(&new);
1590b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1591b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_copy_expr(db, orig->str_expr, &new->str_expr);
1592b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_copy_expr(db, orig->datum_expr, &new->datum_expr);
1593b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->preserved_tunable = orig->preserved_tunable;
1594b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1595b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
1596b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1597b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1598b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1599b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1600b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_tunif(struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
1601b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1602b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_tunableif *orig = data;
1603b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_tunableif *new = NULL;
1604b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1605b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_tunif_init(&new);
1606b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1607b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_copy_expr(db, orig->str_expr, &new->str_expr);
1608b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_copy_expr(db, orig->datum_expr, &new->datum_expr);
1609b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1610b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
1611b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1612b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1613b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1614b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1615b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_default(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
1616b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1617b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_default *orig = data;
1618b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_default *new = NULL;
1619b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1620b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_default_init(&new);
1621b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1622b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->flavor = orig->flavor;
1623b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1624b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig->class_strs != NULL) {
1625b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_copy_list(orig->class_strs, &new->class_strs);
1626b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1627b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1628b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->object = orig->object;
1629b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1630b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
1631b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1632b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1633b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1634b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1635b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_defaultrange(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
1636b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1637b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_defaultrange *orig = data;
1638b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_defaultrange *new = NULL;
1639b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1640b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_defaultrange_init(&new);
1641b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1642b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig->class_strs != NULL) {
1643b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_copy_list(orig->class_strs, &new->class_strs);
1644b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1645b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1646b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->object_range = orig->object_range;
1647b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1648b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
1649b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1650b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1651b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1652b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1653b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_handleunknown(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
1654b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1655b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_handleunknown *orig = data;
1656b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_handleunknown *new = NULL;
1657b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1658b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_handleunknown_init(&new);
1659b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->handle_unknown = orig->handle_unknown;
1660b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
1661b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1662b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1663b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1664b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1665b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_mls(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
1666b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1667b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_mls *orig = data;
1668b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_mls *new = NULL;
1669b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1670b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_mls_init(&new);
1671b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->value = orig->value;
1672b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
1673b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1674b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1675b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1676b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1677b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_bounds(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
1678b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1679b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_bounds *orig = data;
1680b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_bounds *new = NULL;
1681b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1682b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_bounds_init(&new);
1683b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1684b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->parent_str = orig->parent_str;
1685b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	new->child_str = orig->child_str;
1686b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1687b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	*copy = new;
1688b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1689b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
1690b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
1691b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1692875a6bcbe8885c927122c6931b3a01d821e04b10James Carterint cil_copy_src_info(__attribute__((unused)) struct cil_db *db, void *data, void **copy, __attribute__((unused)) symtab_t *symtab)
1693875a6bcbe8885c927122c6931b3a01d821e04b10James Carter{
1694875a6bcbe8885c927122c6931b3a01d821e04b10James Carter	struct cil_src_info *orig = data;
1695875a6bcbe8885c927122c6931b3a01d821e04b10James Carter	struct cil_src_info *new = NULL;
1696875a6bcbe8885c927122c6931b3a01d821e04b10James Carter
1697875a6bcbe8885c927122c6931b3a01d821e04b10James Carter	cil_src_info_init(&new);
1698875a6bcbe8885c927122c6931b3a01d821e04b10James Carter
1699875a6bcbe8885c927122c6931b3a01d821e04b10James Carter	new->is_cil = orig->is_cil;
1700875a6bcbe8885c927122c6931b3a01d821e04b10James Carter	new->path = orig->path;
1701875a6bcbe8885c927122c6931b3a01d821e04b10James Carter
1702875a6bcbe8885c927122c6931b3a01d821e04b10James Carter	*copy = new;
1703875a6bcbe8885c927122c6931b3a01d821e04b10James Carter
1704875a6bcbe8885c927122c6931b3a01d821e04b10James Carter	return SEPOL_OK;
1705875a6bcbe8885c927122c6931b3a01d821e04b10James Carter}
1706875a6bcbe8885c927122c6931b3a01d821e04b10James Carter
1707b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint __cil_copy_node_helper(struct cil_tree_node *orig, __attribute__((unused)) uint32_t *finished, void *extra_args)
1708b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
1709b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	int rc = SEPOL_ERR;
1710b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_tree_node *parent = NULL;
1711b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_tree_node *new = NULL;
1712b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_db *db = NULL;
1713b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_args_copy *args = NULL;
1714b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_tree_node *namespace = NULL;
1715b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_param *param = NULL;
1716b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	enum cil_sym_index sym_index = CIL_SYM_UNKNOWN;
1717b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	symtab_t *symtab = NULL;
1718b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	void *data = NULL;
1719b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	int (*copy_func)(struct cil_db *db, void *data, void **copy, symtab_t *symtab) = NULL;
172076ba6eaa7333483a8cc0c73a7880f7acf99c2656Steve Lawrence	struct cil_blockinherit *blockinherit = NULL;
1721b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1722b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig == NULL || extra_args == NULL) {
1723b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		goto exit;
1724b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1725b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1726b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	args = extra_args;
1727b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	parent = args->dest;
1728b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	db = args->db;
1729b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1730b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1731b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	switch (orig->flavor) {
1732b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_BLOCK:
1733b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_block;
1734b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1735b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_BLOCKABSTRACT:
1736b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_blockabstract;
1737b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1738b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_BLOCKINHERIT:
1739b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_blockinherit;
1740b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1741b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_POLICYCAP:
1742b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_policycap;
1743b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1744b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_PERM:
1745b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_MAP_PERM:
1746b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_perm;
1747b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1748b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_CLASSMAPPING:
1749b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_classmapping;
1750b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1751b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_CLASS:
1752b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_COMMON:
1753b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_MAP_CLASS:
1754b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_class;
1755b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1756b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_CLASSORDER:
1757b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_classorder;
1758b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1759b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_CLASSPERMISSION:
1760b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_classpermission;
1761b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1762b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_CLASSPERMISSIONSET:
1763b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_classpermissionset;
1764b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1765b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_CLASSCOMMON:
1766b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_classcommon;
1767b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1768b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_SID:
1769b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_sid;
1770b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1771b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_SIDCONTEXT:
1772b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_sidcontext;
1773b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1774b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_SIDORDER:
1775b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_sidorder;
1776b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1777b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_USER:
1778b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_user;
1779b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
178077779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy	case CIL_USERATTRIBUTE:
178177779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy		copy_func = &cil_copy_userattribute;
178277779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy		break;
178377779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy	case CIL_USERATTRIBUTESET:
178477779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy		copy_func = &cil_copy_userattributeset;
178577779d2ca5a0c6efd113ff34cee432d5bb951f09Yuli Khodorkovskiy		break;
1786b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_USERROLE:
1787b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_userrole;
1788b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1789b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_USERLEVEL:
1790b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_userlevel;
1791b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1792b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_USERRANGE:
1793b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_userrange;
1794b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1795b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_USERBOUNDS:
1796b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_bounds;
1797b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1798b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_USERPREFIX:
1799b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_userprefix;
1800b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1801b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_ROLE:
1802b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_role;
1803b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1804b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_ROLETYPE:
1805b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_roletype;
1806b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1807b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_ROLEBOUNDS:
1808b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_bounds;
1809b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1810b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_ROLEATTRIBUTE:
1811b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_roleattribute;
1812b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1813b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_ROLEATTRIBUTESET:
1814b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_roleattributeset;
1815b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1816b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_ROLEALLOW:
1817b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_roleallow;
1818b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1819b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_TYPE:
1820b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_type;
1821b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1822b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_TYPEBOUNDS:
1823b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_bounds;
1824b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1825b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_TYPEPERMISSIVE:
1826b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = cil_copy_typepermissive;
1827b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1828b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_TYPEATTRIBUTE:
1829b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_typeattribute;
1830b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1831b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_TYPEATTRIBUTESET:
1832b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_typeattributeset;
1833b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
18341089665e31a647a5f0ba2eabe8ac6232b384bed9Jeff Vander Stoep	case CIL_EXPANDTYPEATTRIBUTE:
18351089665e31a647a5f0ba2eabe8ac6232b384bed9Jeff Vander Stoep		copy_func = &cil_copy_expandtypeattribute;
18361089665e31a647a5f0ba2eabe8ac6232b384bed9Jeff Vander Stoep		break;
1837b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_TYPEALIAS:
1838b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_alias;
1839b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1840b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_TYPEALIASACTUAL:
1841b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_aliasactual;
1842b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1843b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_ROLETRANSITION:
1844b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_roletransition;
1845b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1846b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_NAMETYPETRANSITION:
1847b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_nametypetransition;
1848b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1849b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_RANGETRANSITION:
1850b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_rangetransition;
1851b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1852b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_TUNABLE:
1853b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_tunable;
1854b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1855b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_BOOL:
1856b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_bool;
1857b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1858b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_AVRULE:
1859ef93dfe0393c4a60483c3f7729dd98a2f886606aSteve Lawrence	case CIL_AVRULEX:
1860f5602f5ff980435ee2aefed35ba643310ceeac25Steve Lawrence		copy_func = &cil_copy_avrule;
1861ef93dfe0393c4a60483c3f7729dd98a2f886606aSteve Lawrence		break;
1862ef93dfe0393c4a60483c3f7729dd98a2f886606aSteve Lawrence	case CIL_PERMISSIONX:
1863ef93dfe0393c4a60483c3f7729dd98a2f886606aSteve Lawrence		copy_func = &cil_copy_permissionx;
1864ef93dfe0393c4a60483c3f7729dd98a2f886606aSteve Lawrence		break;
1865b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_TYPE_RULE:
1866b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_type_rule;
1867b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1868b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_SENS:
1869b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_sens;
1870b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1871b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_SENSALIAS:
1872b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_alias;
1873b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1874b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_SENSALIASACTUAL:
1875b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_aliasactual;
1876b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1877b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_CAT:
1878b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_cat;
1879b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1880b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_CATALIAS:
1881b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_alias;
1882b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1883b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_CATALIASACTUAL:
1884b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_aliasactual;
1885b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1886b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_CATSET:
1887b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_catset;
1888b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1889b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_SENSCAT:
1890b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_senscat;
1891b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1892b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_CATORDER:
1893b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_catorder;
1894b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1895b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_SENSITIVITYORDER:
1896b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_sensitivityorder;
1897b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1898b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_LEVEL:
1899b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_level;
1900b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1901b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_LEVELRANGE:
1902b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_levelrange;
1903b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1904b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_CONTEXT:
1905b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_context;
1906b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1907b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_NETIFCON:
1908b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_netifcon;
1909b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1910b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_GENFSCON:
1911b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_genfscon;
1912b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1913b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_FILECON:
1914b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_filecon;
1915b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1916b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_NODECON:
1917b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_nodecon;
1918b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1919b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_PORTCON:
1920b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_portcon;
1921b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1922b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_PIRQCON:
1923b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_pirqcon;
1924b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1925b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_IOMEMCON:
1926b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_iomemcon;
1927b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1928b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_IOPORTCON:
1929b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_ioportcon;
1930b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1931b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_PCIDEVICECON:
1932b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_pcidevicecon;
1933b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1934f0290677091e7eee4a3724a2a86ede9e11f93802Daniel De Graaf	case CIL_DEVICETREECON:
1935f0290677091e7eee4a3724a2a86ede9e11f93802Daniel De Graaf		copy_func = &cil_copy_devicetreecon;
1936f0290677091e7eee4a3724a2a86ede9e11f93802Daniel De Graaf		break;
1937b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_FSUSE:
1938b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_fsuse;
1939b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1940b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_CONSTRAIN:
1941b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_MLSCONSTRAIN:
1942b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_constrain;
1943b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1944b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_VALIDATETRANS:
1945b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_MLSVALIDATETRANS:
1946b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_validatetrans;
1947b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1948b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_CALL:
1949b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_call;
1950b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1951b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_MACRO:
1952b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_macro;
1953b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1954b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_NODE:
1955b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_node;
1956b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1957b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_OPTIONAL:
1958b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_optional;
1959b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1960b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_IPADDR:
1961b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_ipaddr;
1962b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1963b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_CONDBLOCK:
1964b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_condblock;
1965b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1966b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_BOOLEANIF:
1967b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_boolif;
1968b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1969b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_TUNABLEIF:
1970b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_tunif;
1971b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1972b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_DEFAULTUSER:
1973b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_DEFAULTROLE:
1974b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_DEFAULTTYPE:
1975b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_default;
1976b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1977b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_DEFAULTRANGE:
1978b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_defaultrange;
1979b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1980b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_HANDLEUNKNOWN:
1981b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_handleunknown;
1982b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1983b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	case CIL_MLS:
1984b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		copy_func = &cil_copy_mls;
1985b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		break;
1986875a6bcbe8885c927122c6931b3a01d821e04b10James Carter	case CIL_SRC_INFO:
1987875a6bcbe8885c927122c6931b3a01d821e04b10James Carter		copy_func = &cil_copy_src_info;
1988875a6bcbe8885c927122c6931b3a01d821e04b10James Carter		break;
1989b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	default:
1990b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		goto exit;
1991b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
1992b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
1993b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (orig->flavor >= CIL_MIN_DECLARATIVE) {
1994b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		rc = cil_flavor_to_symtab_index(orig->flavor, &sym_index);
1995b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		if (rc != SEPOL_OK) {
1996b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			goto exit;
1997b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		}
1998b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
199980afe7b2ce0b06f93b6b3a07e58cab1aee8afc91Steve Lawrence		rc = cil_get_symtab(parent, &symtab, sym_index);
2000b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		if (rc != SEPOL_OK) {
2001b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			goto exit;
2002b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		}
2003b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
2004b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
2005b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	rc = (*copy_func)(db, orig->data, &data, symtab);
2006b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (rc == SEPOL_OK) {
2007b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_tree_node_init(&new);
2008b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
2009b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		new->parent = parent;
2010b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		new->line = orig->line;
2011875a6bcbe8885c927122c6931b3a01d821e04b10James Carter		new->hll_line = orig->hll_line;
2012b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		new->flavor = orig->flavor;
2013b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		new->data = data;
2014b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
2015b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		if (orig->flavor >= CIL_MIN_DECLARATIVE) {
2016eeafde13513b105376f52f93b1fd836d524545f0Nicolas Iooss			/* Check the flavor of data if was found in the destination symtab */
2017eeafde13513b105376f52f93b1fd836d524545f0Nicolas Iooss			if (DATUM(data)->nodes->head && FLAVOR(data) != orig->flavor) {
2018eeafde13513b105376f52f93b1fd836d524545f0Nicolas Iooss				cil_tree_log(orig, CIL_ERR, "Incompatible flavor when trying to copy %s", DATUM(data)->name);
2019eeafde13513b105376f52f93b1fd836d524545f0Nicolas Iooss				cil_tree_log(NODE(data), CIL_ERR, "Note: conflicting declaration");
2020eeafde13513b105376f52f93b1fd836d524545f0Nicolas Iooss				new->flavor = FLAVOR(data);
2021eeafde13513b105376f52f93b1fd836d524545f0Nicolas Iooss				rc = SEPOL_ERR;
2022eeafde13513b105376f52f93b1fd836d524545f0Nicolas Iooss				goto exit;
2023eeafde13513b105376f52f93b1fd836d524545f0Nicolas Iooss			}
2024b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			rc = cil_symtab_insert(symtab, ((struct cil_symtab_datum*)orig->data)->name, ((struct cil_symtab_datum*)data), new);
2025b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
2026b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			namespace = new;
2027b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			while (namespace->flavor != CIL_MACRO && namespace->flavor != CIL_BLOCK && namespace->flavor != CIL_ROOT) {
2028b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence				namespace = namespace->parent;
2029b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			}
2030b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
2031b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			if (namespace->flavor == CIL_MACRO) {
2032b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence				struct cil_macro *macro = namespace->data;
2033b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence				struct cil_list *param_list = macro->params;
2034b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence				if (param_list != NULL) {
2035b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence					struct cil_list_item *item;
2036b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence					cil_list_for_each(item, param_list) {
2037b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence						param = item->data;
2038b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence						if (param->flavor == new->flavor) {
2039b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence							if (param->str == ((struct cil_symtab_datum*)new->data)->name) {
204046b3a555981927b47d6a19bd941ccd99085cce18James Carter								cil_tree_log(orig, CIL_ERR, "%s %s shadows a macro parameter", cil_node_to_string(new), ((struct cil_symtab_datum*)orig->data)->name);
204146b3a555981927b47d6a19bd941ccd99085cce18James Carter								cil_tree_log(namespace, CIL_ERR, "Note: macro declaration");
2042b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence								rc = SEPOL_ERR;
2043b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence								goto exit;
2044b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence							}
2045b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence						}
2046b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence					}
2047b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence				}
2048b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			}
2049b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		}
2050b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
205176ba6eaa7333483a8cc0c73a7880f7acf99c2656Steve Lawrence		if (new->flavor == CIL_BLOCKINHERIT) {
205276ba6eaa7333483a8cc0c73a7880f7acf99c2656Steve Lawrence			blockinherit = new->data;
2053b6e519e54261d14d553a28bcd1fed88f96752c26Steve Lawrence			// if a blockinherit statement is copied before blockinherit are
2054b6e519e54261d14d553a28bcd1fed88f96752c26Steve Lawrence			// resolved (like in an in-statement), the block will not have been
2055b6e519e54261d14d553a28bcd1fed88f96752c26Steve Lawrence			// resolved yet, so there's nothing to append yet. This is fine,
2056b6e519e54261d14d553a28bcd1fed88f96752c26Steve Lawrence			// the copied blockinherit statement will be handled later, as if
2057b6e519e54261d14d553a28bcd1fed88f96752c26Steve Lawrence			// it wasn't in an in-statement
2058b6e519e54261d14d553a28bcd1fed88f96752c26Steve Lawrence			if (blockinherit->block != NULL) {
2059b6e519e54261d14d553a28bcd1fed88f96752c26Steve Lawrence				cil_list_append(blockinherit->block->bi_nodes, CIL_NODE, new);
2060b6e519e54261d14d553a28bcd1fed88f96752c26Steve Lawrence			}
206176ba6eaa7333483a8cc0c73a7880f7acf99c2656Steve Lawrence		}
206276ba6eaa7333483a8cc0c73a7880f7acf99c2656Steve Lawrence
2063b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		if (parent->cl_head == NULL) {
2064b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			parent->cl_head = new;
2065b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			parent->cl_tail = new;
2066b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		} else {
2067b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			parent->cl_tail->next = new;
2068b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			parent->cl_tail = new;
2069b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		}
2070b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
2071b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		if (orig->cl_head != NULL) {
2072b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence			args->dest = new;
2073b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		}
2074b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	} else {
2075b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		goto exit;
2076b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
2077b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
2078b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
2079b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
2080b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceexit:
2081b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	cil_tree_node_destroy(&new);
2082b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return rc;
2083b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
2084b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
2085b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint __cil_copy_last_child_helper(__attribute__((unused)) struct cil_tree_node *orig, void *extra_args)
2086b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
2087b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_tree_node *node = NULL;
2088b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_args_copy *args = NULL;
2089b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
2090b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	args = extra_args;
2091b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	node = args->dest;
2092b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
2093b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (node->flavor != CIL_ROOT) {
2094b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		args->dest = node->parent;
2095b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
2096b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
2097b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
2098b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
2099b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
2100b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence// dest is the parent node to copy into
2101b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence// if the copy is for a call to a macro, dest should be a pointer to the call
2102b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceint cil_copy_ast(struct cil_db *db, struct cil_tree_node *orig, struct cil_tree_node *dest)
2103b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence{
2104b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	int rc = SEPOL_ERR;
2105b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	struct cil_args_copy extra_args;
2106b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
2107b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	extra_args.dest = dest;
2108b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	extra_args.db = db;
2109b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
2110b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	rc = cil_tree_walk(orig, __cil_copy_node_helper, NULL,  __cil_copy_last_child_helper, &extra_args);
2111b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	if (rc != SEPOL_OK) {
2112b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		cil_log(CIL_INFO, "cil_tree_walk failed, rc: %d\n", rc);
2113b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence		goto exit;
2114b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	}
2115b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
2116b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return SEPOL_OK;
2117b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
2118b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrenceexit:
2119b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence	return rc;
2120b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence}
2121b19eafb97feb6389d78e1693f276fc5b10e25bdSteve Lawrence
2122