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