113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <stdlib.h> 213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <string.h> 313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <sepol/policydb/hashtab.h> 513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <sepol/policydb/policydb.h> 613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include "debug.h" 813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include "handle.h" 913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 1013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* Check if a role exists */ 11033959726bf32ab59a52201e0696f269c0810609Justin P. Mattockint sepol_role_exists(sepol_handle_t * handle __attribute__ ((unused)), 1213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle sepol_policydb_t * p, const char *role, int *response) 1313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{ 1413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 1513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle policydb_t *policydb = &p->p; 1613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *response = (hashtab_search(policydb->p_roles.table, 1713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle (const hashtab_key_t)role) != NULL); 1813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 1913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle handle = NULL; 2013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle return STATUS_SUCCESS; 2113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle} 2213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 2313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* Fill an array with all valid roles */ 2413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleint sepol_role_list(sepol_handle_t * handle, 2513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle sepol_policydb_t * p, char ***roles, unsigned int *nroles) 2613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{ 2713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 2813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle policydb_t *policydb = &p->p; 2913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle unsigned int tmp_nroles = policydb->p_roles.nprim; 3013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle char **tmp_roles = (char **)malloc(tmp_nroles * sizeof(char *)); 3113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle char **ptr; 3213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle unsigned int i; 3313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!tmp_roles) 3413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle goto omem; 3513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 3613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle for (i = 0; i < tmp_nroles; i++) { 3713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle tmp_roles[i] = strdup(policydb->p_role_val_to_name[i]); 3813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!tmp_roles[i]) 3913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle goto omem; 4013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 4113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 4213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *nroles = tmp_nroles; 4313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *roles = tmp_roles; 4413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 4513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle return STATUS_SUCCESS; 4613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 4713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle omem: 4813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle ERR(handle, "out of memory, could not list roles"); 4913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 5013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle ptr = tmp_roles; 5113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle while (ptr && *ptr) 5213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle free(*ptr++); 5313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle free(tmp_roles); 5413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle return STATUS_ERR; 5513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle} 56