1255e72915d4cbddceb435e13d81601755714e9fSE Android#include <errno.h>
2255e72915d4cbddceb435e13d81601755714e9fSE Android#include <stdlib.h>
3255e72915d4cbddceb435e13d81601755714e9fSE Android#include <string.h>
4255e72915d4cbddceb435e13d81601755714e9fSE Android
5255e72915d4cbddceb435e13d81601755714e9fSE Android#include "boolean_internal.h"
6255e72915d4cbddceb435e13d81601755714e9fSE Android#include "debug.h"
7255e72915d4cbddceb435e13d81601755714e9fSE Android
8255e72915d4cbddceb435e13d81601755714e9fSE Androidstruct sepol_bool {
9255e72915d4cbddceb435e13d81601755714e9fSE Android	/* This boolean's name */
10255e72915d4cbddceb435e13d81601755714e9fSE Android	char *name;
11255e72915d4cbddceb435e13d81601755714e9fSE Android
12255e72915d4cbddceb435e13d81601755714e9fSE Android	/* Its value */
13255e72915d4cbddceb435e13d81601755714e9fSE Android	int value;
14255e72915d4cbddceb435e13d81601755714e9fSE Android};
15255e72915d4cbddceb435e13d81601755714e9fSE Android
16255e72915d4cbddceb435e13d81601755714e9fSE Androidstruct sepol_bool_key {
17255e72915d4cbddceb435e13d81601755714e9fSE Android	/* This boolean's name */
18255e72915d4cbddceb435e13d81601755714e9fSE Android	const char *name;
19255e72915d4cbddceb435e13d81601755714e9fSE Android};
20255e72915d4cbddceb435e13d81601755714e9fSE Android
21255e72915d4cbddceb435e13d81601755714e9fSE Androidint sepol_bool_key_create(sepol_handle_t * handle,
22255e72915d4cbddceb435e13d81601755714e9fSE Android			  const char *name, sepol_bool_key_t ** key_ptr)
23255e72915d4cbddceb435e13d81601755714e9fSE Android{
24255e72915d4cbddceb435e13d81601755714e9fSE Android
25255e72915d4cbddceb435e13d81601755714e9fSE Android	sepol_bool_key_t *tmp_key =
26255e72915d4cbddceb435e13d81601755714e9fSE Android	    (sepol_bool_key_t *) malloc(sizeof(struct sepol_bool_key));
27255e72915d4cbddceb435e13d81601755714e9fSE Android
28255e72915d4cbddceb435e13d81601755714e9fSE Android	if (!tmp_key) {
29255e72915d4cbddceb435e13d81601755714e9fSE Android		ERR(handle, "out of memory, " "could not create boolean key");
30255e72915d4cbddceb435e13d81601755714e9fSE Android		return STATUS_ERR;
31255e72915d4cbddceb435e13d81601755714e9fSE Android	}
32255e72915d4cbddceb435e13d81601755714e9fSE Android
33255e72915d4cbddceb435e13d81601755714e9fSE Android	tmp_key->name = name;
34255e72915d4cbddceb435e13d81601755714e9fSE Android
35255e72915d4cbddceb435e13d81601755714e9fSE Android	*key_ptr = tmp_key;
36255e72915d4cbddceb435e13d81601755714e9fSE Android	return STATUS_SUCCESS;
37255e72915d4cbddceb435e13d81601755714e9fSE Android}
38255e72915d4cbddceb435e13d81601755714e9fSE Android
39255e72915d4cbddceb435e13d81601755714e9fSE Androidhidden_def(sepol_bool_key_create)
40255e72915d4cbddceb435e13d81601755714e9fSE Android
41255e72915d4cbddceb435e13d81601755714e9fSE Androidvoid sepol_bool_key_unpack(const sepol_bool_key_t * key, const char **name)
42255e72915d4cbddceb435e13d81601755714e9fSE Android{
43255e72915d4cbddceb435e13d81601755714e9fSE Android
44255e72915d4cbddceb435e13d81601755714e9fSE Android	*name = key->name;
45255e72915d4cbddceb435e13d81601755714e9fSE Android}
46255e72915d4cbddceb435e13d81601755714e9fSE Android
47255e72915d4cbddceb435e13d81601755714e9fSE Androidhidden_def(sepol_bool_key_unpack)
48255e72915d4cbddceb435e13d81601755714e9fSE Android
49255e72915d4cbddceb435e13d81601755714e9fSE Androidint sepol_bool_key_extract(sepol_handle_t * handle,
50255e72915d4cbddceb435e13d81601755714e9fSE Android			   const sepol_bool_t * boolean,
51255e72915d4cbddceb435e13d81601755714e9fSE Android			   sepol_bool_key_t ** key_ptr)
52255e72915d4cbddceb435e13d81601755714e9fSE Android{
53255e72915d4cbddceb435e13d81601755714e9fSE Android
54255e72915d4cbddceb435e13d81601755714e9fSE Android	if (sepol_bool_key_create(handle, boolean->name, key_ptr) < 0) {
55255e72915d4cbddceb435e13d81601755714e9fSE Android		ERR(handle, "could not extract key from boolean %s",
56255e72915d4cbddceb435e13d81601755714e9fSE Android		    boolean->name);
57255e72915d4cbddceb435e13d81601755714e9fSE Android		return STATUS_ERR;
58255e72915d4cbddceb435e13d81601755714e9fSE Android	}
59255e72915d4cbddceb435e13d81601755714e9fSE Android
60255e72915d4cbddceb435e13d81601755714e9fSE Android	return STATUS_SUCCESS;
61255e72915d4cbddceb435e13d81601755714e9fSE Android}
62255e72915d4cbddceb435e13d81601755714e9fSE Android
63255e72915d4cbddceb435e13d81601755714e9fSE Androidvoid sepol_bool_key_free(sepol_bool_key_t * key)
64255e72915d4cbddceb435e13d81601755714e9fSE Android{
65255e72915d4cbddceb435e13d81601755714e9fSE Android	free(key);
66255e72915d4cbddceb435e13d81601755714e9fSE Android}
67255e72915d4cbddceb435e13d81601755714e9fSE Android
68255e72915d4cbddceb435e13d81601755714e9fSE Androidint sepol_bool_compare(const sepol_bool_t * boolean,
69255e72915d4cbddceb435e13d81601755714e9fSE Android		       const sepol_bool_key_t * key)
70255e72915d4cbddceb435e13d81601755714e9fSE Android{
71255e72915d4cbddceb435e13d81601755714e9fSE Android
72255e72915d4cbddceb435e13d81601755714e9fSE Android	return strcmp(boolean->name, key->name);
73255e72915d4cbddceb435e13d81601755714e9fSE Android}
74255e72915d4cbddceb435e13d81601755714e9fSE Android
75255e72915d4cbddceb435e13d81601755714e9fSE Androidint sepol_bool_compare2(const sepol_bool_t * boolean,
76255e72915d4cbddceb435e13d81601755714e9fSE Android			const sepol_bool_t * boolean2)
77255e72915d4cbddceb435e13d81601755714e9fSE Android{
78255e72915d4cbddceb435e13d81601755714e9fSE Android
79255e72915d4cbddceb435e13d81601755714e9fSE Android	return strcmp(boolean->name, boolean2->name);
80255e72915d4cbddceb435e13d81601755714e9fSE Android}
81255e72915d4cbddceb435e13d81601755714e9fSE Android
82255e72915d4cbddceb435e13d81601755714e9fSE Android/* Name */
83255e72915d4cbddceb435e13d81601755714e9fSE Androidconst char *sepol_bool_get_name(const sepol_bool_t * boolean)
84255e72915d4cbddceb435e13d81601755714e9fSE Android{
85255e72915d4cbddceb435e13d81601755714e9fSE Android
86255e72915d4cbddceb435e13d81601755714e9fSE Android	return boolean->name;
87255e72915d4cbddceb435e13d81601755714e9fSE Android}
88255e72915d4cbddceb435e13d81601755714e9fSE Android
89255e72915d4cbddceb435e13d81601755714e9fSE Androidhidden_def(sepol_bool_get_name)
90255e72915d4cbddceb435e13d81601755714e9fSE Android
91255e72915d4cbddceb435e13d81601755714e9fSE Androidint sepol_bool_set_name(sepol_handle_t * handle,
92255e72915d4cbddceb435e13d81601755714e9fSE Android			sepol_bool_t * boolean, const char *name)
93255e72915d4cbddceb435e13d81601755714e9fSE Android{
94255e72915d4cbddceb435e13d81601755714e9fSE Android
95255e72915d4cbddceb435e13d81601755714e9fSE Android	char *tmp_name = strdup(name);
96255e72915d4cbddceb435e13d81601755714e9fSE Android	if (!tmp_name) {
97255e72915d4cbddceb435e13d81601755714e9fSE Android		ERR(handle, "out of memory, could not set boolean name");
98255e72915d4cbddceb435e13d81601755714e9fSE Android		return STATUS_ERR;
99255e72915d4cbddceb435e13d81601755714e9fSE Android	}
100255e72915d4cbddceb435e13d81601755714e9fSE Android	free(boolean->name);
101255e72915d4cbddceb435e13d81601755714e9fSE Android	boolean->name = tmp_name;
102255e72915d4cbddceb435e13d81601755714e9fSE Android	return STATUS_SUCCESS;
103255e72915d4cbddceb435e13d81601755714e9fSE Android}
104255e72915d4cbddceb435e13d81601755714e9fSE Android
105255e72915d4cbddceb435e13d81601755714e9fSE Androidhidden_def(sepol_bool_set_name)
106255e72915d4cbddceb435e13d81601755714e9fSE Android
107255e72915d4cbddceb435e13d81601755714e9fSE Android/* Value */
108255e72915d4cbddceb435e13d81601755714e9fSE Androidint sepol_bool_get_value(const sepol_bool_t * boolean)
109255e72915d4cbddceb435e13d81601755714e9fSE Android{
110255e72915d4cbddceb435e13d81601755714e9fSE Android
111255e72915d4cbddceb435e13d81601755714e9fSE Android	return boolean->value;
112255e72915d4cbddceb435e13d81601755714e9fSE Android}
113255e72915d4cbddceb435e13d81601755714e9fSE Android
114255e72915d4cbddceb435e13d81601755714e9fSE Androidhidden_def(sepol_bool_get_value)
115255e72915d4cbddceb435e13d81601755714e9fSE Android
116255e72915d4cbddceb435e13d81601755714e9fSE Androidvoid sepol_bool_set_value(sepol_bool_t * boolean, int value)
117255e72915d4cbddceb435e13d81601755714e9fSE Android{
118255e72915d4cbddceb435e13d81601755714e9fSE Android
119255e72915d4cbddceb435e13d81601755714e9fSE Android	boolean->value = value;
120255e72915d4cbddceb435e13d81601755714e9fSE Android}
121255e72915d4cbddceb435e13d81601755714e9fSE Android
122255e72915d4cbddceb435e13d81601755714e9fSE Androidhidden_def(sepol_bool_set_value)
123255e72915d4cbddceb435e13d81601755714e9fSE Android
124255e72915d4cbddceb435e13d81601755714e9fSE Android/* Create */
125255e72915d4cbddceb435e13d81601755714e9fSE Androidint sepol_bool_create(sepol_handle_t * handle, sepol_bool_t ** bool_ptr)
126255e72915d4cbddceb435e13d81601755714e9fSE Android{
127255e72915d4cbddceb435e13d81601755714e9fSE Android
128255e72915d4cbddceb435e13d81601755714e9fSE Android	sepol_bool_t *boolean = (sepol_bool_t *) malloc(sizeof(sepol_bool_t));
129255e72915d4cbddceb435e13d81601755714e9fSE Android
130255e72915d4cbddceb435e13d81601755714e9fSE Android	if (!boolean) {
131255e72915d4cbddceb435e13d81601755714e9fSE Android		ERR(handle, "out of memory, "
132255e72915d4cbddceb435e13d81601755714e9fSE Android		    "could not create boolean record");
133255e72915d4cbddceb435e13d81601755714e9fSE Android		return STATUS_ERR;
134255e72915d4cbddceb435e13d81601755714e9fSE Android	}
135255e72915d4cbddceb435e13d81601755714e9fSE Android
136255e72915d4cbddceb435e13d81601755714e9fSE Android	boolean->name = NULL;
137255e72915d4cbddceb435e13d81601755714e9fSE Android	boolean->value = 0;
138255e72915d4cbddceb435e13d81601755714e9fSE Android
139255e72915d4cbddceb435e13d81601755714e9fSE Android	*bool_ptr = boolean;
140255e72915d4cbddceb435e13d81601755714e9fSE Android	return STATUS_SUCCESS;
141255e72915d4cbddceb435e13d81601755714e9fSE Android}
142255e72915d4cbddceb435e13d81601755714e9fSE Android
143255e72915d4cbddceb435e13d81601755714e9fSE Androidhidden_def(sepol_bool_create)
144255e72915d4cbddceb435e13d81601755714e9fSE Android
145255e72915d4cbddceb435e13d81601755714e9fSE Android/* Deep copy clone */
146255e72915d4cbddceb435e13d81601755714e9fSE Androidint sepol_bool_clone(sepol_handle_t * handle,
147255e72915d4cbddceb435e13d81601755714e9fSE Android		     const sepol_bool_t * boolean, sepol_bool_t ** bool_ptr)
148255e72915d4cbddceb435e13d81601755714e9fSE Android{
149255e72915d4cbddceb435e13d81601755714e9fSE Android
150255e72915d4cbddceb435e13d81601755714e9fSE Android	sepol_bool_t *new_bool = NULL;
151255e72915d4cbddceb435e13d81601755714e9fSE Android
152255e72915d4cbddceb435e13d81601755714e9fSE Android	if (sepol_bool_create(handle, &new_bool) < 0)
153255e72915d4cbddceb435e13d81601755714e9fSE Android		goto err;
154255e72915d4cbddceb435e13d81601755714e9fSE Android
155255e72915d4cbddceb435e13d81601755714e9fSE Android	if (sepol_bool_set_name(handle, new_bool, boolean->name) < 0)
156255e72915d4cbddceb435e13d81601755714e9fSE Android		goto err;
157255e72915d4cbddceb435e13d81601755714e9fSE Android
158255e72915d4cbddceb435e13d81601755714e9fSE Android	new_bool->value = boolean->value;
159255e72915d4cbddceb435e13d81601755714e9fSE Android
160255e72915d4cbddceb435e13d81601755714e9fSE Android	*bool_ptr = new_bool;
161255e72915d4cbddceb435e13d81601755714e9fSE Android	return STATUS_SUCCESS;
162255e72915d4cbddceb435e13d81601755714e9fSE Android
163255e72915d4cbddceb435e13d81601755714e9fSE Android      err:
164255e72915d4cbddceb435e13d81601755714e9fSE Android	ERR(handle, "could not clone boolean record");
165255e72915d4cbddceb435e13d81601755714e9fSE Android	sepol_bool_free(new_bool);
166255e72915d4cbddceb435e13d81601755714e9fSE Android	return STATUS_ERR;
167255e72915d4cbddceb435e13d81601755714e9fSE Android}
168255e72915d4cbddceb435e13d81601755714e9fSE Android
169255e72915d4cbddceb435e13d81601755714e9fSE Android/* Destroy */
170255e72915d4cbddceb435e13d81601755714e9fSE Androidvoid sepol_bool_free(sepol_bool_t * boolean)
171255e72915d4cbddceb435e13d81601755714e9fSE Android{
172255e72915d4cbddceb435e13d81601755714e9fSE Android
173255e72915d4cbddceb435e13d81601755714e9fSE Android	if (!boolean)
174255e72915d4cbddceb435e13d81601755714e9fSE Android		return;
175255e72915d4cbddceb435e13d81601755714e9fSE Android
176255e72915d4cbddceb435e13d81601755714e9fSE Android	free(boolean->name);
177255e72915d4cbddceb435e13d81601755714e9fSE Android	free(boolean);
178255e72915d4cbddceb435e13d81601755714e9fSE Android}
179255e72915d4cbddceb435e13d81601755714e9fSE Android
180255e72915d4cbddceb435e13d81601755714e9fSE Androidhidden_def(sepol_bool_free)
181