1255e72915d4cbddceb435e13d81601755714e9fSE Android#include <errno.h> 2255e72915d4cbddceb435e13d81601755714e9fSE Android#include <stdlib.h> 3255e72915d4cbddceb435e13d81601755714e9fSE Android#include <string.h> 4255e72915d4cbddceb435e13d81601755714e9fSE Android 5255e72915d4cbddceb435e13d81601755714e9fSE Android#include "boolean_internal.h" 6255e72915d4cbddceb435e13d81601755714e9fSE Android#include "debug.h" 7255e72915d4cbddceb435e13d81601755714e9fSE Android 8255e72915d4cbddceb435e13d81601755714e9fSE Androidstruct sepol_bool { 9255e72915d4cbddceb435e13d81601755714e9fSE Android /* This boolean's name */ 10255e72915d4cbddceb435e13d81601755714e9fSE Android char *name; 11255e72915d4cbddceb435e13d81601755714e9fSE Android 12255e72915d4cbddceb435e13d81601755714e9fSE Android /* Its value */ 13255e72915d4cbddceb435e13d81601755714e9fSE Android int value; 14255e72915d4cbddceb435e13d81601755714e9fSE Android}; 15255e72915d4cbddceb435e13d81601755714e9fSE Android 16255e72915d4cbddceb435e13d81601755714e9fSE Androidstruct sepol_bool_key { 17255e72915d4cbddceb435e13d81601755714e9fSE Android /* This boolean's name */ 18255e72915d4cbddceb435e13d81601755714e9fSE Android const char *name; 19255e72915d4cbddceb435e13d81601755714e9fSE Android}; 20255e72915d4cbddceb435e13d81601755714e9fSE Android 21255e72915d4cbddceb435e13d81601755714e9fSE Androidint sepol_bool_key_create(sepol_handle_t * handle, 22255e72915d4cbddceb435e13d81601755714e9fSE Android const char *name, sepol_bool_key_t ** key_ptr) 23255e72915d4cbddceb435e13d81601755714e9fSE Android{ 24255e72915d4cbddceb435e13d81601755714e9fSE Android 25255e72915d4cbddceb435e13d81601755714e9fSE Android sepol_bool_key_t *tmp_key = 26255e72915d4cbddceb435e13d81601755714e9fSE Android (sepol_bool_key_t *) malloc(sizeof(struct sepol_bool_key)); 27255e72915d4cbddceb435e13d81601755714e9fSE Android 28255e72915d4cbddceb435e13d81601755714e9fSE Android if (!tmp_key) { 29255e72915d4cbddceb435e13d81601755714e9fSE Android ERR(handle, "out of memory, " "could not create boolean key"); 30255e72915d4cbddceb435e13d81601755714e9fSE Android return STATUS_ERR; 31255e72915d4cbddceb435e13d81601755714e9fSE Android } 32255e72915d4cbddceb435e13d81601755714e9fSE Android 33255e72915d4cbddceb435e13d81601755714e9fSE Android tmp_key->name = name; 34255e72915d4cbddceb435e13d81601755714e9fSE Android 35255e72915d4cbddceb435e13d81601755714e9fSE Android *key_ptr = tmp_key; 36255e72915d4cbddceb435e13d81601755714e9fSE Android return STATUS_SUCCESS; 37255e72915d4cbddceb435e13d81601755714e9fSE Android} 38255e72915d4cbddceb435e13d81601755714e9fSE Android 39255e72915d4cbddceb435e13d81601755714e9fSE Androidhidden_def(sepol_bool_key_create) 40255e72915d4cbddceb435e13d81601755714e9fSE Android 41255e72915d4cbddceb435e13d81601755714e9fSE Androidvoid sepol_bool_key_unpack(const sepol_bool_key_t * key, const char **name) 42255e72915d4cbddceb435e13d81601755714e9fSE Android{ 43255e72915d4cbddceb435e13d81601755714e9fSE Android 44255e72915d4cbddceb435e13d81601755714e9fSE Android *name = key->name; 45255e72915d4cbddceb435e13d81601755714e9fSE Android} 46255e72915d4cbddceb435e13d81601755714e9fSE Android 47255e72915d4cbddceb435e13d81601755714e9fSE Androidhidden_def(sepol_bool_key_unpack) 48255e72915d4cbddceb435e13d81601755714e9fSE Android 49255e72915d4cbddceb435e13d81601755714e9fSE Androidint sepol_bool_key_extract(sepol_handle_t * handle, 50255e72915d4cbddceb435e13d81601755714e9fSE Android const sepol_bool_t * boolean, 51255e72915d4cbddceb435e13d81601755714e9fSE Android sepol_bool_key_t ** key_ptr) 52255e72915d4cbddceb435e13d81601755714e9fSE Android{ 53255e72915d4cbddceb435e13d81601755714e9fSE Android 54255e72915d4cbddceb435e13d81601755714e9fSE Android if (sepol_bool_key_create(handle, boolean->name, key_ptr) < 0) { 55255e72915d4cbddceb435e13d81601755714e9fSE Android ERR(handle, "could not extract key from boolean %s", 56255e72915d4cbddceb435e13d81601755714e9fSE Android boolean->name); 57255e72915d4cbddceb435e13d81601755714e9fSE Android return STATUS_ERR; 58255e72915d4cbddceb435e13d81601755714e9fSE Android } 59255e72915d4cbddceb435e13d81601755714e9fSE Android 60255e72915d4cbddceb435e13d81601755714e9fSE Android return STATUS_SUCCESS; 61255e72915d4cbddceb435e13d81601755714e9fSE Android} 62255e72915d4cbddceb435e13d81601755714e9fSE Android 63255e72915d4cbddceb435e13d81601755714e9fSE Androidvoid sepol_bool_key_free(sepol_bool_key_t * key) 64255e72915d4cbddceb435e13d81601755714e9fSE Android{ 65255e72915d4cbddceb435e13d81601755714e9fSE Android free(key); 66255e72915d4cbddceb435e13d81601755714e9fSE Android} 67255e72915d4cbddceb435e13d81601755714e9fSE Android 68255e72915d4cbddceb435e13d81601755714e9fSE Androidint sepol_bool_compare(const sepol_bool_t * boolean, 69255e72915d4cbddceb435e13d81601755714e9fSE Android const sepol_bool_key_t * key) 70255e72915d4cbddceb435e13d81601755714e9fSE Android{ 71255e72915d4cbddceb435e13d81601755714e9fSE Android 72255e72915d4cbddceb435e13d81601755714e9fSE Android return strcmp(boolean->name, key->name); 73255e72915d4cbddceb435e13d81601755714e9fSE Android} 74255e72915d4cbddceb435e13d81601755714e9fSE Android 75255e72915d4cbddceb435e13d81601755714e9fSE Androidint sepol_bool_compare2(const sepol_bool_t * boolean, 76255e72915d4cbddceb435e13d81601755714e9fSE Android const sepol_bool_t * boolean2) 77255e72915d4cbddceb435e13d81601755714e9fSE Android{ 78255e72915d4cbddceb435e13d81601755714e9fSE Android 79255e72915d4cbddceb435e13d81601755714e9fSE Android return strcmp(boolean->name, boolean2->name); 80255e72915d4cbddceb435e13d81601755714e9fSE Android} 81255e72915d4cbddceb435e13d81601755714e9fSE Android 82255e72915d4cbddceb435e13d81601755714e9fSE Android/* Name */ 83255e72915d4cbddceb435e13d81601755714e9fSE Androidconst char *sepol_bool_get_name(const sepol_bool_t * boolean) 84255e72915d4cbddceb435e13d81601755714e9fSE Android{ 85255e72915d4cbddceb435e13d81601755714e9fSE Android 86255e72915d4cbddceb435e13d81601755714e9fSE Android return boolean->name; 87255e72915d4cbddceb435e13d81601755714e9fSE Android} 88255e72915d4cbddceb435e13d81601755714e9fSE Android 89255e72915d4cbddceb435e13d81601755714e9fSE Androidhidden_def(sepol_bool_get_name) 90255e72915d4cbddceb435e13d81601755714e9fSE Android 91255e72915d4cbddceb435e13d81601755714e9fSE Androidint sepol_bool_set_name(sepol_handle_t * handle, 92255e72915d4cbddceb435e13d81601755714e9fSE Android sepol_bool_t * boolean, const char *name) 93255e72915d4cbddceb435e13d81601755714e9fSE Android{ 94255e72915d4cbddceb435e13d81601755714e9fSE Android 95255e72915d4cbddceb435e13d81601755714e9fSE Android char *tmp_name = strdup(name); 96255e72915d4cbddceb435e13d81601755714e9fSE Android if (!tmp_name) { 97255e72915d4cbddceb435e13d81601755714e9fSE Android ERR(handle, "out of memory, could not set boolean name"); 98255e72915d4cbddceb435e13d81601755714e9fSE Android return STATUS_ERR; 99255e72915d4cbddceb435e13d81601755714e9fSE Android } 100255e72915d4cbddceb435e13d81601755714e9fSE Android free(boolean->name); 101255e72915d4cbddceb435e13d81601755714e9fSE Android boolean->name = tmp_name; 102255e72915d4cbddceb435e13d81601755714e9fSE Android return STATUS_SUCCESS; 103255e72915d4cbddceb435e13d81601755714e9fSE Android} 104255e72915d4cbddceb435e13d81601755714e9fSE Android 105255e72915d4cbddceb435e13d81601755714e9fSE Androidhidden_def(sepol_bool_set_name) 106255e72915d4cbddceb435e13d81601755714e9fSE Android 107255e72915d4cbddceb435e13d81601755714e9fSE Android/* Value */ 108255e72915d4cbddceb435e13d81601755714e9fSE Androidint sepol_bool_get_value(const sepol_bool_t * boolean) 109255e72915d4cbddceb435e13d81601755714e9fSE Android{ 110255e72915d4cbddceb435e13d81601755714e9fSE Android 111255e72915d4cbddceb435e13d81601755714e9fSE Android return boolean->value; 112255e72915d4cbddceb435e13d81601755714e9fSE Android} 113255e72915d4cbddceb435e13d81601755714e9fSE Android 114255e72915d4cbddceb435e13d81601755714e9fSE Androidhidden_def(sepol_bool_get_value) 115255e72915d4cbddceb435e13d81601755714e9fSE Android 116255e72915d4cbddceb435e13d81601755714e9fSE Androidvoid sepol_bool_set_value(sepol_bool_t * boolean, int value) 117255e72915d4cbddceb435e13d81601755714e9fSE Android{ 118255e72915d4cbddceb435e13d81601755714e9fSE Android 119255e72915d4cbddceb435e13d81601755714e9fSE Android boolean->value = value; 120255e72915d4cbddceb435e13d81601755714e9fSE Android} 121255e72915d4cbddceb435e13d81601755714e9fSE Android 122255e72915d4cbddceb435e13d81601755714e9fSE Androidhidden_def(sepol_bool_set_value) 123255e72915d4cbddceb435e13d81601755714e9fSE Android 124255e72915d4cbddceb435e13d81601755714e9fSE Android/* Create */ 125255e72915d4cbddceb435e13d81601755714e9fSE Androidint sepol_bool_create(sepol_handle_t * handle, sepol_bool_t ** bool_ptr) 126255e72915d4cbddceb435e13d81601755714e9fSE Android{ 127255e72915d4cbddceb435e13d81601755714e9fSE Android 128255e72915d4cbddceb435e13d81601755714e9fSE Android sepol_bool_t *boolean = (sepol_bool_t *) malloc(sizeof(sepol_bool_t)); 129255e72915d4cbddceb435e13d81601755714e9fSE Android 130255e72915d4cbddceb435e13d81601755714e9fSE Android if (!boolean) { 131255e72915d4cbddceb435e13d81601755714e9fSE Android ERR(handle, "out of memory, " 132255e72915d4cbddceb435e13d81601755714e9fSE Android "could not create boolean record"); 133255e72915d4cbddceb435e13d81601755714e9fSE Android return STATUS_ERR; 134255e72915d4cbddceb435e13d81601755714e9fSE Android } 135255e72915d4cbddceb435e13d81601755714e9fSE Android 136255e72915d4cbddceb435e13d81601755714e9fSE Android boolean->name = NULL; 137255e72915d4cbddceb435e13d81601755714e9fSE Android boolean->value = 0; 138255e72915d4cbddceb435e13d81601755714e9fSE Android 139255e72915d4cbddceb435e13d81601755714e9fSE Android *bool_ptr = boolean; 140255e72915d4cbddceb435e13d81601755714e9fSE Android return STATUS_SUCCESS; 141255e72915d4cbddceb435e13d81601755714e9fSE Android} 142255e72915d4cbddceb435e13d81601755714e9fSE Android 143255e72915d4cbddceb435e13d81601755714e9fSE Androidhidden_def(sepol_bool_create) 144255e72915d4cbddceb435e13d81601755714e9fSE Android 145255e72915d4cbddceb435e13d81601755714e9fSE Android/* Deep copy clone */ 146255e72915d4cbddceb435e13d81601755714e9fSE Androidint sepol_bool_clone(sepol_handle_t * handle, 147255e72915d4cbddceb435e13d81601755714e9fSE Android const sepol_bool_t * boolean, sepol_bool_t ** bool_ptr) 148255e72915d4cbddceb435e13d81601755714e9fSE Android{ 149255e72915d4cbddceb435e13d81601755714e9fSE Android 150255e72915d4cbddceb435e13d81601755714e9fSE Android sepol_bool_t *new_bool = NULL; 151255e72915d4cbddceb435e13d81601755714e9fSE Android 152255e72915d4cbddceb435e13d81601755714e9fSE Android if (sepol_bool_create(handle, &new_bool) < 0) 153255e72915d4cbddceb435e13d81601755714e9fSE Android goto err; 154255e72915d4cbddceb435e13d81601755714e9fSE Android 155255e72915d4cbddceb435e13d81601755714e9fSE Android if (sepol_bool_set_name(handle, new_bool, boolean->name) < 0) 156255e72915d4cbddceb435e13d81601755714e9fSE Android goto err; 157255e72915d4cbddceb435e13d81601755714e9fSE Android 158255e72915d4cbddceb435e13d81601755714e9fSE Android new_bool->value = boolean->value; 159255e72915d4cbddceb435e13d81601755714e9fSE Android 160255e72915d4cbddceb435e13d81601755714e9fSE Android *bool_ptr = new_bool; 161255e72915d4cbddceb435e13d81601755714e9fSE Android return STATUS_SUCCESS; 162255e72915d4cbddceb435e13d81601755714e9fSE Android 163255e72915d4cbddceb435e13d81601755714e9fSE Android err: 164255e72915d4cbddceb435e13d81601755714e9fSE Android ERR(handle, "could not clone boolean record"); 165255e72915d4cbddceb435e13d81601755714e9fSE Android sepol_bool_free(new_bool); 166255e72915d4cbddceb435e13d81601755714e9fSE Android return STATUS_ERR; 167255e72915d4cbddceb435e13d81601755714e9fSE Android} 168255e72915d4cbddceb435e13d81601755714e9fSE Android 169255e72915d4cbddceb435e13d81601755714e9fSE Android/* Destroy */ 170255e72915d4cbddceb435e13d81601755714e9fSE Androidvoid sepol_bool_free(sepol_bool_t * boolean) 171255e72915d4cbddceb435e13d81601755714e9fSE Android{ 172255e72915d4cbddceb435e13d81601755714e9fSE Android 173255e72915d4cbddceb435e13d81601755714e9fSE Android if (!boolean) 174255e72915d4cbddceb435e13d81601755714e9fSE Android return; 175255e72915d4cbddceb435e13d81601755714e9fSE Android 176255e72915d4cbddceb435e13d81601755714e9fSE Android free(boolean->name); 177255e72915d4cbddceb435e13d81601755714e9fSE Android free(boolean); 178255e72915d4cbddceb435e13d81601755714e9fSE Android} 179255e72915d4cbddceb435e13d81601755714e9fSE Android 180255e72915d4cbddceb435e13d81601755714e9fSE Androidhidden_def(sepol_bool_free) 181