113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <stdio.h>
213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <stdlib.h>
313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <string.h>
413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <ctype.h>
513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include "get_default_type_internal.h"
683161f73eaa046b530aec6e672aaffbe493838a4Richard Haines#include <errno.h>
713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlestatic int find_default_type(FILE * fp, const char *role, char **type);
913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
1013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleint get_default_type(const char *role, char **type)
1113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{
1213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	FILE *fp = NULL;
1313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
1413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	fp = fopen(selinux_default_type_path(), "r");
1513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	if (!fp)
1613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		return -1;
1713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
1813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	if (find_default_type(fp, role, type) < 0) {
1913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		fclose(fp);
2013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		return -1;
2113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	}
2213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
2313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	fclose(fp);
2413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	return 0;
2513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
2613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
2713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlestatic int find_default_type(FILE * fp, const char *role, char **type)
2813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{
2913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	char buf[250];
30b82b7e02dfcd46db75a94352815830fdb651fa94Daniel P. Berrange	const char *ptr = "", *end;
31b82b7e02dfcd46db75a94352815830fdb651fa94Daniel P. Berrange	char *t;
3213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	size_t len;
3313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	int found = 0;
3413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
3513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	len = strlen(role);
3613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	while (!feof_unlocked(fp)) {
3783161f73eaa046b530aec6e672aaffbe493838a4Richard Haines		if (!fgets_unlocked(buf, sizeof buf, fp)) {
3883161f73eaa046b530aec6e672aaffbe493838a4Richard Haines			errno = EINVAL;
3913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			return -1;
4083161f73eaa046b530aec6e672aaffbe493838a4Richard Haines		}
4113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		if (buf[strlen(buf) - 1])
4213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			buf[strlen(buf) - 1] = 0;
4313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
4413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		ptr = buf;
4513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		while (*ptr && isspace(*ptr))
4613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			ptr++;
4713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		if (!(*ptr))
4813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			continue;
4913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
5013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		if (!strncmp(role, ptr, len)) {
5113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			end = ptr + len;
5213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			if (*end == ':') {
5313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				found = 1;
5413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				ptr = ++end;
5513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				break;
5613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			}
5713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		}
5813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	}
5913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
6083161f73eaa046b530aec6e672aaffbe493838a4Richard Haines	if (!found) {
6183161f73eaa046b530aec6e672aaffbe493838a4Richard Haines		errno = EINVAL;
6213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		return -1;
6383161f73eaa046b530aec6e672aaffbe493838a4Richard Haines	}
6413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
6513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	t = malloc(strlen(buf) - len);
6613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	if (!t)
6713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		return -1;
6813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	strcpy(t, ptr);
6913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	*type = t;
7013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	return 0;
7113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
72