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