xref: /aosp_15_r20/external/selinux/libsemanage/src/boolean_record.c (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
1 /* Copyright (C) 2005 Red Hat, Inc. */
2 
3 /* Object: semanage_bool_t (Policy Boolean)
4  * Object: semanage_bool_key_t (Policy Boolean Key)
5  * Implements: record_t (Database Record)
6  * Implements: record_key_t (Database Record Key)
7  */
8 
9 #include <string.h>
10 #include <stdio.h>
11 #include <stdlib.h>
12 
13 #include <sepol/boolean_record.h>
14 
15 typedef sepol_bool_t semanage_bool_t;
16 typedef sepol_bool_key_t semanage_bool_key_t;
17 #define _SEMANAGE_BOOL_DEFINED_
18 
19 typedef semanage_bool_t record_t;
20 typedef semanage_bool_key_t record_key_t;
21 #define DBASE_RECORD_DEFINED
22 
23 #include "boolean_internal.h"
24 #include "handle.h"
25 #include "database.h"
26 #include <selinux/selinux.h>
27 
28 /* Key */
semanage_bool_key_create(semanage_handle_t * handle,const char * name,semanage_bool_key_t ** key)29 int semanage_bool_key_create(semanage_handle_t * handle,
30 			     const char *name, semanage_bool_key_t ** key)
31 {
32 
33 	return sepol_bool_key_create(handle->sepolh, name, key);
34 }
35 
semanage_bool_key_extract(semanage_handle_t * handle,const semanage_bool_t * boolean,semanage_bool_key_t ** key)36 int semanage_bool_key_extract(semanage_handle_t * handle,
37 			      const semanage_bool_t * boolean,
38 			      semanage_bool_key_t ** key)
39 {
40 
41 	return sepol_bool_key_extract(handle->sepolh, boolean, key);
42 }
43 
44 
semanage_bool_key_free(semanage_bool_key_t * key)45 void semanage_bool_key_free(semanage_bool_key_t * key)
46 {
47 	sepol_bool_key_free(key);
48 }
49 
50 
semanage_bool_compare(const semanage_bool_t * boolean,const semanage_bool_key_t * key)51 int semanage_bool_compare(const semanage_bool_t * boolean,
52 			  const semanage_bool_key_t * key)
53 {
54 
55 	return sepol_bool_compare(boolean, key);
56 }
57 
58 
semanage_bool_compare2(const semanage_bool_t * boolean,const semanage_bool_t * boolean2)59 int semanage_bool_compare2(const semanage_bool_t * boolean,
60 			   const semanage_bool_t * boolean2)
61 {
62 
63 	return sepol_bool_compare2(boolean, boolean2);
64 }
65 
66 
semanage_bool_compare2_qsort(const semanage_bool_t ** boolean,const semanage_bool_t ** boolean2)67 static int semanage_bool_compare2_qsort(const semanage_bool_t ** boolean,
68 					const semanage_bool_t ** boolean2)
69 {
70 
71 	return sepol_bool_compare2(*boolean, *boolean2);
72 }
73 
74 /* Name */
semanage_bool_get_name(const semanage_bool_t * boolean)75 const char *semanage_bool_get_name(const semanage_bool_t * boolean)
76 {
77 
78 	return sepol_bool_get_name(boolean);
79 }
80 
81 
semanage_bool_set_name(semanage_handle_t * handle,semanage_bool_t * boolean,const char * name)82 int semanage_bool_set_name(semanage_handle_t * handle,
83 			   semanage_bool_t * boolean, const char *name)
84 {
85 	int rc = -1;
86 	const char *prefix = semanage_root();
87 	const char *storename = handle->conf->store_path;
88 	const char *selinux_root = selinux_policy_root();
89 	char *oldroot;
90 	char *olddir;
91 	char *subname = NULL;
92 	char *newroot = NULL;
93 	char *end;
94 
95 	if (!selinux_root)
96 		return -1;
97 
98 	oldroot = strdup(selinux_root);
99 	if (!oldroot)
100 		return -1;
101 	olddir = strdup(oldroot);
102 	if (!olddir)
103 		goto out;
104 	end = strrchr(olddir, '/');
105 	if (!end)
106 		goto out;
107 	end++;
108 	*end = '\0';
109 	rc = asprintf(&newroot, "%s%s%s", prefix, olddir, storename);
110 	if (rc < 0)
111 		goto out;
112 
113 	if (strcmp(oldroot, newroot)) {
114 		rc = selinux_set_policy_root(newroot);
115 		if (rc)
116 			goto out;
117 	}
118 
119 	subname = selinux_boolean_sub(name);
120 	if (!subname) {
121 		rc = -1;
122 		goto out;
123 	}
124 
125 	if (strcmp(oldroot, newroot)) {
126 		rc = selinux_set_policy_root(oldroot);
127 		if (rc)
128 			goto out;
129 	}
130 
131 	rc = sepol_bool_set_name(handle->sepolh, boolean, subname);
132 out:
133 	free(subname);
134 	free(oldroot);
135 	free(olddir);
136 	free(newroot);
137 	return rc;
138 }
139 
140 
141 /* Value */
semanage_bool_get_value(const semanage_bool_t * boolean)142 int semanage_bool_get_value(const semanage_bool_t * boolean)
143 {
144 
145 	return sepol_bool_get_value(boolean);
146 }
147 
148 
semanage_bool_set_value(semanage_bool_t * boolean,int value)149 void semanage_bool_set_value(semanage_bool_t * boolean, int value)
150 {
151 
152 	sepol_bool_set_value(boolean, value);
153 }
154 
155 
156 /* Create/Clone/Destroy */
semanage_bool_create(semanage_handle_t * handle,semanage_bool_t ** bool_ptr)157 int semanage_bool_create(semanage_handle_t * handle,
158 			 semanage_bool_t ** bool_ptr)
159 {
160 
161 	return sepol_bool_create(handle->sepolh, bool_ptr);
162 }
163 
164 
semanage_bool_clone(semanage_handle_t * handle,const semanage_bool_t * boolean,semanage_bool_t ** bool_ptr)165 int semanage_bool_clone(semanage_handle_t * handle,
166 			const semanage_bool_t * boolean,
167 			semanage_bool_t ** bool_ptr)
168 {
169 
170 	return sepol_bool_clone(handle->sepolh, boolean, bool_ptr);
171 }
172 
173 
semanage_bool_free(semanage_bool_t * boolean)174 void semanage_bool_free(semanage_bool_t * boolean)
175 {
176 
177 	sepol_bool_free(boolean);
178 }
179 
180 
181 /* Record base functions */
182 record_table_t SEMANAGE_BOOL_RTABLE = {
183 	.create = semanage_bool_create,
184 	.key_extract = semanage_bool_key_extract,
185 	.key_free = semanage_bool_key_free,
186 	.clone = semanage_bool_clone,
187 	.compare = semanage_bool_compare,
188 	.compare2 = semanage_bool_compare2,
189 	.compare2_qsort = semanage_bool_compare2_qsort,
190 	.free = semanage_bool_free,
191 };
192