#include <stdlib.h>
#include <string.h>
#include <sepol/policydb/hashtab.h>
#include <sepol/policydb/policydb.h>
#include "debug.h"
#include "handle.h"
/* Check if a role exists */
int sepol_role_exists(sepol_handle_t * handle __attribute__ ((unused)),
sepol_policydb_t * p, const char *role, int *response)
{
policydb_t *policydb = &p->p;
*response = (hashtab_search(policydb->p_roles.table, role) != NULL);
return STATUS_SUCCESS;
}
/* Fill an array with all valid roles */
int sepol_role_list(sepol_handle_t * handle,
sepol_policydb_t * p, char ***roles, unsigned int *nroles)
{
policydb_t *policydb = &p->p;
unsigned int tmp_nroles = policydb->p_roles.nprim;
char **tmp_roles = (char **)malloc(tmp_nroles * sizeof(char *));
char **ptr;
unsigned int i;
if (!tmp_roles)
goto omem;
for (i = 0; i < tmp_nroles; i++) {
tmp_roles[i] = strdup(policydb->p_role_val_to_name[i]);
if (!tmp_roles[i])
goto omem;
}
*nroles = tmp_nroles;
*roles = tmp_roles;
return STATUS_SUCCESS;
omem:
ERR(handle, "out of memory, could not list roles");
ptr = tmp_roles;
while (ptr && *ptr)
free(*ptr++);
free(tmp_roles);
return STATUS_ERR;
}