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