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