1#include <stdlib.h>
2#include <string.h>
3
4#include <sepol/policydb/hashtab.h>
5#include <sepol/policydb/policydb.h>
6
7#include "debug.h"
8#include "handle.h"
9
10/* Check if a role exists */
11int sepol_role_exists(sepol_handle_t * handle __attribute__ ((unused)),
12		      sepol_policydb_t * p, const char *role, int *response)
13{
14
15	policydb_t *policydb = &p->p;
16	*response = (hashtab_search(policydb->p_roles.table, role) != NULL);
17
18	return STATUS_SUCCESS;
19}
20
21/* Fill an array with all valid roles */
22int sepol_role_list(sepol_handle_t * handle,
23		    sepol_policydb_t * p, char ***roles, unsigned int *nroles)
24{
25
26	policydb_t *policydb = &p->p;
27	unsigned int tmp_nroles = policydb->p_roles.nprim;
28	char **tmp_roles = (char **)malloc(tmp_nroles * sizeof(char *));
29	char **ptr;
30	unsigned int i;
31	if (!tmp_roles)
32		goto omem;
33
34	for (i = 0; i < tmp_nroles; i++) {
35		tmp_roles[i] = strdup(policydb->p_role_val_to_name[i]);
36		if (!tmp_roles[i])
37			goto omem;
38	}
39
40	*nroles = tmp_nroles;
41	*roles = tmp_roles;
42
43	return STATUS_SUCCESS;
44
45      omem:
46	ERR(handle, "out of memory, could not list roles");
47
48	ptr = tmp_roles;
49	while (ptr && *ptr)
50		free(*ptr++);
51	free(tmp_roles);
52	return STATUS_ERR;
53}
54