| #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; |
| } |