/* Copyright (C) 2005 Red Hat, Inc. */ /* Object: semanage_bool_t (Policy Boolean) * Object: semanage_bool_key_t (Policy Boolean Key) * Implements: record_t (Database Record) * Implements: record_key_t (Database Record Key) */ #include #include #include "handle_internal.h" typedef sepol_bool_t semanage_bool_t; typedef sepol_bool_key_t semanage_bool_key_t; #define _SEMANAGE_BOOL_DEFINED_ typedef semanage_bool_t record_t; typedef semanage_bool_key_t record_key_t; #define DBASE_RECORD_DEFINED #include "boolean_internal.h" #include "handle.h" #include "database.h" #include #include /* Key */ int semanage_bool_key_create(semanage_handle_t * handle, const char *name, semanage_bool_key_t ** key) { return sepol_bool_key_create(handle->sepolh, name, key); } int semanage_bool_key_extract(semanage_handle_t * handle, const semanage_bool_t * boolean, semanage_bool_key_t ** key) { return sepol_bool_key_extract(handle->sepolh, boolean, key); } hidden_def(semanage_bool_key_extract) void semanage_bool_key_free(semanage_bool_key_t * key) { sepol_bool_key_free(key); } hidden_def(semanage_bool_key_free) int semanage_bool_compare(const semanage_bool_t * boolean, const semanage_bool_key_t * key) { return sepol_bool_compare(boolean, key); } hidden_def(semanage_bool_compare) int semanage_bool_compare2(const semanage_bool_t * boolean, const semanage_bool_t * boolean2) { return sepol_bool_compare2(boolean, boolean2); } hidden_def(semanage_bool_compare2) static int semanage_bool_compare2_qsort(const semanage_bool_t ** boolean, const semanage_bool_t ** boolean2) { return sepol_bool_compare2(*boolean, *boolean2); } /* Name */ const char *semanage_bool_get_name(const semanage_bool_t * boolean) { return sepol_bool_get_name(boolean); } hidden_def(semanage_bool_get_name) int semanage_bool_set_name(semanage_handle_t * handle, semanage_bool_t * boolean, const char *name) { int rc = -1; const char *prefix = semanage_root(); const char *storename = handle->conf->store_path; const char *selinux_root = selinux_policy_root(); char *oldroot; char *olddir; char *subname = NULL; char *newroot = NULL; char *end; if (!selinux_root) return -1; oldroot = strdup(selinux_root); if (!oldroot) return -1; olddir = strdup(oldroot); if (!olddir) goto out; end = strrchr(olddir, '/'); if (!end) goto out; end++; *end = '\0'; rc = asprintf(&newroot, "%s%s%s", prefix, olddir, storename); if (rc < 0) goto out; if (strcmp(oldroot, newroot)) { rc = selinux_set_policy_root(newroot); if (rc) goto out; } subname = selinux_boolean_sub(name); if (!subname) { rc = -1; goto out; } if (strcmp(oldroot, newroot)) { rc = selinux_set_policy_root(oldroot); if (rc) goto out; } rc = sepol_bool_set_name(handle->sepolh, boolean, subname); out: free(subname); free(oldroot); free(olddir); free(newroot); return rc; } hidden_def(semanage_bool_set_name) /* Value */ int semanage_bool_get_value(const semanage_bool_t * boolean) { return sepol_bool_get_value(boolean); } hidden_def(semanage_bool_get_value) void semanage_bool_set_value(semanage_bool_t * boolean, int value) { sepol_bool_set_value(boolean, value); } hidden_def(semanage_bool_set_value) /* Create/Clone/Destroy */ int semanage_bool_create(semanage_handle_t * handle, semanage_bool_t ** bool_ptr) { return sepol_bool_create(handle->sepolh, bool_ptr); } hidden_def(semanage_bool_create) int semanage_bool_clone(semanage_handle_t * handle, const semanage_bool_t * boolean, semanage_bool_t ** bool_ptr) { return sepol_bool_clone(handle->sepolh, boolean, bool_ptr); } hidden_def(semanage_bool_clone) void semanage_bool_free(semanage_bool_t * boolean) { sepol_bool_free(boolean); } hidden_def(semanage_bool_free) /* Record base functions */ record_table_t SEMANAGE_BOOL_RTABLE = { .create = semanage_bool_create, .key_extract = semanage_bool_key_extract, .key_free = semanage_bool_key_free, .clone = semanage_bool_clone, .compare = semanage_bool_compare, .compare2 = semanage_bool_compare2, .compare2_qsort = semanage_bool_compare2_qsort, .free = semanage_bool_free, };