blob: 27f2ae5287329112b3b018cc932242e5489e1d55 [file] [log] [blame]
#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(), "r");
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;
}