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