1 #include <fcntl.h> 2 #include <sepol/policydb/policydb.h> 3 #include <sepol/policydb/util.h> 4 #include <sys/mman.h> 5 #include <sys/stat.h> 6 #include <unistd.h> 7 8 #include "utils.h" 9 10 bool USAGE_ERROR = false; 11 12 void display_allow(policydb_t *policydb, avtab_key_t *key, int idx, uint32_t perms) 13 { 14 printf(" allow %s %s:%s { %s };\n", 15 policydb->p_type_val_to_name[key->source_type 16 ? key->source_type - 1 : idx], 17 key->target_type == key->source_type ? "self" : 18 policydb->p_type_val_to_name[key->target_type 19 ? key->target_type - 1 : idx], 20 policydb->p_class_val_to_name[key->target_class - 1], 21 sepol_av_to_string 22 (policydb, key->target_class, perms)); 23 } 24 25 int load_policy(char *filename, policydb_t * policydb, struct policy_file *pf) 26 { 27 int fd; 28 struct stat sb; 29 void *map; 30 int ret; 31 32 fd = open(filename, O_RDONLY); 33 if (fd < 0) { 34 fprintf(stderr, "Can't open '%s': %s\n", filename, strerror(errno)); 35 return 1; 36 } 37 if (fstat(fd, &sb) < 0) { 38 fprintf(stderr, "Can't stat '%s': %s\n", filename, strerror(errno)); 39 close(fd); 40 return 1; 41 } 42 map = mmap(NULL, sb.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); 43 if (map == MAP_FAILED) { 44 fprintf(stderr, "Can't mmap '%s': %s\n", filename, strerror(errno)); 45 close(fd); 46 return 1; 47 } 48 49 policy_file_init(pf); 50 pf->type = PF_USE_MEMORY; 51 pf->data = map; 52 pf->len = sb.st_size; 53 if (policydb_init(policydb)) { 54 fprintf(stderr, "Could not initialize policydb!\n"); 55 close(fd); 56 munmap(map, sb.st_size); 57 return 1; 58 } 59 ret = policydb_read(policydb, pf, 0); 60 if (ret) { 61 fprintf(stderr, "error(s) encountered while parsing configuration\n"); 62 close(fd); 63 munmap(map, sb.st_size); 64 return 1; 65 } 66 67 return 0; 68 } 69