#include #include #include #include #include "get_default_type_internal.h" #include 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; }