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	const 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 = name;
34
35	*key_ptr = tmp_key;
36	return STATUS_SUCCESS;
37}
38
39hidden_def(sepol_bool_key_create)
40
41void sepol_bool_key_unpack(const sepol_bool_key_t * key, const char **name)
42{
43
44	*name = key->name;
45}
46
47hidden_def(sepol_bool_key_unpack)
48
49int 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
63void sepol_bool_key_free(sepol_bool_key_t * key)
64{
65	free(key);
66}
67
68int 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
75int 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 */
83const char *sepol_bool_get_name(const sepol_bool_t * boolean)
84{
85
86	return boolean->name;
87}
88
89hidden_def(sepol_bool_get_name)
90
91int 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
105hidden_def(sepol_bool_set_name)
106
107/* Value */
108int sepol_bool_get_value(const sepol_bool_t * boolean)
109{
110
111	return boolean->value;
112}
113
114hidden_def(sepol_bool_get_value)
115
116void sepol_bool_set_value(sepol_bool_t * boolean, int value)
117{
118
119	boolean->value = value;
120}
121
122hidden_def(sepol_bool_set_value)
123
124/* Create */
125int 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
143hidden_def(sepol_bool_create)
144
145/* Deep copy clone */
146int 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 */
170void sepol_bool_free(sepol_bool_t * boolean)
171{
172
173	if (!boolean)
174		return;
175
176	free(boolean->name);
177	free(boolean);
178}
179
180hidden_def(sepol_bool_free)
181