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