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