18c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android/*
28c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android * Author: Karl MacMillan <kmacmillan@tresys.com>
38c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android *
48c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android * Copyright (C) 2006 Tresys Technology, LLC
58c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android *
68c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android *  This library is free software; you can redistribute it and/or
78c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android *  modify it under the terms of the GNU Lesser General Public
88c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android *  License as published by the Free Software Foundation; either
98c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android *  version 2.1 of the License, or (at your option) any later version.
108c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android *
118c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android *  This library is distributed in the hope that it will be useful,
128c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android *  but WITHOUT ANY WARRANTY; without even the implied warranty of
138c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
148c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android *  Lesser General Public License for more details.
158c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android *
168c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android *  You should have received a copy of the GNU Lesser General Public
178c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android *  License along with this library; if not, write to the Free Software
188c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
198c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android */
208c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android
218c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include "parse_util.h"
228c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#include "queue.h"
238c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android
248c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android/* these are defined in policy_parse.y and are needed for read_source_policy */
258c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidextern FILE *yyin;
268c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidextern void init_parser(int);
278c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidextern int yyparse(void);
288c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidextern void yyrestart(FILE *);
298c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidextern queue_t id_queue;
308c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidextern unsigned int policydb_errors;
318c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidextern unsigned long policydb_lineno;
328c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidextern policydb_t *policydbp;
338c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidextern int mlspol;
348c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidextern void set_source_file(const char *name);
358c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android
368c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidint read_source_policy(policydb_t * p, const char *file, const char *progname)
378c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android{
388c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android	yyin = fopen(file, "r");
398c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android	if (!yyin) {
408c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android		fprintf(stderr, "%s:  unable to open %s\n", progname, file);
418c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android		return -1;
428c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android	}
438c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android	set_source_file(file);
448c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android
458c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android	if ((id_queue = queue_create()) == NULL) {
468c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android		fprintf(stderr, "%s: out of memory!\n", progname);
478c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android		return -1;
488c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android	}
498c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android
508c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android	policydbp = p;
518c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android	mlspol = p->mls;
528c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android
538c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android	init_parser(1);
548c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android	if (yyparse() || policydb_errors) {
558c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android		fprintf(stderr,
568c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android			"%s:  error(s) encountered while parsing configuration\n",
578c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android			progname);
588c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android		return -1;
598c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android	}
608c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android	rewind(yyin);
618c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android	init_parser(2);
628c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android	set_source_file(file);
638c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android	yyrestart(yyin);
648c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android	if (yyparse() || policydb_errors) {
658c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android		fprintf(stderr,
668c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android			"%s:  error(s) encountered while parsing configuration\n",
678c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android			progname);
688c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android		return -1;
698c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android	}
708c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android	queue_destroy(id_queue);
718c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android
728c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android	if (policydb_errors)
738c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android		return -1;
748c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android
758c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android	fclose(yyin);
768c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android
778c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android	return 0;
788c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android}
79