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