18c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 28c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android/* Authors: Frank Mayer <mayerf@tresys.com> and Karl MacMillan <kmacmillan@tresys.com> 38c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android * 48c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android * Copyright (C) 2003 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 * displaypol.c 128c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android * 138c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android * Test program to the contents of a binary policy in text 148c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android * form. This program currently only displays the 158c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android * avtab (including conditional avtab) rules. 168c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android * 178c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android * displaypol binary_pol_file 188c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android */ 198c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 208c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <sepol/policydb/policydb.h> 218c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <sepol/policydb/avtab.h> 228c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <sepol/policydb/services.h> 238c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <sepol/policydb/conditional.h> 248c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <sepol/policydb/expand.h> 258c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <sepol/policydb/util.h> 268c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <sepol/policydb/polcaps.h> 278c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <getopt.h> 288c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <assert.h> 298c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <unistd.h> 308c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <stdlib.h> 318c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <sys/stat.h> 328c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <sys/types.h> 338c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <sys/mman.h> 348c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <errno.h> 358c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <stdio.h> 368c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include <fcntl.h> 378c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 388c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidstatic policydb_t policydb; 398c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 408c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidvoid usage(char *progname) 418c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 428c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("usage: %s binary_pol_file\n\n", progname); 438c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android exit(1); 448c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 458c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 468c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidint render_access_mask(uint32_t mask, avtab_key_t * key, policydb_t * p, 478c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android FILE * fp) 488c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 498c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android char *perm; 508c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "{"); 518c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android perm = sepol_av_to_string(p, key->target_class, mask); 528c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (perm) 538c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "%s ", perm); 548c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "}"); 558c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; 568c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 578c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 588c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidint render_type(uint32_t type, policydb_t * p, FILE * fp) 598c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 608c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "%s", p->p_type_val_to_name[type - 1]); 618c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; 628c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 638c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 648c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidint render_key(avtab_key_t * key, policydb_t * p, FILE * fp) 658c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 668c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android char *stype, *ttype, *tclass; 678c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android stype = p->p_type_val_to_name[key->source_type - 1]; 688c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android ttype = p->p_type_val_to_name[key->target_type - 1]; 698c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android tclass = p->p_class_val_to_name[key->target_class - 1]; 708c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (stype && ttype) 718c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "%s %s : %s ", stype, ttype, tclass); 728c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android else if (stype) 738c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "%s %u : %s ", stype, key->target_type, tclass); 748c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android else if (ttype) 758c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "%u %s : %s ", key->source_type, ttype, tclass); 768c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android else 778c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "%u %u : %s ", key->source_type, key->target_type, 788c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android tclass); 798c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; 808c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 818c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 828c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android/* 'what' values for this function */ 838c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#define RENDER_UNCONDITIONAL 0x0001 /* render all regardless of enabled state */ 848c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#define RENDER_ENABLED 0x0002 858c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#define RENDER_DISABLED 0x0004 868c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#define RENDER_CONDITIONAL (RENDER_ENABLED|RENDER_DISABLED) 878c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 888c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidint render_av_rule(avtab_key_t * key, avtab_datum_t * datum, uint32_t what, 898c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android policydb_t * p, FILE * fp) 908c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 918c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (!(what & RENDER_UNCONDITIONAL)) { 928c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (what != RENDER_CONDITIONAL && (((what & RENDER_ENABLED) 938c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android && !(key-> 948c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android specified & 958c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android AVTAB_ENABLED)) 968c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android || ((what & RENDER_DISABLED) 978c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android && (key-> 988c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android specified & 998c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android AVTAB_ENABLED)))) { 1008c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; /* doesn't match selection criteria */ 1018c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 1028c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 1038c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 1048c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (!(what & RENDER_UNCONDITIONAL)) { 1058c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (key->specified & AVTAB_ENABLED) 1068c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "[enabled] "); 1078c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android else if (!(key->specified & AVTAB_ENABLED)) 1088c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "[disabled] "); 1098c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 1108c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 1118c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (key->specified & AVTAB_AV) { 1128c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (key->specified & AVTAB_ALLOWED) { 1138c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "allow "); 1148c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android render_key(key, p, fp); 1158c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android render_access_mask(datum->data, key, p, fp); 1168c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, ";\n"); 1178c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 1188c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (key->specified & AVTAB_AUDITALLOW) { 1198c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "auditallow "); 1208c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android render_key(key, p, fp); 1218c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android render_access_mask(datum->data, key, p, fp); 1228c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, ";\n"); 1238c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 1248c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (key->specified & AVTAB_AUDITDENY) { 1258c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "dontaudit "); 1268c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android render_key(key, p, fp); 1278c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android /* We inverse the mask for dontaudit since the mask is internally stored 1288c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android * as a auditdeny mask */ 1298c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android render_access_mask(~datum->data, key, p, fp); 1308c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, ";\n"); 1318c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 1328c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } else if (key->specified & AVTAB_TYPE) { 1338c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (key->specified & AVTAB_TRANSITION) { 1348c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "type_transition "); 1358c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android render_key(key, p, fp); 1368c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android render_type(datum->data, p, fp); 1378c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, ";\n"); 1388c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 1398c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (key->specified & AVTAB_MEMBER) { 1408c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "type_member "); 1418c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android render_key(key, p, fp); 1428c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android render_type(datum->data, p, fp); 1438c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, ";\n"); 1448c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 1458c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (key->specified & AVTAB_CHANGE) { 1468c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "type_change "); 1478c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android render_key(key, p, fp); 1488c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android render_type(datum->data, p, fp); 1498c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, ";\n"); 1508c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 1518c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } else { 1528c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " ERROR: no valid rule type specified\n"); 1538c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return -1; 1548c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 1558c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; 1568c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 1578c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 1588c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidint display_avtab(avtab_t * a, uint32_t what, policydb_t * p, FILE * fp) 1598c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 160cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley unsigned int i; 1618c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android avtab_ptr_t cur; 1628c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android avtab_t expa; 1638c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 1648c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (avtab_init(&expa)) 1658c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android goto oom; 1668c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (expand_avtab(p, a, &expa)) { 1678c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android avtab_destroy(&expa); 1688c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android goto oom; 1698c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 1708c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 1718c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android /* hmm...should have used avtab_map. */ 1728c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (i = 0; i < expa.nslot; i++) { 1738c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (cur = expa.htable[i]; cur; cur = cur->next) { 1748c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android render_av_rule(&cur->key, &cur->datum, what, p, fp); 1758c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 1768c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 1778c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android avtab_destroy(&expa); 1788c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "\n"); 1798c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; 1808c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android oom: 1818c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(stderr, "out of memory\n"); 1828c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 1; 1838c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 1848c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 1858c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidint display_bools(policydb_t * p, FILE * fp) 1868c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 187cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley unsigned int i; 1888c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 1898c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (i = 0; i < p->p_bools.nprim; i++) { 1908c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "%s : %d\n", p->p_bool_val_to_name[i], 1918c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android p->bool_val_to_struct[i]->state); 1928c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 1938c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; 1948c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 1958c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 1968c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidvoid display_expr(policydb_t * p, cond_expr_t * exp, FILE * fp) 1978c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 1988c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 1998c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android cond_expr_t *cur; 2008c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (cur = exp; cur != NULL; cur = cur->next) { 2018c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android switch (cur->expr_type) { 2028c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case COND_BOOL: 2038c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "%s ", 2048c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android p->p_bool_val_to_name[cur->bool - 1]); 2058c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 2068c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case COND_NOT: 2078c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "! "); 2088c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 2098c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case COND_OR: 2108c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "|| "); 2118c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 2128c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case COND_AND: 2138c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "&& "); 2148c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 2158c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case COND_XOR: 2168c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "^ "); 2178c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 2188c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case COND_EQ: 2198c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "== "); 2208c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 2218c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case COND_NEQ: 2228c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "!= "); 2238c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 2248c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android default: 2258c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "error!"); 2268c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 2278c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 2288c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 2298c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 2308c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 2318c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidint display_cond_expressions(policydb_t * p, FILE * fp) 2328c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 2338c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android cond_node_t *cur; 2348c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android cond_av_list_t *av_cur, *expl = NULL; 2358c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android avtab_t expa; 2368c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 2378c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (cur = p->cond_list; cur != NULL; cur = cur->next) { 2388c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "expression: "); 2398c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_expr(p, cur->expr, fp); 2408c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "current state: %d\n", cur->cur_state); 2418c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "True list:\n"); 2428c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (avtab_init(&expa)) 2438c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android goto oom; 2448c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (expand_cond_av_list(p, cur->true_list, &expl, &expa)) { 2458c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android avtab_destroy(&expa); 2468c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android goto oom; 2478c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 2488c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (av_cur = expl; av_cur != NULL; av_cur = av_cur->next) { 2498c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "\t"); 2508c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android render_av_rule(&av_cur->node->key, &av_cur->node->datum, 2518c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android RENDER_CONDITIONAL, p, fp); 2528c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 2538c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android cond_av_list_destroy(expl); 2548c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android avtab_destroy(&expa); 2558c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "False list:\n"); 2568c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (avtab_init(&expa)) 2578c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android goto oom; 2588c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (expand_cond_av_list(p, cur->false_list, &expl, &expa)) { 2598c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android avtab_destroy(&expa); 2608c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android goto oom; 2618c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 2628c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (av_cur = expl; av_cur != NULL; av_cur = av_cur->next) { 2638c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "\t"); 2648c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android render_av_rule(&av_cur->node->key, &av_cur->node->datum, 2658c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android RENDER_CONDITIONAL, p, fp); 2668c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 2678c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android cond_av_list_destroy(expl); 2688c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android avtab_destroy(&expa); 2698c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 2708c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; 2718c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 2728c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android oom: 2738c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(stderr, "out of memory\n"); 2748c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 1; 2758c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 2768c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 2778c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidint display_handle_unknown(policydb_t * p, FILE * out_fp) 2788c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 2798c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (p->handle_unknown == ALLOW_UNKNOWN) 2808c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, "Allow unknown classes and permisions\n"); 2818c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android else if (p->handle_unknown == DENY_UNKNOWN) 2828c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, "Deny unknown classes and permisions\n"); 2838c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android else if (p->handle_unknown == REJECT_UNKNOWN) 2848c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, "Reject unknown classes and permisions\n"); 2858c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; 2868c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 2878c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 2888c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidint change_bool(char *name, int state, policydb_t * p, FILE * fp) 2898c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 2908c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android cond_bool_datum_t *bool; 2918c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 2928c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android bool = hashtab_search(p->p_bools.table, name); 2938c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (bool == NULL) { 2948c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "Could not find bool %s\n", name); 2958c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return -1; 2968c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 2978c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android bool->state = state; 2988c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android evaluate_conds(p); 2998c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; 3008c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 3018c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 3028c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidstatic void display_policycaps(policydb_t * p, FILE * fp) 3038c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 3048c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android ebitmap_node_t *node; 3058c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android const char *capname; 3068c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android char buf[64]; 307cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley unsigned int i; 3088c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 3098c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "policy capabilities:\n"); 3108c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android ebitmap_for_each_bit(&p->policycaps, node, i) { 3118c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (ebitmap_node_get_bit(node, i)) { 3128c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android capname = sepol_polcap_getname(i); 3138c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (capname == NULL) { 3148c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android snprintf(buf, sizeof(buf), "unknown (%d)", i); 3158c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android capname = buf; 3168c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 3178c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "\t%s\n", capname); 3188c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 3198c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 3208c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 3218c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 3228c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidstatic void display_id(policydb_t *p, FILE *fp, uint32_t symbol_type, 3238c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android uint32_t symbol_value, char *prefix) 3248c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 3258c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android char *id = p->sym_val_to_name[symbol_type][symbol_value]; 3268c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, " %s%s", prefix, id); 3278c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 3288c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 3298c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidstatic void display_permissive(policydb_t *p, FILE *fp) 3308c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 3318c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android ebitmap_node_t *node; 332cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley unsigned int i; 3338c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 3348c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "permissive sids:\n"); 3358c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android ebitmap_for_each_bit(&p->permissive_map, node, i) { 3368c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (ebitmap_node_get_bit(node, i)) { 3378c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "\t"); 3388c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_id(p, fp, SYM_TYPES, i - 1, ""); 3398c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "\n"); 3408c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 3418c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 3428c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 3438c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 344cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalleystatic void display_role_trans(policydb_t *p, FILE *fp) 345cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley{ 346cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley role_trans_t *rt; 347cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley 348cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley fprintf(fp, "role_trans rules:\n"); 349cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley for (rt = p->role_tr; rt; rt = rt->next) { 350cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley display_id(p, fp, SYM_ROLES, rt->role - 1, ""); 351cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley display_id(p, fp, SYM_TYPES, rt->type - 1, ""); 352cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley display_id(p, fp, SYM_CLASSES, rt->tclass - 1, ":"); 353cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley display_id(p, fp, SYM_ROLES, rt->new_role - 1, ""); 354cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley fprintf(fp, "\n"); 355cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley } 356cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley} 357cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley 3588c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidstatic void display_filename_trans(policydb_t *p, FILE *fp) 3598c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 3608c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android filename_trans_t *ft; 3618c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 3628c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(fp, "filename_trans rules:\n"); 3638c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (ft = p->filename_trans; ft; ft = ft->next) { 3648c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_id(p, fp, SYM_TYPES, ft->stype - 1, ""); 3658c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_id(p, fp, SYM_TYPES, ft->ttype - 1, ""); 3668c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_id(p, fp, SYM_CLASSES, ft->tclass - 1, ":"); 3678c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_id(p, fp, SYM_TYPES, ft->otype - 1, ""); 368cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley fprintf(fp, " %s\n", ft->name); 3698c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 3708c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 3718c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 3728c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidint menu() 3738c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 3748c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("\nSelect a command:\n"); 3758c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("1) display unconditional AVTAB\n"); 3768c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("2) display conditional AVTAB (entirely)\n"); 3778c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("3) display conditional AVTAG (only ENABLED rules)\n"); 3788c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("4) display conditional AVTAB (only DISABLED rules)\n"); 3798c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("5) display conditional bools\n"); 3808c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("6) display conditional expressions\n"); 3818c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("7) change a boolean value\n"); 382cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley printf("8) display role transitions\n"); 3838c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("\n"); 3848c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("c) display policy capabilities\n"); 3858c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("p) display the list of permissive types\n"); 3868c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("u) display unknown handling setting\n"); 3878c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("F) display filename_trans rules\n"); 3888c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("\n"); 3898c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("f) set output file\n"); 3908c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("m) display menu\n"); 3918c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("q) quit\n"); 3928c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return 0; 3938c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 3948c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 3958c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidint main(int argc, char **argv) 3968c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{ 3978c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android FILE *out_fp = stdout; 3988c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android char ans[81], OutfileName[121]; 3998c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android int fd, ret; 4008c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android struct stat sb; 4018c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android void *map; 4028c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android char *name; 4038c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android int state; 4048c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android struct policy_file pf; 4058c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 4068c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (argc != 2) 4078c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android usage(argv[0]); 4088c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 4098c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fd = open(argv[1], O_RDONLY); 4108c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (fd < 0) { 4118c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(stderr, "Can't open '%s': %s\n", 4128c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android argv[1], strerror(errno)); 4138c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android exit(1); 4148c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 4158c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (fstat(fd, &sb) < 0) { 4168c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(stderr, "Can't stat '%s': %s\n", 4178c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android argv[1], strerror(errno)); 4188c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android exit(1); 4198c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 4208c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android map = 4218c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android mmap(NULL, sb.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); 4228c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (map == MAP_FAILED) { 4238c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(stderr, "Can't map '%s': %s\n", 4248c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android argv[1], strerror(errno)); 4258c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android exit(1); 4268c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 4278c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 4288c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android /* read the binary policy */ 4298c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(out_fp, "Reading policy...\n"); 4308c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android policy_file_init(&pf); 4318c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android pf.type = PF_USE_MEMORY; 4328c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android pf.data = map; 4338c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android pf.len = sb.st_size; 4348c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (policydb_init(&policydb)) { 4358c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(stderr, "%s: Out of memory!\n", argv[0]); 4368c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android exit(1); 4378c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 4388c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android ret = policydb_read(&policydb, &pf, 1); 4398c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (ret) { 4408c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(stderr, 4418c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android "%s: error(s) encountered while parsing configuration\n", 4428c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android argv[0]); 4438c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android exit(1); 4448c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 4458c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 4468c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(stdout, "binary policy file loaded\n\n"); 4478c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android close(fd); 4488c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 4498c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android menu(); 4508c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android for (;;) { 4518c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("\nCommand (\'m\' for menu): "); 4528c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fgets(ans, sizeof(ans), stdin); 4538c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android switch (ans[0]) { 4548c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 4558c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case '1': 4568c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_avtab(&policydb.te_avtab, RENDER_UNCONDITIONAL, 4578c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android &policydb, out_fp); 4588c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 4598c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case '2': 4608c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_avtab(&policydb.te_cond_avtab, 4618c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android RENDER_CONDITIONAL, &policydb, out_fp); 4628c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 4638c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case '3': 4648c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_avtab(&policydb.te_cond_avtab, RENDER_ENABLED, 4658c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android &policydb, out_fp); 4668c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 4678c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case '4': 4688c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_avtab(&policydb.te_cond_avtab, RENDER_DISABLED, 4698c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android &policydb, out_fp); 4708c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 4718c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case '5': 4728c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_bools(&policydb, out_fp); 4738c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 4748c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case '6': 4758c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_cond_expressions(&policydb, out_fp); 4768c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 4778c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case '7': 4788c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("name? "); 4798c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fgets(ans, sizeof(ans), stdin); 4808c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android ans[strlen(ans) - 1] = 0; 4818c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 4828c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android name = malloc((strlen(ans) + 1) * sizeof(char)); 4838c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (name == NULL) { 4848c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(stderr, "couldn't malloc string.\n"); 4858c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 4868c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 4878c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android strcpy(name, ans); 4888c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 4898c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("state? "); 4908c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fgets(ans, sizeof(ans), stdin); 4918c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android ans[strlen(ans) - 1] = 0; 4928c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 4938c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (atoi(ans)) 4948c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android state = 1; 4958c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android else 4968c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android state = 0; 4978c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 4988c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android change_bool(name, state, &policydb, out_fp); 4998c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android free(name); 5008c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 501cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley case '8': 502cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley display_role_trans(&policydb, out_fp); 503cd88c5c44f93ca14828bdae024fae6e0287ba71dStephen Smalley break; 5048c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case 'c': 5058c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_policycaps(&policydb, out_fp); 5068c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 5078c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case 'p': 5088c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_permissive(&policydb, out_fp); 5098c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 5108c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case 'u': 5118c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case 'U': 5128c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_handle_unknown(&policydb, out_fp); 5138c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 5148c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case 'f': 5158c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf 5168c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android ("\nFilename for output (<CR> for screen output): "); 5178c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fgets(OutfileName, sizeof(OutfileName), stdin); 5188c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android OutfileName[strlen(OutfileName) - 1] = '\0'; /* fix_string (remove LF) */ 5198c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (strlen(OutfileName) == 0) 5208c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android out_fp = stdout; 5218c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android else if ((out_fp = fopen(OutfileName, "w")) == NULL) { 5228c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android fprintf(stderr, "Cannot open output file %s\n", 5238c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android OutfileName); 5248c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android out_fp = stdout; 5258c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 5268c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android if (out_fp != stdout) 5278c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("\nOutput to file: %s\n", OutfileName); 5288c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 5298c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case 'F': 5308c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android display_filename_trans(&policydb, out_fp); 5318c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 5328c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case 'q': 5338c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android policydb_destroy(&policydb); 5348c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android exit(0); 5358c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 5368c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android case 'm': 5378c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android menu(); 5388c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 5398c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android default: 5408c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android printf("\nInvalid choice\n"); 5418c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android menu(); 5428c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android break; 5438c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 5448c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 5458c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android } 5468c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} 5478c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 5488c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android/* FLASK */ 549