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