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 	const 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 = name;
34 
35 	*key_ptr = tmp_key;
36 	return STATUS_SUCCESS;
37 }
38 
hidden_def(sepol_bool_key_create)39 hidden_def(sepol_bool_key_create)
40 
41 void sepol_bool_key_unpack(const sepol_bool_key_t * key, const char **name)
42 {
43 
44 	*name = key->name;
45 }
46 
hidden_def(sepol_bool_key_unpack)47 hidden_def(sepol_bool_key_unpack)
48 
49 int sepol_bool_key_extract(sepol_handle_t * handle,
50 			   const sepol_bool_t * boolean,
51 			   sepol_bool_key_t ** key_ptr)
52 {
53 
54 	if (sepol_bool_key_create(handle, boolean->name, key_ptr) < 0) {
55 		ERR(handle, "could not extract key from boolean %s",
56 		    boolean->name);
57 		return STATUS_ERR;
58 	}
59 
60 	return STATUS_SUCCESS;
61 }
62 
sepol_bool_key_free(sepol_bool_key_t * key)63 void sepol_bool_key_free(sepol_bool_key_t * key)
64 {
65 	free(key);
66 }
67 
sepol_bool_compare(const sepol_bool_t * boolean,const sepol_bool_key_t * key)68 int sepol_bool_compare(const sepol_bool_t * boolean,
69 		       const sepol_bool_key_t * key)
70 {
71 
72 	return strcmp(boolean->name, key->name);
73 }
74 
sepol_bool_compare2(const sepol_bool_t * boolean,const sepol_bool_t * boolean2)75 int sepol_bool_compare2(const sepol_bool_t * boolean,
76 			const sepol_bool_t * boolean2)
77 {
78 
79 	return strcmp(boolean->name, boolean2->name);
80 }
81 
82 /* Name */
sepol_bool_get_name(const sepol_bool_t * boolean)83 const char *sepol_bool_get_name(const sepol_bool_t * boolean)
84 {
85 
86 	return boolean->name;
87 }
88 
hidden_def(sepol_bool_get_name)89 hidden_def(sepol_bool_get_name)
90 
91 int sepol_bool_set_name(sepol_handle_t * handle,
92 			sepol_bool_t * boolean, const char *name)
93 {
94 
95 	char *tmp_name = strdup(name);
96 	if (!tmp_name) {
97 		ERR(handle, "out of memory, could not set boolean name");
98 		return STATUS_ERR;
99 	}
100 	free(boolean->name);
101 	boolean->name = tmp_name;
102 	return STATUS_SUCCESS;
103 }
104 
hidden_def(sepol_bool_set_name)105 hidden_def(sepol_bool_set_name)
106 
107 /* Value */
108 int sepol_bool_get_value(const sepol_bool_t * boolean)
109 {
110 
111 	return boolean->value;
112 }
113 
hidden_def(sepol_bool_get_value)114 hidden_def(sepol_bool_get_value)
115 
116 void sepol_bool_set_value(sepol_bool_t * boolean, int value)
117 {
118 
119 	boolean->value = value;
120 }
121 
hidden_def(sepol_bool_set_value)122 hidden_def(sepol_bool_set_value)
123 
124 /* Create */
125 int sepol_bool_create(sepol_handle_t * handle, sepol_bool_t ** bool_ptr)
126 {
127 
128 	sepol_bool_t *boolean = (sepol_bool_t *) malloc(sizeof(sepol_bool_t));
129 
130 	if (!boolean) {
131 		ERR(handle, "out of memory, "
132 		    "could not create boolean record");
133 		return STATUS_ERR;
134 	}
135 
136 	boolean->name = NULL;
137 	boolean->value = 0;
138 
139 	*bool_ptr = boolean;
140 	return STATUS_SUCCESS;
141 }
142 
hidden_def(sepol_bool_create)143 hidden_def(sepol_bool_create)
144 
145 /* Deep copy clone */
146 int sepol_bool_clone(sepol_handle_t * handle,
147 		     const sepol_bool_t * boolean, sepol_bool_t ** bool_ptr)
148 {
149 
150 	sepol_bool_t *new_bool = NULL;
151 
152 	if (sepol_bool_create(handle, &new_bool) < 0)
153 		goto err;
154 
155 	if (sepol_bool_set_name(handle, new_bool, boolean->name) < 0)
156 		goto err;
157 
158 	new_bool->value = boolean->value;
159 
160 	*bool_ptr = new_bool;
161 	return STATUS_SUCCESS;
162 
163       err:
164 	ERR(handle, "could not clone boolean record");
165 	sepol_bool_free(new_bool);
166 	return STATUS_ERR;
167 }
168 
169 /* Destroy */
sepol_bool_free(sepol_bool_t * boolean)170 void sepol_bool_free(sepol_bool_t * boolean)
171 {
172 
173 	if (!boolean)
174 		return;
175 
176 	free(boolean->name);
177 	free(boolean);
178 }
179 
180 hidden_def(sepol_bool_free)
181