#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "get_default_type_internal.h"
#include <errno.h>

static int find_default_type(FILE * fp, const char *role, char **type);

int get_default_type(const char *role, char **type)
{
	FILE *fp = NULL;

	fp = fopen(selinux_default_type_path(), "re");
	if (!fp)
		return -1;

	if (find_default_type(fp, role, type) < 0) {
		fclose(fp);
		return -1;
	}

	fclose(fp);
	return 0;
}

static int find_default_type(FILE * fp, const char *role, char **type)
{
	char buf[250];
	const char *ptr = "", *end;
	char *t;
	size_t len;
	int found = 0;

	len = strlen(role);
	while (!feof_unlocked(fp)) {
		if (!fgets_unlocked(buf, sizeof buf, fp)) {
			errno = EINVAL;
			return -1;
		}
		if (buf[strlen(buf) - 1])
			buf[strlen(buf) - 1] = 0;

		ptr = buf;
		while (*ptr && isspace(*ptr))
			ptr++;
		if (!(*ptr))
			continue;

		if (!strncmp(role, ptr, len)) {
			end = ptr + len;
			if (*end == ':') {
				found = 1;
				ptr = ++end;
				break;
			}
		}
	}

	if (!found) {
		errno = EINVAL;
		return -1;
	}

	t = malloc(strlen(buf) - len);
	if (!t)
		return -1;
	strcpy(t, ptr);
	*type = t;
	return 0;
}
