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