1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
3 * Gui Policy Editor for TOMOYO Linux
6 * Copyright (C) Yoshihiro Kusuno 2010 <yocto@users.sourceforge.jp>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU Library General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor Boston, MA 02110-1301, USA
23 int get_domain_policy(struct ccs_domain_policy *dp, int *count)
27 ccs_domain_sort_type = 0;
28 ccs_current_screen = CCS_SCREEN_DOMAIN_LIST;
29 result = ccs_generic_list_loop(dp);
30 *count = dp->list_len - ccs_unnumbered_domain_count;
34 int add_domain(char *input, char **err_buff)
38 ccs_current_screen = CCS_SCREEN_DOMAIN_LIST;
44 (*err_buff) = strdup(ccs_last_error);
46 ccs_last_error = NULL;
53 int set_profile(struct ccs_domain_policy *dp,
54 char *profile, char **err_buff)
56 int dummy = 0, result = 0;
58 ccs_current_screen = CCS_SCREEN_DOMAIN_LIST;
60 ccs_set_profile(dp, dummy);
64 (*err_buff) = strdup(ccs_last_error);
66 ccs_last_error = NULL;
73 int get_task_list(struct ccs_task_entry **tsk, int *count)
75 struct ccs_domain_policy *dp = NULL;
78 ccs_domain_sort_type = 1;
79 ccs_current_screen = CCS_SCREEN_DOMAIN_LIST;
80 result = ccs_generic_list_loop(dp);
82 *count = ccs_task_list_len;
86 static void generic_acl_copy(struct ccs_generic_acl **src, int src_cnt,
87 struct ccs_generic_acl **dst, int dst_cnt)
92 free((void *)((*dst)[--dst_cnt].operand));
94 *dst = realloc(*dst, src_cnt * sizeof(struct ccs_generic_acl));
98 memcpy(*dst, ccs_generic_acl_list,
99 src_cnt * sizeof(struct ccs_generic_acl));
100 for (i = 0; i < src_cnt; i++) {
101 (*dst)[i].directive = (*src)[i].directive;
102 (*dst)[i].selected = (*src)[i].selected;
103 (*dst)[i].operand = strdup((*src)[i].operand);
104 if (!((*dst)[i].operand))
109 int get_acl_list(struct ccs_domain_policy *dp, int current,
110 struct ccs_generic_acl **ga, int *count)
114 if (ccs_initializer_source(dp, current)) {
116 } else if (ccs_deleted_domain(dp, current)) {
119 free(ccs_current_domain);
120 ccs_current_domain = strdup(ccs_domain_name(dp, current));
121 if (!ccs_current_domain)
124 ccs_domain_sort_type = 0;
125 ccs_current_screen = CCS_SCREEN_ACL_LIST;
126 result = ccs_generic_list_loop(dp);
127 generic_acl_copy(&ccs_generic_acl_list,
128 ccs_generic_acl_list_count,
130 *count = ccs_generic_acl_list_count;
136 int get_process_acl_list(int current,
137 struct ccs_generic_acl **ga, int *count)
139 struct ccs_domain_policy *dp = NULL;
142 free(ccs_current_domain);
143 ccs_current_pid = ccs_task_list[current].pid;
144 ccs_current_domain = strdup(ccs_task_list[current].domain);
145 if (!ccs_current_domain)
148 ccs_domain_sort_type = 1;
149 ccs_current_screen = CCS_SCREEN_ACL_LIST;
150 result = ccs_generic_list_loop(dp);
151 generic_acl_copy(&ccs_generic_acl_list,
152 ccs_generic_acl_list_count,
154 *count = ccs_generic_acl_list_count;
159 int add_acl_list(struct ccs_domain_policy *dp, int current,
160 char *input, char **err_buff)
164 if (ccs_initializer_source(dp, current) ||
165 ccs_deleted_domain(dp, current))
168 ccs_current_screen = CCS_SCREEN_ACL_LIST;
173 if (ccs_last_error) {
174 (*err_buff) = strdup(ccs_last_error);
175 free(ccs_last_error);
176 ccs_last_error = NULL;
183 const char *get_transition_name(enum ccs_transition_type type)
185 return ccs_transition_type[type];
188 int get_exception_policy(struct ccs_generic_acl **ga, int *count)
190 struct ccs_domain_policy *dp = NULL;
193 ccs_current_screen = CCS_SCREEN_EXCEPTION_LIST;
194 result = ccs_generic_list_loop(dp);
195 *ga = ccs_generic_acl_list;
196 *count = ccs_generic_acl_list_count;
200 int add_exception_policy(char *input, char **err_buff)
204 ccs_current_screen = CCS_SCREEN_EXCEPTION_LIST;
209 if (ccs_last_error) {
210 (*err_buff) = strdup(ccs_last_error);
211 free(ccs_last_error);
212 ccs_last_error = NULL;
219 int get_profile(struct ccs_generic_acl **ga, int *count)
221 struct ccs_domain_policy *dp = NULL;
225 free((void *)((*ga)[--(*count)].operand));
227 ccs_current_screen = CCS_SCREEN_PROFILE_LIST;
228 result = ccs_generic_list_loop(dp);
230 generic_acl_copy(&ccs_generic_acl_list,
231 ccs_generic_acl_list_count,
233 *count = ccs_generic_acl_list_count;
238 int add_profile(char *input, char **err_buff)
242 ccs_current_screen = CCS_SCREEN_PROFILE_LIST;
247 if (ccs_last_error) {
248 (*err_buff) = strdup(ccs_last_error);
249 free(ccs_last_error);
250 ccs_last_error = NULL;
257 int set_profile_level(int index, const char *input, char **err_buff)
259 struct ccs_domain_policy *dp = NULL;
262 ccs_current_screen = CCS_SCREEN_PROFILE_LIST;
263 ccs_generic_acl_list[index].selected = 1;
264 gpet_line = (char *)input;
265 ccs_set_level(dp, 0);
268 if (ccs_last_error) {
269 (*err_buff) = strdup(ccs_last_error);
270 free(ccs_last_error);
271 ccs_last_error = NULL;
278 int get_manager(struct ccs_generic_acl **ga, int *count)
280 struct ccs_domain_policy *dp = NULL;
281 struct ccs_generic_acl *orig_generic_acl_list = NULL;
282 int orig_generic_acl_list_count = 0;
285 generic_acl_copy(&ccs_generic_acl_list,
286 ccs_generic_acl_list_count,
287 &orig_generic_acl_list,
288 orig_generic_acl_list_count);
289 orig_generic_acl_list_count = ccs_generic_acl_list_count;
291 ccs_current_screen = CCS_SCREEN_MANAGER_LIST;
292 result = ccs_generic_list_loop(dp);
294 generic_acl_copy(&ccs_generic_acl_list,
295 ccs_generic_acl_list_count,
297 *count = ccs_generic_acl_list_count;
299 generic_acl_copy(&orig_generic_acl_list,
300 orig_generic_acl_list_count,
301 &ccs_generic_acl_list,
302 ccs_generic_acl_list_count);
303 ccs_generic_acl_list_count = orig_generic_acl_list_count;
308 int add_manager(char *input, char **err_buff)
312 ccs_current_screen = CCS_SCREEN_MANAGER_LIST;
317 if (ccs_last_error) {
318 (*err_buff) = strdup(ccs_last_error);
319 free(ccs_last_error);
320 ccs_last_error = NULL;
327 int get_memory(struct ccs_generic_acl **ga, int *count)
329 struct ccs_domain_policy *dp = NULL;
330 struct ccs_generic_acl *orig_generic_acl_list = NULL;
331 int orig_generic_acl_list_count = 0;
334 generic_acl_copy(&ccs_generic_acl_list,
335 ccs_generic_acl_list_count,
336 &orig_generic_acl_list,
337 orig_generic_acl_list_count);
338 orig_generic_acl_list_count = ccs_generic_acl_list_count;
340 ccs_current_screen = CCS_SCREEN_MEMINFO_LIST;
341 result = ccs_generic_list_loop(dp);
343 generic_acl_copy(&ccs_generic_acl_list,
344 ccs_generic_acl_list_count,
346 *count = ccs_generic_acl_list_count;
348 generic_acl_copy(&orig_generic_acl_list,
349 orig_generic_acl_list_count,
350 &ccs_generic_acl_list,
351 ccs_generic_acl_list_count);
352 ccs_generic_acl_list_count = orig_generic_acl_list_count;
357 int set_memory(struct ccs_generic_acl *ga, int count, char **err_buff)
359 struct ccs_domain_policy *dp = NULL;
362 ccs_current_screen = CCS_SCREEN_MEMINFO_LIST;
363 ccs_policy_file = CCS_PROC_POLICY_MEMINFO;
364 generic_acl_copy(&ga, count,
365 &ccs_generic_acl_list, ccs_generic_acl_list_count);
366 ccs_generic_acl_list_count = count;
368 for (i = 0; i < count; i++) {
369 ccs_generic_acl_list[i].selected = 0;
372 for (i = 0; i < count; i++) {
374 cp = strrchr(ccs_generic_acl_list[i].operand, ':');
375 if (cp && ga[i].selected) {
376 gpet_line = strdup(++cp);
377 fprintf(stderr, "mem:%2d[%s][%s]\n", i, ccs_generic_acl_list[i].operand, cp);
378 ccs_generic_acl_list[i].selected = 1;
379 ccs_set_quota(dp, -1);
380 ccs_generic_acl_list[i].selected = 0;
384 if (ccs_last_error) {
385 (*err_buff) = strdup(ccs_last_error);
386 free(ccs_last_error);
387 ccs_last_error = NULL;
394 int delete_domain_policy(struct ccs_domain_policy *dp, char **err_buff)
398 ccs_current_screen = CCS_SCREEN_DOMAIN_LIST;
399 ccs_policy_file = CCS_PROC_POLICY_DOMAIN_POLICY;
400 ccs_delete_entry(dp, -1);
402 if (ccs_last_error) {
403 (*err_buff) = strdup(ccs_last_error);
404 free(ccs_last_error);
405 ccs_last_error = NULL;
412 int delete_acl_policy(struct ccs_domain_policy *dp, char **err_buff,
413 struct ccs_generic_acl *ga, int count)
417 ccs_current_screen = CCS_SCREEN_ACL_LIST;
418 ccs_policy_file = CCS_PROC_POLICY_DOMAIN_POLICY;
420 generic_acl_copy(&ga, count,
421 &ccs_generic_acl_list, ccs_generic_acl_list_count);
422 ccs_generic_acl_list_count = count;
423 ccs_delete_entry(dp, -1);
425 if (ccs_last_error) {
426 (*err_buff) = strdup(ccs_last_error);
427 free(ccs_last_error);
428 ccs_last_error = NULL;
435 int delete_exp_policy(struct ccs_domain_policy *dp, char **err_buff,
436 struct ccs_generic_acl *ga, int count)
440 ccs_current_screen = CCS_SCREEN_EXCEPTION_LIST;
441 ccs_policy_file = CCS_PROC_POLICY_EXCEPTION_POLICY;
442 ccs_generic_acl_list = ga;
443 ccs_generic_acl_list_count = count;
444 ccs_delete_entry(dp, -1);
446 if (ccs_last_error) {
447 (*err_buff) = strdup(ccs_last_error);
448 free(ccs_last_error);
449 ccs_last_error = NULL;
456 int delete_manager_policy(
457 struct ccs_generic_acl *ga, int count, char **err_buff)
459 struct ccs_domain_policy *dp = NULL;
462 ccs_current_screen = CCS_SCREEN_MANAGER_LIST;
463 ccs_policy_file = CCS_PROC_POLICY_MANAGER;
464 generic_acl_copy(&ga, count,
465 &ccs_generic_acl_list, ccs_generic_acl_list_count);
466 ccs_generic_acl_list_count = count;
467 ccs_delete_entry(dp, -1);
469 if (ccs_last_error) {
470 (*err_buff) = strdup(ccs_last_error);
471 free(ccs_last_error);
472 ccs_last_error = NULL;
481 return ccs_offline_mode;