1 #include <errno.h>
2 #include <stdlib.h>
3 #include <string.h>
4 
5 #include "boolean_internal.h"
6 #include "debug.h"
7 
8 struct sepol_bool {
9 	/* This boolean's name */
10 	char *name;
11 
12 	/* Its value */
13 	int value;
14 };
15 
16 struct sepol_bool_key {
17 	/* This boolean's name */
18 	char *name;
19 };
20 
sepol_bool_key_create(sepol_handle_t * handle,const char * name,sepol_bool_key_t ** key_ptr)21 int sepol_bool_key_create(sepol_handle_t * handle,
22 			  const char *name, sepol_bool_key_t ** key_ptr)
23 {
24 
25 	sepol_bool_key_t *tmp_key =
26 	    (sepol_bool_key_t *) malloc(sizeof(struct sepol_bool_key));
27 
28 	if (!tmp_key) {
29 		ERR(handle, "out of memory, " "could not create boolean key");
30 		return STATUS_ERR;
31 	}
32 
33 	tmp_key->name = strdup(name);
34 	if (!tmp_key->name) {
35 		ERR(handle, "out of memory, " "could not create boolean key");
36 		free(tmp_key);
37 		return STATUS_ERR;
38 	}
39 
40 	*key_ptr = tmp_key;
41 	return STATUS_SUCCESS;
42 }
43 
hidden_def(sepol_bool_key_create)44 hidden_def(sepol_bool_key_create)
45 
46 void sepol_bool_key_unpack(const sepol_bool_key_t * key, const char **name)
47 {
48 
49 	*name = key->name;
50 }
51 
hidden_def(sepol_bool_key_unpack)52 hidden_def(sepol_bool_key_unpack)
53 
54 int sepol_bool_key_extract(sepol_handle_t * handle,
55 			   const sepol_bool_t * boolean,
56 			   sepol_bool_key_t ** key_ptr)
57 {
58 
59 	if (sepol_bool_key_create(handle, boolean->name, key_ptr) < 0) {
60 		ERR(handle, "could not extract key from boolean %s",
61 		    boolean->name);
62 		return STATUS_ERR;
63 	}
64 
65 	return STATUS_SUCCESS;
66 }
67 
sepol_bool_key_free(sepol_bool_key_t * key)68 void sepol_bool_key_free(sepol_bool_key_t * key)
69 {
70 	if (!key)
71 		return;
72 	free(key->name);
73 	free(key);
74 }
75 
sepol_bool_compare(const sepol_bool_t * boolean,const sepol_bool_key_t * key)76 int sepol_bool_compare(const sepol_bool_t * boolean,
77 		       const sepol_bool_key_t * key)
78 {
79 
80 	return strcmp(boolean->name, key->name);
81 }
82 
sepol_bool_compare2(const sepol_bool_t * boolean,const sepol_bool_t * boolean2)83 int sepol_bool_compare2(const sepol_bool_t * boolean,
84 			const sepol_bool_t * boolean2)
85 {
86 
87 	return strcmp(boolean->name, boolean2->name);
88 }
89 
90 /* Name */
sepol_bool_get_name(const sepol_bool_t * boolean)91 const char *sepol_bool_get_name(const sepol_bool_t * boolean)
92 {
93 
94 	return boolean->name;
95 }
96 
hidden_def(sepol_bool_get_name)97 hidden_def(sepol_bool_get_name)
98 
99 int sepol_bool_set_name(sepol_handle_t * handle,
100 			sepol_bool_t * boolean, const char *name)
101 {
102 
103 	char *tmp_name = strdup(name);
104 	if (!tmp_name) {
105 		ERR(handle, "out of memory, could not set boolean name");
106 		return STATUS_ERR;
107 	}
108 	free(boolean->name);
109 	boolean->name = tmp_name;
110 	return STATUS_SUCCESS;
111 }
112 
hidden_def(sepol_bool_set_name)113 hidden_def(sepol_bool_set_name)
114 
115 /* Value */
116 int sepol_bool_get_value(const sepol_bool_t * boolean)
117 {
118 
119 	return boolean->value;
120 }
121 
hidden_def(sepol_bool_get_value)122 hidden_def(sepol_bool_get_value)
123 
124 void sepol_bool_set_value(sepol_bool_t * boolean, int value)
125 {
126 
127 	boolean->value = value;
128 }
129 
hidden_def(sepol_bool_set_value)130 hidden_def(sepol_bool_set_value)
131 
132 /* Create */
133 int sepol_bool_create(sepol_handle_t * handle, sepol_bool_t ** bool_ptr)
134 {
135 
136 	sepol_bool_t *boolean = (sepol_bool_t *) malloc(sizeof(sepol_bool_t));
137 
138 	if (!boolean) {
139 		ERR(handle, "out of memory, "
140 		    "could not create boolean record");
141 		return STATUS_ERR;
142 	}
143 
144 	boolean->name = NULL;
145 	boolean->value = 0;
146 
147 	*bool_ptr = boolean;
148 	return STATUS_SUCCESS;
149 }
150 
hidden_def(sepol_bool_create)151 hidden_def(sepol_bool_create)
152 
153 /* Deep copy clone */
154 int sepol_bool_clone(sepol_handle_t * handle,
155 		     const sepol_bool_t * boolean, sepol_bool_t ** bool_ptr)
156 {
157 
158 	sepol_bool_t *new_bool = NULL;
159 
160 	if (sepol_bool_create(handle, &new_bool) < 0)
161 		goto err;
162 
163 	if (sepol_bool_set_name(handle, new_bool, boolean->name) < 0)
164 		goto err;
165 
166 	new_bool->value = boolean->value;
167 
168 	*bool_ptr = new_bool;
169 	return STATUS_SUCCESS;
170 
171       err:
172 	ERR(handle, "could not clone boolean record");
173 	sepol_bool_free(new_bool);
174 	return STATUS_ERR;
175 }
176 
177 /* Destroy */
sepol_bool_free(sepol_bool_t * boolean)178 void sepol_bool_free(sepol_bool_t * boolean)
179 {
180 
181 	if (!boolean)
182 		return;
183 
184 	free(boolean->name);
185 	free(boolean);
186 }
187 
188 hidden_def(sepol_bool_free)
189