18c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 28c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android/* Authors: Frank Mayer <mayerf@tresys.com> and Karl MacMillan <kmacmillan@tresys.com> 38c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android * 48c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android * Copyright (C) 2003,2004,2005 Tresys Technology, LLC 58c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android * This program is free software; you can redistribute it and/or modify 68c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android * it under the terms of the GNU General Public License as published by 78c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android * the Free Software Foundation, version 2. 88c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android */ 98c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 108c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android/* 118c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android * dismod.c 128c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android * 138c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android * Test program to the contents of a binary policy in text 148c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android * form. 158c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android * 168c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android * dismod binary_mod_file 178c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android */ 188c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 198c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <getopt.h> 208c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <assert.h> 218c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <sys/stat.h> 228c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <sys/types.h> 238c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <sys/mman.h> 248c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <errno.h> 258c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <stdio.h> 268c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <fcntl.h> 278c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <stdlib.h> 288c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <unistd.h> 298c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 308c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <sepol/policydb/policydb.h> 318c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <sepol/policydb/services.h> 328c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <sepol/policydb/conditional.h> 338c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <sepol/policydb/flask.h> 348c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <sepol/policydb/link.h> 358c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <sepol/policydb/module.h> 368c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <sepol/policydb/util.h> 378c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <sepol/policydb/polcaps.h> 388c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 398c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <byteswap.h> 408c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <endian.h> 418c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 428c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#if __BYTE_ORDER == __LITTLE_ENDIAN 438c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#define le32_to_cpu(x) (x) 448c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#else 458c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#define le32_to_cpu(x) bswap_32(x) 468c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#endif 478c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 488c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#define DISPLAY_AVBLOCK_COND_AVTAB 0 498c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#define DISPLAY_AVBLOCK_UNCOND_AVTAB 1 508c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#define DISPLAY_AVBLOCK_ROLE_TYPE_NODE 2 /* unused? */ 518c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#define DISPLAY_AVBLOCK_ROLE_TRANS 3 528c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#define DISPLAY_AVBLOCK_ROLE_ALLOW 4 538c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#define DISPLAY_AVBLOCK_REQUIRES 5 548c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#define DISPLAY_AVBLOCK_DECLARES 6 558c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#define DISPLAY_AVBLOCK_FILENAME_TRANS 7 568c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 578c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidstatic policydb_t policydb; 588c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidextern unsigned int ss_initialized; 598c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 608c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidint policyvers = MOD_POLICYDB_VERSION_BASE; 618c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 628c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidstatic const char *symbol_labels[9] = { 638c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android "commons", 648c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android "classes", "roles ", "types ", "users ", "bools ", 658c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android "levels ", "cats ", "attribs" 668c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android}; 678c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 688c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidvoid usage(char *progname) 698c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 708c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("usage: %s binary_pol_file\n\n", progname); 718c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android exit(1); 728c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 738c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 748c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidstatic void render_access_mask(uint32_t mask, uint32_t class, policydb_t * p, 758c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android FILE * fp) 768c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 778c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android char *perm; 788c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "{"); 798c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android perm = sepol_av_to_string(p, class, mask); 808c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (perm) 818c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "%s ", perm); 828c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "}"); 838c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 848c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 858c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidstatic void render_access_bitmap(ebitmap_t * map, uint32_t class, 868c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android policydb_t * p, FILE * fp) 878c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 888c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android unsigned int i; 898c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android char *perm; 908c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "{"); 918c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (i = ebitmap_startbit(map); i < ebitmap_length(map); i++) { 928c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (ebitmap_get_bit(map, i)) { 938c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android perm = sepol_av_to_string(p, class, 1 << i); 948c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (perm) 958c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " %s", perm); 968c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 978c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 988c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " }"); 998c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 1008c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 1018c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidstatic void display_id(policydb_t * p, FILE * fp, uint32_t symbol_type, 1028c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android uint32_t symbol_value, char *prefix) 1038c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 1048c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android char *id = p->sym_val_to_name[symbol_type][symbol_value]; 1058c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android scope_datum_t *scope = 1068c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android (scope_datum_t *) hashtab_search(p->scope[symbol_type].table, id); 1078c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android assert(scope != NULL); 1088c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (scope->scope == SCOPE_REQ) { 1098c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " [%s%s]", prefix, id); 1108c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } else { 1118c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " %s%s", prefix, id); 1128c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 1138c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 1148c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 1158c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidint display_type_set(type_set_t * set, uint32_t flags, policydb_t * policy, 1168c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android FILE * fp) 1178c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 118cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley unsigned int i, num_types; 1198c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 1208c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (set->flags & TYPE_STAR) { 1218c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " * "); 1228c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; 1238c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } else if (set->flags & TYPE_COMP) { 1248c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " ~"); 1258c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 1268c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 1278c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android num_types = 0; 1288c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (flags & RULE_SELF) { 1298c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android num_types++; 1308c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 1318c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 1328c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (i = ebitmap_startbit(&set->types); i < ebitmap_length(&set->types); 1338c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android i++) { 1348c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (!ebitmap_get_bit(&set->types, i)) 1358c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android continue; 1368c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android num_types++; 1378c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (num_types > 1) 1388c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 1398c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 1408c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 1418c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (num_types <= 1) { 1428c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (i = ebitmap_startbit(&set->negset); 1438c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android i < ebitmap_length(&set->negset); i++) { 1448c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (!ebitmap_get_bit(&set->negset, i)) 1458c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android continue; 1468c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android num_types++; 1478c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (num_types > 1) 1488c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 1498c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 1508c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 1518c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 1528c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (num_types > 1) 1538c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "{"); 1548c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 1558c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (i = ebitmap_startbit(&set->types); i < ebitmap_length(&set->types); 1568c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android i++) { 1578c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (!ebitmap_get_bit(&set->types, i)) 1588c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android continue; 1598c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_id(policy, fp, SYM_TYPES, i, ""); 1608c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 1618c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 1628c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (i = ebitmap_startbit(&set->negset); 1638c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android i < ebitmap_length(&set->negset); i++) { 1648c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (!ebitmap_get_bit(&set->negset, i)) 1658c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android continue; 1668c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_id(policy, fp, SYM_TYPES, i, "-"); 1678c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 1688c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 1698c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (flags & RULE_SELF) { 1708c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " self"); 1718c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 1728c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 1738c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (num_types > 1) 1748c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " }"); 1758c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 1768c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; 1778c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 1788c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 1798c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidint display_mod_role_set(role_set_t * roles, policydb_t * p, FILE * fp) 1808c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 181cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley unsigned int i, num = 0; 1828c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 1838c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (roles->flags & ROLE_STAR) { 1848c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " * "); 1858c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; 1868c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } else if (roles->flags & ROLE_COMP) { 1878c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " ~"); 1888c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 1898c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 1908c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (i = ebitmap_startbit(&roles->roles); 1918c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android i < ebitmap_length(&roles->roles); i++) { 1928c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (!ebitmap_get_bit(&roles->roles, i)) 1938c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android continue; 1948c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android num++; 1958c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (num > 1) { 1968c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "{"); 1978c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 1988c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 1998c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 2008c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 2018c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (i = ebitmap_startbit(&roles->roles); 2028c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android i < ebitmap_length(&roles->roles); i++) { 2038c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (ebitmap_get_bit(&roles->roles, i)) 2048c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_id(p, fp, SYM_ROLES, i, ""); 2058c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 2068c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 2078c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (num > 1) 2088c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " }"); 2098c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 2108c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; 2118c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 2128c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 2138c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 214cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalleyint display_avrule(avrule_t * avrule, policydb_t * policy, 2158c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android FILE * fp) 2168c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 2178c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android class_perm_node_t *cur; 2188c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android int num_classes; 2198c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 2208c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (avrule == NULL) { 2218c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " <empty>\n"); 2228c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; 2238c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 2248c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (avrule->specified & AVRULE_AV) { 2258c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (avrule->specified & AVRULE_ALLOWED) { 2268c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " allow"); 2278c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 2288c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (avrule->specified & AVRULE_AUDITALLOW) { 2298c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " auditallow "); 2308c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 2318c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (avrule->specified & AVRULE_DONTAUDIT) { 2328c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " dontaudit"); 2338c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 2348c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } else if (avrule->specified & AVRULE_TYPE) { 2358c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (avrule->specified & AVRULE_TRANSITION) { 2368c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " type_transition"); 2378c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 2388c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (avrule->specified & AVRULE_MEMBER) { 2398c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " type_member"); 2408c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 2418c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (avrule->specified & AVRULE_CHANGE) { 2428c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " type_change"); 2438c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 2448c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } else if (avrule->specified & AVRULE_NEVERALLOW) { 2458c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " neverallow"); 2468c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } else { 2478c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " ERROR: no valid rule type specified\n"); 2488c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return -1; 2498c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 2508c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 2518c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (display_type_set(&avrule->stypes, 0, policy, fp)) 2528c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return -1; 2538c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 2548c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (display_type_set(&avrule->ttypes, avrule->flags, policy, fp)) 2558c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return -1; 2568c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 2578c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " :"); 2588c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android cur = avrule->perms; 2598c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android num_classes = 0; 2608c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android while (cur) { 2618c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android num_classes++; 2628c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (num_classes > 1) 2638c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 2648c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android cur = cur->next; 2658c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 2668c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 2678c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (num_classes > 1) 2688c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " {"); 2698c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 2708c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android cur = avrule->perms; 2718c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android while (cur) { 2728c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_id(policy, fp, SYM_CLASSES, cur->class - 1, ""); 2738c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android cur = cur->next; 2748c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 2758c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 2768c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (num_classes > 1) 2778c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " }"); 2788c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " "); 2798c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 2808c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (avrule->specified & (AVRULE_AV | AVRULE_NEVERALLOW)) { 2818c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android render_access_mask(avrule->perms->data, avrule->perms->class, 2828c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android policy, fp); 2838c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } else if (avrule->specified & AVRULE_TYPE) { 2848c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_id(policy, fp, SYM_TYPES, avrule->perms->data - 1, ""); 2858c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 2868c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 2878c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, ";\n"); 2888c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 2898c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; 2908c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 2918c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 2928c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidint display_type_callback(hashtab_key_t key, hashtab_datum_t datum, void *data) 2938c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 2948c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android type_datum_t *type; 2958c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android FILE *fp; 296cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley unsigned int i, first_attrib = 1; 2978c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 2988c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android type = (type_datum_t *) datum; 2998c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fp = (FILE *) data; 3008c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 3018c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (type->primary) { 3028c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_id(&policydb, fp, SYM_TYPES, type->s.value - 1, ""); 3038c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " [%d]: ", type->s.value); 3048c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } else { 3058c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android /* as that aliases have no value of their own and that 3068c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android * they can never be required by a module, use this 3078c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android * alternative way of displaying a name */ 3088c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " %s [%d]: ", (char *)key, type->s.value); 3098c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 3108c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (type->flavor == TYPE_ATTRIB) { 3118c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "attribute for types"); 3128c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (i = ebitmap_startbit(&type->types); 3138c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android i < ebitmap_length(&type->types); i++) { 3148c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (!ebitmap_get_bit(&type->types, i)) 3158c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android continue; 3168c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (first_attrib) { 3178c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android first_attrib = 0; 3188c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } else { 3198c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, ","); 3208c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 3218c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_id(&policydb, fp, SYM_TYPES, i, ""); 3228c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 3238c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } else if (type->primary) { 3248c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "type"); 3258c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } else { 3268c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "alias for type"); 3278c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_id(&policydb, fp, SYM_TYPES, type->s.value - 1, ""); 3288c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 3298c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " flags:%x\n", type->flags); 3308c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 3318c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; 3328c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 3338c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 3348c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidint display_types(policydb_t * p, FILE * fp) 3358c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 3368c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (hashtab_map(p->p_types.table, display_type_callback, fp)) 3378c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return -1; 3388c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; 3398c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 3408c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 3418c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidint display_users(policydb_t * p, FILE * fp) 3428c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 343cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley unsigned int i, j; 3448c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android ebitmap_t *bitmap; 3458c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (i = 0; i < p->p_users.nprim; i++) { 3468c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_id(p, fp, SYM_USERS, i, ""); 3478c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, ":"); 3488c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android bitmap = &(p->user_val_to_struct[i]->roles.roles); 3498c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (j = ebitmap_startbit(bitmap); j < ebitmap_length(bitmap); 3508c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android j++) { 3518c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (ebitmap_get_bit(bitmap, j)) { 3528c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_id(p, fp, SYM_ROLES, j, ""); 3538c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 3548c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 3558c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "\n"); 3568c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 3578c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; 3588c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 3598c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 3608c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidint display_bools(policydb_t * p, FILE * fp) 3618c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 362cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley unsigned int i; 3638c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 3648c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (i = 0; i < p->p_bools.nprim; i++) { 3658c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_id(p, fp, SYM_BOOLS, i, ""); 3668c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " : %d\n", p->bool_val_to_struct[i]->state); 3678c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 3688c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; 3698c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 3708c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 3718c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidvoid display_expr(policydb_t * p, cond_expr_t * exp, FILE * fp) 3728c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 3738c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 3748c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android cond_expr_t *cur; 3758c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (cur = exp; cur != NULL; cur = cur->next) { 3768c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android switch (cur->expr_type) { 3778c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case COND_BOOL: 3788c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "%s ", 3798c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android p->p_bool_val_to_name[cur->bool - 1]); 3808c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 3818c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case COND_NOT: 3828c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "! "); 3838c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 3848c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case COND_OR: 3858c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "|| "); 3868c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 3878c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case COND_AND: 3888c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "&& "); 3898c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 3908c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case COND_XOR: 3918c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "^ "); 3928c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 3938c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case COND_EQ: 3948c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "== "); 3958c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 3968c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case COND_NEQ: 3978c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "!= "); 3988c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 3998c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android default: 4008c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "error!"); 4018c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 4028c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 4038c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 4048c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 4058c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 406cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalleyvoid display_policycon(FILE * fp) 4078c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 408cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley /* There was an attempt to implement this at one time. Look through 409cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley * git history to find it. */ 410cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley fprintf(fp, "Sorry, not implemented\n"); 4118c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 4128c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 4138c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidvoid display_initial_sids(policydb_t * p, FILE * fp) 4148c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 4158c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android ocontext_t *cur; 4168c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android char *user, *role, *type; 4178c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 4188c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "Initial SIDs:\n"); 4198c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (cur = p->ocontexts[OCON_ISID]; cur != NULL; cur = cur->next) { 4208c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android user = p->p_user_val_to_name[cur->context[0].user - 1]; 4218c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android role = p->p_role_val_to_name[cur->context[0].role - 1]; 4228c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android type = p->p_type_val_to_name[cur->context[0].type - 1]; 4238c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "\t%s: sid %d, context %s:%s:%s\n", 4248c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android cur->u.name, cur->sid[0], user, role, type); 4258c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 4268c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#if 0 4278c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "Policy Initial SIDs:\n"); 4288c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (cur = p->ocontexts[OCON_POLICYISID]; cur != NULL; cur = cur->next) { 4298c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android user = p->p_user_val_to_name[cur->context[0].user - 1]; 4308c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android role = p->p_role_val_to_name[cur->context[0].role - 1]; 4318c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android type = p->p_type_val_to_name[cur->context[0].type - 1]; 4328c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "\t%s: sid %d, context %s:%s:%s\n", 4338c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android cur->u.name, cur->sid[0], user, role, type); 4348c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 4358c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#endif 4368c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 4378c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 4388c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidvoid display_class_set(ebitmap_t *classes, policydb_t *p, FILE *fp) 4398c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 440cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley unsigned int i, num = 0; 4418c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 4428c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (i = ebitmap_startbit(classes); i < ebitmap_length(classes); i++) { 4438c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (!ebitmap_get_bit(classes, i)) 4448c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android continue; 4458c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android num++; 4468c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (num > 1) { 4478c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "{"); 4488c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 4498c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 4508c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 4518c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 4528c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (i = ebitmap_startbit(classes); i < ebitmap_length(classes); i++) { 4538c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (ebitmap_get_bit(classes, i)) 4548c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_id(p, fp, SYM_CLASSES, i, ""); 4558c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 4568c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 4578c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (num > 1) 4588c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " }"); 4598c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 4608c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 4618c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidvoid display_role_trans(role_trans_rule_t * tr, policydb_t * p, FILE * fp) 4628c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 4638c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (; tr; tr = tr->next) { 4648c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "role transition "); 4658c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_mod_role_set(&tr->roles, p, fp); 4668c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_type_set(&tr->types, 0, p, fp); 4678c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " :"); 4688c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_class_set(&tr->classes, p, fp); 4698c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_id(p, fp, SYM_ROLES, tr->new_role - 1, ""); 4708c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "\n"); 4718c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 4728c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 4738c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 4748c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidvoid display_role_allow(role_allow_rule_t * ra, policydb_t * p, FILE * fp) 4758c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 4768c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (; ra; ra = ra->next) { 4778c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "role allow "); 4788c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_mod_role_set(&ra->roles, p, fp); 4798c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_mod_role_set(&ra->new_roles, p, fp); 4808c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "\n"); 4818c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 4828c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 4838c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 484cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalleystatic void display_filename_trans(filename_trans_rule_t * tr, policydb_t * p, FILE * fp) 4858c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 486cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley fprintf(fp, "filename transition"); 4878c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (; tr; tr = tr->next) { 4888c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_type_set(&tr->stypes, 0, p, fp); 4898c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_type_set(&tr->ttypes, 0, p, fp); 4908c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_id(p, fp, SYM_CLASSES, tr->tclass - 1, ":"); 4918c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_id(p, fp, SYM_TYPES, tr->otype - 1, ""); 492cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley fprintf(fp, " %s\n", tr->name); 4938c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 4948c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 4958c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 496cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalleyint role_display_callback(hashtab_key_t key __attribute__((unused)), 497cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley hashtab_datum_t datum, void *data) 4988c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 4998c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android role_datum_t *role; 5008c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android FILE *fp; 5018c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 5028c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android role = (role_datum_t *) datum; 5038c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fp = (FILE *) data; 5048c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 5058c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "role:"); 5068c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_id(&policydb, fp, SYM_ROLES, role->s.value - 1, ""); 5078c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " types: "); 5088c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_type_set(&role->types, 0, &policydb, fp); 5098c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "\n"); 5108c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 5118c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; 5128c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 5138c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 5148c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidstatic int display_scope_index(scope_index_t * indices, policydb_t * p, 5158c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android FILE * out_fp) 5168c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 517cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley unsigned int i; 5188c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (i = 0; i < SYM_NUM; i++) { 519cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley unsigned int any_found = 0, j; 5208c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, "%s:", symbol_labels[i]); 5218c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (j = ebitmap_startbit(&indices->scope[i]); 5228c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android j < ebitmap_length(&indices->scope[i]); j++) { 5238c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (ebitmap_get_bit(&indices->scope[i], j)) { 5248c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android any_found = 1; 5258c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, " %s", 5268c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android p->sym_val_to_name[i][j]); 5278c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (i == SYM_CLASSES) { 5288c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (j < indices->class_perms_len) { 5298c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android render_access_bitmap(indices-> 5308c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android class_perms_map 5318c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android + j, j + 1, 5328c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android p, out_fp); 5338c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } else { 5348c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, 5358c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android "<no perms known>"); 5368c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 5378c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 5388c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 5398c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 5408c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (!any_found) { 5418c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, " <empty>"); 5428c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 5438c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, "\n"); 5448c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 5458c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; 5468c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 5478c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 5488c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#if 0 5498c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidint display_cond_expressions(policydb_t * p, FILE * fp) 5508c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 5518c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android cond_node_t *cur; 5528c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android cond_av_list_t *av_cur; 5538c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (cur = p->cond_list; cur != NULL; cur = cur->next) { 5548c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "expression: "); 5558c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_expr(p, cur->expr, fp); 5568c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "current state: %d\n", cur->cur_state); 5578c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "True list:\n"); 5588c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (av_cur = cur->true_list; av_cur != NULL; 5598c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android av_cur = av_cur->next) { 5608c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "\t"); 5618c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android render_av_rule(&av_cur->node->key, &av_cur->node->datum, 5628c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android RENDER_CONDITIONAL, p, fp); 5638c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 5648c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "False list:\n"); 5658c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (av_cur = cur->false_list; av_cur != NULL; 5668c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android av_cur = av_cur->next) { 5678c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "\t"); 5688c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android render_av_rule(&av_cur->node->key, &av_cur->node->datum, 5698c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android RENDER_CONDITIONAL, p, fp); 5708c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 5718c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 5728c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; 5738c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 5748c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 5758c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidint change_bool(char *name, int state, policydb_t * p, FILE * fp) 5768c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 5778c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android cond_bool_datum_t *bool; 5788c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 5798c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android bool = hashtab_search(p->p_bools.table, name); 5808c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (bool == NULL) { 5818c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "Could not find bool %s\n", name); 5828c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return -1; 5838c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 5848c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android bool->state = state; 5858c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android evaluate_conds(p); 5868c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; 5878c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 5888c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#endif 5898c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 590cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalleyint display_avdecl(avrule_decl_t * decl, int field, 5918c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android policydb_t * policy, FILE * out_fp) 5928c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 5938c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, "decl %u:%s\n", decl->decl_id, 5948c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android (decl->enabled ? " [enabled]" : "")); 5958c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android switch (field) { 5968c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case DISPLAY_AVBLOCK_COND_AVTAB:{ 5978c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android cond_list_t *cond = decl->cond_list; 5988c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android avrule_t *avrule; 5998c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android while (cond) { 6008c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, "expression: "); 6018c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_expr(&policydb, cond->expr, out_fp); 6028c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, "current state: %d\n", 6038c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android cond->cur_state); 6048c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, "True list:\n"); 6058c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android avrule = cond->avtrue_list; 6068c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android while (avrule) { 6078c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_avrule(avrule, 6088c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android &policydb, out_fp); 6098c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android avrule = avrule->next; 6108c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 6118c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, "False list:\n"); 6128c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android avrule = cond->avfalse_list; 6138c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android while (avrule) { 6148c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_avrule(avrule, 6158c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android &policydb, out_fp); 6168c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android avrule = avrule->next; 6178c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 6188c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android cond = cond->next; 6198c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 6208c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 6218c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 6228c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case DISPLAY_AVBLOCK_UNCOND_AVTAB:{ 6238c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android avrule_t *avrule = decl->avrules; 6248c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (avrule == NULL) { 6258c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, " <empty>\n"); 6268c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 6278c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android while (avrule != NULL) { 628cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley if (display_avrule(avrule, policy, out_fp)) 6298c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return -1; 6308c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android avrule = avrule->next; 6318c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 6328c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 6338c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 6348c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case DISPLAY_AVBLOCK_ROLE_TYPE_NODE:{ /* role_type_node */ 6358c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 6368c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 6378c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case DISPLAY_AVBLOCK_ROLE_TRANS:{ 6388c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_role_trans(decl->role_tr_rules, policy, out_fp); 6398c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 6408c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 6418c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case DISPLAY_AVBLOCK_ROLE_ALLOW:{ 6428c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_role_allow(decl->role_allow_rules, policy, 6438c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android out_fp); 6448c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 6458c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 6468c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case DISPLAY_AVBLOCK_REQUIRES:{ 6478c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (display_scope_index 6488c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android (&decl->required, policy, out_fp)) { 6498c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return -1; 6508c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 6518c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 6528c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 6538c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case DISPLAY_AVBLOCK_DECLARES:{ 6548c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (display_scope_index 6558c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android (&decl->declared, policy, out_fp)) { 6568c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return -1; 6578c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 6588c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 6598c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 6608c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case DISPLAY_AVBLOCK_FILENAME_TRANS: 6618c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_filename_trans(decl->filename_trans_rules, policy, 6628c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android out_fp); 6638c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 6648c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android default:{ 6658c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android assert(0); 6668c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 6678c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 6688c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; /* should never get here */ 6698c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 6708c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 671cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalleyint display_avblock(int field, policydb_t * policy, 6728c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android FILE * out_fp) 6738c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 6748c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android avrule_block_t *block = policydb.global; 6758c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android while (block != NULL) { 6768c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, "--- begin avrule block ---\n"); 6778c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android avrule_decl_t *decl = block->branch_list; 6788c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android while (decl != NULL) { 679cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley if (display_avdecl(decl, field, policy, out_fp)) { 6808c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return -1; 6818c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 6828c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android decl = decl->next; 6838c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 6848c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android block = block->next; 6858c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 6868c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; 6878c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 6888c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 6898c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidint display_handle_unknown(policydb_t * p, FILE * out_fp) 6908c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 6918c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (p->handle_unknown == ALLOW_UNKNOWN) 6928c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, "Allow unknown classes and perms\n"); 6938c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android else if (p->handle_unknown == DENY_UNKNOWN) 6948c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, "Deny unknown classes and perms\n"); 6958c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android else if (p->handle_unknown == REJECT_UNKNOWN) 6968c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, "Reject unknown classes and perms\n"); 6978c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; 6988c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 6998c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 7008c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidstatic int read_policy(char *filename, policydb_t * policy) 7018c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 7028c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android FILE *in_fp; 7038c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android struct policy_file f; 7048c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android int retval; 7058c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android uint32_t buf[1]; 7068c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 7078c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if ((in_fp = fopen(filename, "rb")) == NULL) { 7088c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(stderr, "Can't open '%s': %s\n", 7098c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android filename, strerror(errno)); 7108c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android exit(1); 7118c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 7128c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android policy_file_init(&f); 7138c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android f.type = PF_USE_STDIO; 7148c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android f.fp = in_fp; 7158c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 7168c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android /* peek at the first byte. if they are indicative of a 7178c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android package use the package reader, otherwise use the normal 7188c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android policy reader */ 7198c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (fread(buf, sizeof(uint32_t), 1, in_fp) != 1) { 7208c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(stderr, "Could not read from policy.\n"); 7218c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android exit(1); 7228c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 7238c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android rewind(in_fp); 7248c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (le32_to_cpu(buf[0]) == SEPOL_MODULE_PACKAGE_MAGIC) { 7258c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android sepol_module_package_t *package; 7268c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (sepol_module_package_create(&package)) { 7278c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(stderr, "%s: Out of memory!\n", __FUNCTION__); 7288c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android exit(1); 7298c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 7308c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android package->policy = (sepol_policydb_t *) policy; 7318c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android package->file_contexts = NULL; 7328c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android retval = 7338c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android sepol_module_package_read(package, 7348c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android (sepol_policy_file_t *) & f, 1); 7358c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android free(package->file_contexts); 7368c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } else { 7378c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (policydb_init(policy)) { 7388c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(stderr, "%s: Out of memory!\n", __FUNCTION__); 7398c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android exit(1); 7408c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 7418c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android retval = policydb_read(policy, &f, 1); 7428c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 7438c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fclose(in_fp); 7448c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return retval; 7458c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 7468c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 7478c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidstatic void link_module(policydb_t * base, FILE * out_fp) 7488c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 7498c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android char module_name[80] = { 0 }; 7508c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android int ret; 7518c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android policydb_t module, *mods = &module; 7528c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 7538c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (base->policy_type != POLICY_BASE) { 7548c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("Can only link if initial file was a base policy.\n"); 7558c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return; 7568c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 7578c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("\nModule filename: "); 7588c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fgets(module_name, sizeof(module_name), stdin); 7598c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android module_name[strlen(module_name) - 1] = '\0'; /* remove LF */ 7608c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (module_name[0] == '\0') { 7618c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return; 7628c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 7638c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 7648c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android /* read the binary policy */ 7658c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, "Reading module...\n"); 7668c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (read_policy(module_name, mods)) { 7678c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(stderr, 7688c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android "%s: error(s) encountered while loading policy\n", 7698c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android module_name); 7708c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android exit(1); 7718c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 7728c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (module.policy_type != POLICY_MOD) { 7738c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(stderr, "This file is not a loadable policy module.\n"); 7748c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android exit(1); 7758c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 7768c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (policydb_index_classes(&module) || 7778c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android policydb_index_others(NULL, &module, 0)) { 7788c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(stderr, "Could not index module.\n"); 7798c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android exit(1); 7808c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 7818c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android ret = link_modules(NULL, base, &mods, 1, 0); 7828c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (ret != 0) { 7838c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("Link failed (error %d)\n", ret); 7848c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("(You will probably need to restart dismod.)\n"); 7858c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 7868c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android policydb_destroy(&module); 7878c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return; 7888c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 7898c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 7908c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidstatic void display_policycaps(policydb_t * p, FILE * fp) 7918c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 7928c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android ebitmap_node_t *node; 7938c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android const char *capname; 7948c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android char buf[64]; 795cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley unsigned int i; 7968c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 7978c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "policy capabilities:\n"); 7988c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android ebitmap_for_each_bit(&p->policycaps, node, i) { 7998c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (ebitmap_node_get_bit(node, i)) { 8008c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android capname = sepol_polcap_getname(i); 8018c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (capname == NULL) { 8028c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android snprintf(buf, sizeof(buf), "unknown (%d)", i); 8038c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android capname = buf; 8048c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 8058c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "\t%s\n", capname); 8068c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 8078c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 8088c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 8098c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 8108c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidint menu() 8118c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 8128c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("\nSelect a command:\n"); 8138c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("1) display unconditional AVTAB\n"); 8148c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("2) display conditional AVTAB\n"); 8158c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("3) display users\n"); 8168c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("4) display bools\n"); 8178c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("5) display roles\n"); 8188c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("6) display types, attributes, and aliases\n"); 8198c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("7) display role transitions\n"); 8208c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("8) display role allows\n"); 8218c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("9) Display policycon\n"); 8228c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("0) Display initial SIDs\n"); 8238c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("\n"); 8248c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("a) Display avrule requirements\n"); 8258c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("b) Display avrule declarations\n"); 8268c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("c) Display policy capabilities\n"); 8278c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("l) Link in a module\n"); 8288c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("u) Display the unknown handling setting\n"); 8298c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("F) Display filename_trans rules\n"); 8308c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("\n"); 8318c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("f) set output file\n"); 8328c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("m) display menu\n"); 8338c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("q) quit\n"); 8348c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; 8358c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 8368c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 8378c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidint main(int argc, char **argv) 8388c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 8398c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android FILE *out_fp = stdout; 8408c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android char ans[81], OutfileName[121]; 8418c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 8428c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (argc != 2) 8438c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android usage(argv[0]); 8448c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 8458c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android /* read the binary policy */ 8468c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, "Reading policy...\n"); 847968aed00ed981987cf96dcfd7640e6dcde5c03a0Stephen Smalley if (policydb_init(&policydb)) { 848968aed00ed981987cf96dcfd7640e6dcde5c03a0Stephen Smalley fprintf(stderr, "%s: Out of memory!\n", __FUNCTION__); 849968aed00ed981987cf96dcfd7640e6dcde5c03a0Stephen Smalley exit(1); 850968aed00ed981987cf96dcfd7640e6dcde5c03a0Stephen Smalley } 8518c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (read_policy(argv[1], &policydb)) { 8528c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(stderr, 8538c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android "%s: error(s) encountered while loading policy\n", 8548c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android argv[0]); 8558c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android exit(1); 8568c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 8578c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 8588c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (policydb.policy_type != POLICY_BASE && 8598c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android policydb.policy_type != POLICY_MOD) { 8608c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(stderr, 8618c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android "This file is neither a base nor loadable policy module.\n"); 8628c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android exit(1); 8638c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 8648c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 8658c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (policydb_index_classes(&policydb)) { 8668c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(stderr, "Error indexing classes\n"); 8678c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android exit(1); 8688c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 8698c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 8708c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (policydb_index_others(NULL, &policydb, 1)) { 8718c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(stderr, "Error indexing others\n"); 8728c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android exit(1); 8738c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 8748c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 8758c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (policydb.policy_type == POLICY_BASE) { 8768c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("Binary base policy file loaded.\n\n"); 8778c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } else { 8788c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("Binary policy module file loaded.\n"); 8798c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("Module name: %s\n", policydb.name); 8808c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("Module version: %s\n", policydb.version); 8818c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("\n"); 8828c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 8838c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 8848c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android menu(); 8858c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (;;) { 8868c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("\nCommand (\'m\' for menu): "); 8878c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fgets(ans, sizeof(ans), stdin); 8888c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android switch (ans[0]) { 8898c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 8908c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case '1': 8918c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, "unconditional avtab:\n"); 8928c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_avblock(DISPLAY_AVBLOCK_UNCOND_AVTAB, 893cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley &policydb, out_fp); 8948c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 8958c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case '2': 8968c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, "conditional avtab:\n"); 8978c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_avblock(DISPLAY_AVBLOCK_COND_AVTAB, 898cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley &policydb, out_fp); 8998c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 9008c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case '3': 9018c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_users(&policydb, out_fp); 9028c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 9038c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case '4': 9048c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_bools(&policydb, out_fp); 9058c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 9068c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case '5': 9078c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (hashtab_map 9088c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android (policydb.p_roles.table, role_display_callback, 9098c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android out_fp)) 9108c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android exit(1); 9118c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 9128c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case '6': 9138c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (display_types(&policydb, out_fp)) { 9148c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(stderr, "Error displaying types\n"); 9158c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android exit(1); 9168c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 9178c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 9188c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case '7': 9198c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, "role transitions:\n"); 920cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley display_avblock(DISPLAY_AVBLOCK_ROLE_TRANS, 9218c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android &policydb, out_fp); 9228c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 9238c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case '8': 9248c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, "role allows:\n"); 925cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley display_avblock(DISPLAY_AVBLOCK_ROLE_ALLOW, 9268c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android &policydb, out_fp); 9278c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 9288c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case '9': 929cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley display_policycon(out_fp); 9308c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 9318c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case '0': 9328c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_initial_sids(&policydb, out_fp); 9338c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 9348c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case 'a': 9358c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, "avrule block requirements:\n"); 936cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley display_avblock(DISPLAY_AVBLOCK_REQUIRES, 9378c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android &policydb, out_fp); 9388c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 9398c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case 'b': 9408c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, "avrule block declarations:\n"); 941cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley display_avblock(DISPLAY_AVBLOCK_DECLARES, 9428c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android &policydb, out_fp); 9438c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 9448c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case 'c': 9458c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_policycaps(&policydb, out_fp); 9468c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 9478c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case 'u': 9488c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case 'U': 9498c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_handle_unknown(&policydb, out_fp); 9508c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 9518c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case 'f': 9528c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf 9538c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android ("\nFilename for output (<CR> for screen output): "); 9548c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fgets(OutfileName, sizeof(OutfileName), stdin); 9558c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android OutfileName[strlen(OutfileName) - 1] = '\0'; /* fix_string (remove LF) */ 9568c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (strlen(OutfileName) == 0) 9578c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android out_fp = stdout; 9588c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android else if ((out_fp = fopen(OutfileName, "w")) == NULL) { 9598c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(stderr, "Cannot open output file %s\n", 9608c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android OutfileName); 9618c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android out_fp = stdout; 9628c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 9638c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (out_fp != stdout) 9648c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("\nOutput to file: %s\n", OutfileName); 9658c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 9668c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case 'F': 9678c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, "filename_trans rules:\n"); 9688c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_avblock(DISPLAY_AVBLOCK_FILENAME_TRANS, 969cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley &policydb, out_fp); 9708c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 9718c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case 'l': 9728c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android link_module(&policydb, out_fp); 9738c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 9748c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case 'q': 9758c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android policydb_destroy(&policydb); 9768c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android exit(0); 9778c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 9788c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case 'm': 9798c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android menu(); 9808c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 9818c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android default: 9828c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("\nInvalid choice\n"); 9838c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android menu(); 9848c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 9858c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 9868c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 9878c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 9888c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android exit(EXIT_SUCCESS); 9898c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 990