1 #include <sepol/module.h>
2 #include <getopt.h>
3 #include <fcntl.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <string.h>
7 #include <unistd.h>
8 #include <sys/types.h>
9 #include <sys/stat.h>
10 #include <sys/mman.h>
11 #include <fcntl.h>
12 #include <errno.h>
13 
14 char *progname = NULL;
15 extern char *optarg;
16 
usage(void)17 static __attribute__((__noreturn__)) void usage(void)
18 {
19 	printf("usage: %s ppfile modfile [fcfile]\n", progname);
20 	exit(1);
21 }
22 
file_to_policy_file(const char * filename,struct sepol_policy_file ** pf,const char * mode)23 static int file_to_policy_file(const char *filename, struct sepol_policy_file **pf, const char *mode)
24 {
25 	FILE *f;
26 
27 	if (sepol_policy_file_create(pf)) {
28 		fprintf(stderr, "%s:  Out of memory\n", progname);
29 		return -1;
30 	}
31 
32 	f = fopen(filename, mode);
33 	if (!f) {
34 		fprintf(stderr, "%s:  Could not open file %s:  %s\n", progname, strerror(errno), filename);
35 		return -1;
36 	}
37 	sepol_policy_file_set_fp(*pf, f);
38 	return 0;
39 }
40 
main(int argc,char ** argv)41 int main(int argc, char **argv)
42 {
43 	struct sepol_module_package *pkg;
44 	struct sepol_policy_file *in, *out;
45 	FILE *fp;
46 	size_t len;
47 	char *ppfile, *modfile, *fcfile = NULL, *fcdata;
48 
49 	progname = argv[0];
50 
51 	if (argc < 3) {
52 		usage();
53 		exit(1);
54 	}
55 
56 	ppfile = argv[1];
57 	modfile = argv[2];
58 	if (argc >= 4)
59 		fcfile = argv[3];
60 
61 	if (file_to_policy_file(ppfile, &in, "r"))
62 		exit(1);
63 
64 	if (sepol_module_package_create(&pkg)) {
65                 fprintf(stderr, "%s:  Out of memory\n", progname);
66                 exit(1);
67 	}
68 
69 	if (sepol_module_package_read(pkg, in, 0) == -1) {
70                 fprintf(stderr, "%s:  Error while reading policy module from %s\n",
71 			progname, ppfile);
72                 exit(1);
73 	}
74 
75 	if (file_to_policy_file(modfile, &out, "w"))
76 		exit(1);
77 
78         if (sepol_policydb_write(sepol_module_package_get_policy(pkg), out)) {
79                 fprintf(stderr, "%s:  Error while writing module to %s\n", progname, modfile);
80                 exit(1);
81         }
82 
83 	sepol_policy_file_free(in);
84 	sepol_policy_file_free(out);
85 
86 	len = sepol_module_package_get_file_contexts_len(pkg);
87 	if (fcfile && len) {
88 		fp = fopen(fcfile, "w");
89 		if (!fp) {
90 			fprintf(stderr, "%s:  Could not open file %s:  %s\n", progname, strerror(errno), fcfile);
91 			exit(1);
92 		}
93 		fcdata = sepol_module_package_get_file_contexts(pkg);
94 		if (fwrite(fcdata, 1, len, fp) != len) {
95 			fprintf(stderr, "%s:  Could not write file %s:  %s\n", progname, strerror(errno), fcfile);
96 			exit(1);
97 		}
98 		fclose(fp);
99 	}
100 
101 	sepol_module_package_free(pkg);
102 	exit(0);
103 }
104