1#include <errno.h> 2#include <stdlib.h> 3#include <string.h> 4 5#include "boolean_internal.h" 6#include "debug.h" 7 8struct sepol_bool { 9 /* This boolean's name */ 10 char *name; 11 12 /* Its value */ 13 int value; 14}; 15 16struct sepol_bool_key { 17 /* This boolean's name */ 18 const char *name; 19}; 20 21int sepol_bool_key_create(sepol_handle_t * handle, 22 const char *name, sepol_bool_key_t ** key_ptr) 23{ 24 25 sepol_bool_key_t *tmp_key = 26 (sepol_bool_key_t *) malloc(sizeof(struct sepol_bool_key)); 27 28 if (!tmp_key) { 29 ERR(handle, "out of memory, " "could not create boolean key"); 30 return STATUS_ERR; 31 } 32 33 tmp_key->name = name; 34 35 *key_ptr = tmp_key; 36 return STATUS_SUCCESS; 37} 38 39hidden_def(sepol_bool_key_create) 40 41void sepol_bool_key_unpack(const sepol_bool_key_t * key, const char **name) 42{ 43 44 *name = key->name; 45} 46 47hidden_def(sepol_bool_key_unpack) 48 49int sepol_bool_key_extract(sepol_handle_t * handle, 50 const sepol_bool_t * boolean, 51 sepol_bool_key_t ** key_ptr) 52{ 53 54 if (sepol_bool_key_create(handle, boolean->name, key_ptr) < 0) { 55 ERR(handle, "could not extract key from boolean %s", 56 boolean->name); 57 return STATUS_ERR; 58 } 59 60 return STATUS_SUCCESS; 61} 62 63void sepol_bool_key_free(sepol_bool_key_t * key) 64{ 65 free(key); 66} 67 68int sepol_bool_compare(const sepol_bool_t * boolean, 69 const sepol_bool_key_t * key) 70{ 71 72 return strcmp(boolean->name, key->name); 73} 74 75int sepol_bool_compare2(const sepol_bool_t * boolean, 76 const sepol_bool_t * boolean2) 77{ 78 79 return strcmp(boolean->name, boolean2->name); 80} 81 82/* Name */ 83const char *sepol_bool_get_name(const sepol_bool_t * boolean) 84{ 85 86 return boolean->name; 87} 88 89hidden_def(sepol_bool_get_name) 90 91int sepol_bool_set_name(sepol_handle_t * handle, 92 sepol_bool_t * boolean, const char *name) 93{ 94 95 char *tmp_name = strdup(name); 96 if (!tmp_name) { 97 ERR(handle, "out of memory, could not set boolean name"); 98 return STATUS_ERR; 99 } 100 free(boolean->name); 101 boolean->name = tmp_name; 102 return STATUS_SUCCESS; 103} 104 105hidden_def(sepol_bool_set_name) 106 107/* Value */ 108int sepol_bool_get_value(const sepol_bool_t * boolean) 109{ 110 111 return boolean->value; 112} 113 114hidden_def(sepol_bool_get_value) 115 116void sepol_bool_set_value(sepol_bool_t * boolean, int value) 117{ 118 119 boolean->value = value; 120} 121 122hidden_def(sepol_bool_set_value) 123 124/* Create */ 125int sepol_bool_create(sepol_handle_t * handle, sepol_bool_t ** bool_ptr) 126{ 127 128 sepol_bool_t *boolean = (sepol_bool_t *) malloc(sizeof(sepol_bool_t)); 129 130 if (!boolean) { 131 ERR(handle, "out of memory, " 132 "could not create boolean record"); 133 return STATUS_ERR; 134 } 135 136 boolean->name = NULL; 137 boolean->value = 0; 138 139 *bool_ptr = boolean; 140 return STATUS_SUCCESS; 141} 142 143hidden_def(sepol_bool_create) 144 145/* Deep copy clone */ 146int sepol_bool_clone(sepol_handle_t * handle, 147 const sepol_bool_t * boolean, sepol_bool_t ** bool_ptr) 148{ 149 150 sepol_bool_t *new_bool = NULL; 151 152 if (sepol_bool_create(handle, &new_bool) < 0) 153 goto err; 154 155 if (sepol_bool_set_name(handle, new_bool, boolean->name) < 0) 156 goto err; 157 158 new_bool->value = boolean->value; 159 160 *bool_ptr = new_bool; 161 return STATUS_SUCCESS; 162 163 err: 164 ERR(handle, "could not clone boolean record"); 165 sepol_bool_free(new_bool); 166 return STATUS_ERR; 167} 168 169/* Destroy */ 170void sepol_bool_free(sepol_bool_t * boolean) 171{ 172 173 if (!boolean) 174 return; 175 176 free(boolean->name); 177 free(boolean); 178} 179 180hidden_def(sepol_bool_free) 181