113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* Authors: Karl MacMillan <kmacmillan@tresys.com> 213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * 313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * Copyright (C) 2004 Tresys Technology, LLC 413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * This program is free software; you can redistribute it and/or modify 513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * it under the terms of the GNU General Public License as published by 613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * the Free Software Foundation, version 2. 713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle */ 813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <sepol/module.h> 1013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <getopt.h> 1113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <fcntl.h> 1213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <stdio.h> 1313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <stdlib.h> 1413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <string.h> 1513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <unistd.h> 1613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <sys/types.h> 1713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <sys/stat.h> 1813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <sys/mman.h> 1913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <fcntl.h> 2013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <errno.h> 2113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 2213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlechar *progname = NULL; 2313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleextern char *optarg; 2413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 2528a6a560fa0dbc6f2f45f2cc8773f6baa0652ac7Nicolas Ioossstatic __attribute__((__noreturn__)) void usage(const char *prog) 2613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{ 2713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle printf("usage: %s -o <output file> -m <module> [-f <file contexts>]\n", 2813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle prog); 2913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle printf("Options:\n"); 3013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle printf(" -o --outfile Output file (required)\n"); 3113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle printf(" -m --module Module file (required)\n"); 3213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle printf(" -f --fc File contexts file\n"); 3313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle printf(" -s --seuser Seusers file (only valid in base)\n"); 3413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle printf 3513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle (" -u --user_extra user_extra file (only valid in base)\n"); 3613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle printf(" -n --nc Netfilter contexts file\n"); 3713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle exit(1); 3813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle} 3913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 40188a028f747579fe74b817a997ae6209f3eb742fNicolas Ioossstatic int file_to_policy_file(const char *filename, struct sepol_policy_file **pf, 41188a028f747579fe74b817a997ae6209f3eb742fNicolas Iooss const char *mode) 4213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{ 4313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle FILE *f; 4413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 4513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (sepol_policy_file_create(pf)) { 4613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle fprintf(stderr, "%s: Out of memory\n", progname); 4713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle return -1; 4813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 4913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 5013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle f = fopen(filename, mode); 5113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!f) { 5213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle fprintf(stderr, "%s: Could not open file %s: %s\n", progname, 5313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle strerror(errno), filename); 5413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle return -1; 5513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 5613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle sepol_policy_file_set_fp(*pf, f); 5713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle return 0; 5813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle} 5913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 6013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlestatic int file_to_data(const char *path, char **data, size_t * len) 6113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{ 6213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle int fd; 6313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle struct stat sb; 6413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle fd = open(path, O_RDONLY); 6513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (fd < 0) { 6613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle fprintf(stderr, "%s: Failed to open %s: %s\n", progname, path, 6713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle strerror(errno)); 6813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle return -1; 6913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 7013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (fstat(fd, &sb) < 0) { 7113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle fprintf(stderr, "%s: Failed to fstat %s: %s\n", progname, 7213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle path, strerror(errno)); 7313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle goto err; 7413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 75266c16ff535a0d7fc89add6db3c13a879be6cdd5Nicolas Iooss if (!sb.st_size) { 76266c16ff535a0d7fc89add6db3c13a879be6cdd5Nicolas Iooss *len = 0; 77266c16ff535a0d7fc89add6db3c13a879be6cdd5Nicolas Iooss return 0; 78266c16ff535a0d7fc89add6db3c13a879be6cdd5Nicolas Iooss } 7913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 8013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *data = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0); 8113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (*data == MAP_FAILED) { 8213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle fprintf(stderr, "%s: Failed to mmap %s: %s\n", progname, path, 8313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle strerror(errno)); 8413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle goto err; 8513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 8613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle *len = sb.st_size; 8713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle close(fd); 8813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle return 0; 8913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle err: 9013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle close(fd); 9113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle return -1; 9213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle} 9313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 9413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleint main(int argc, char **argv) 9513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{ 9613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle struct sepol_module_package *pkg; 9713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle struct sepol_policy_file *mod, *out; 9813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle char *module = NULL, *file_contexts = NULL, *seusers = 9913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle NULL, *user_extra = NULL; 10013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle char *fcdata = NULL, *outfile = NULL, *seusersdata = 10113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle NULL, *user_extradata = NULL; 10213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle char *netfilter_contexts = NULL, *ncdata = NULL; 10313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle size_t fclen = 0, seuserslen = 0, user_extralen = 0, nclen = 0; 10413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle int i; 10513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 10613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle static struct option opts[] = { 10713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle {"module", required_argument, NULL, 'm'}, 10813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle {"fc", required_argument, NULL, 'f'}, 10913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle {"seuser", required_argument, NULL, 's'}, 11013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle {"user_extra", required_argument, NULL, 'u'}, 11113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle {"nc", required_argument, NULL, 'n'}, 11213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle {"outfile", required_argument, NULL, 'o'}, 11313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle {"help", 0, NULL, 'h'}, 11413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle {NULL, 0, NULL, 0} 11513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle }; 11613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 11713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle while ((i = getopt_long(argc, argv, "m:f:s:u:o:n:h", opts, NULL)) != -1) { 11813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle switch (i) { 11913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle case 'h': 12013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle usage(argv[0]); 12113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle exit(0); 12213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle case 'm': 12313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (module) { 12413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle fprintf(stderr, 12513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle "May not specify more than one module\n"); 12613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle exit(1); 12713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 12813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle module = strdup(optarg); 12913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!module) 13013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle exit(1); 13113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle break; 13213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle case 'f': 13313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (file_contexts) { 13413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle fprintf(stderr, 13513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle "May not specify more than one file context file\n"); 13613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle exit(1); 13713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 13813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle file_contexts = strdup(optarg); 13913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!file_contexts) 14013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle exit(1); 14113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle break; 14213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle case 'o': 14313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (outfile) { 14413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle fprintf(stderr, 14513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle "May not specify more than one output file\n"); 14613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle exit(1); 14713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 14813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle outfile = strdup(optarg); 14913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!outfile) 15013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle exit(1); 15113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle break; 15213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle case 's': 15313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (seusers) { 15413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle fprintf(stderr, 15513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle "May not specify more than one seuser file\n"); 15613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle exit(1); 15713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 15813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle seusers = strdup(optarg); 15913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!seusers) 16013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle exit(1); 16113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle break; 16213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle case 'u': 16313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (user_extra) { 16413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle fprintf(stderr, 16513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle "May not specify more than one user_extra file\n"); 16613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle exit(1); 16713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 16813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle user_extra = strdup(optarg); 16913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!user_extra) 17013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle exit(1); 17113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle break; 17213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle case 'n': 17313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (netfilter_contexts) { 17413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle fprintf(stderr, 17513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle "May not specify more than one netfilter contexts file\n"); 17613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle exit(1); 17713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 17813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle netfilter_contexts = strdup(optarg); 17913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!netfilter_contexts) 18013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle exit(1); 18113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle break; 18213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 18313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 18413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 18513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle progname = argv[0]; 18613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 18713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (!module || !outfile) { 18813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle usage(argv[0]); 18913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle exit(0); 19013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 19113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 19213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (file_contexts) { 19313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (file_to_data(file_contexts, &fcdata, &fclen)) 19413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle exit(1); 19513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 19613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 19713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (seusers) { 19813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (file_to_data(seusers, &seusersdata, &seuserslen)) 19913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle exit(1); 20013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 20113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 20213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (user_extra) { 20313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (file_to_data(user_extra, &user_extradata, &user_extralen)) 20413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle exit(1); 20513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 20613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 20713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (netfilter_contexts) { 20813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (file_to_data(netfilter_contexts, &ncdata, &nclen)) 20913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle exit(1); 21013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 21113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 21213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (file_to_policy_file(module, &mod, "r")) 21313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle exit(1); 21413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 21513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (sepol_module_package_create(&pkg)) { 21613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle fprintf(stderr, "%s: Out of memory\n", argv[0]); 21713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle exit(1); 21813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 21913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 22013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (sepol_policydb_read(sepol_module_package_get_policy(pkg), mod)) { 22113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle fprintf(stderr, 22213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle "%s: Error while reading policy module from %s\n", 22313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle argv[0], module); 22413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle exit(1); 22513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 22613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 22713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (fclen) 22813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle sepol_module_package_set_file_contexts(pkg, fcdata, fclen); 22913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 23013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (seuserslen) 23113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle sepol_module_package_set_seusers(pkg, seusersdata, seuserslen); 23213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 23313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (user_extra) 23413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle sepol_module_package_set_user_extra(pkg, user_extradata, 23513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle user_extralen); 23613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 23713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (nclen) 23813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle sepol_module_package_set_netfilter_contexts(pkg, ncdata, nclen); 23913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 24013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (file_to_policy_file(outfile, &out, "w")) 24113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle exit(1); 24213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 24313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (sepol_module_package_write(pkg, out)) { 24413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle fprintf(stderr, 24513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle "%s: Error while writing module package to %s\n", 24613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle argv[0], argv[1]); 24713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle exit(1); 24813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle } 24913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 25013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (fclen) 25113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle munmap(fcdata, fclen); 25213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle if (nclen) 25313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle munmap(ncdata, nclen); 25413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle sepol_policy_file_free(mod); 25513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle sepol_policy_file_free(out); 25613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle sepol_module_package_free(pkg); 25713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle free(file_contexts); 25813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle free(outfile); 25913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle free(module); 260322888962031c787327bad9dfd925d8123223476Nicolas Iooss free(seusers); 261322888962031c787327bad9dfd925d8123223476Nicolas Iooss free(user_extra); 26213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle exit(0); 26313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle} 264