Blame semodule-utils/semodule_package/semodule_unpackage.c

Packit Service 9fb14c
#include <sepol/module.h>
Packit Service 9fb14c
#include <getopt.h>
Packit Service 9fb14c
#include <fcntl.h>
Packit Service 9fb14c
#include <stdio.h>
Packit Service 9fb14c
#include <stdlib.h>
Packit Service 9fb14c
#include <string.h>
Packit Service 9fb14c
#include <unistd.h>
Packit Service 9fb14c
#include <sys/types.h>
Packit Service 9fb14c
#include <sys/stat.h>
Packit Service 9fb14c
#include <sys/mman.h>
Packit Service 9fb14c
#include <fcntl.h>
Packit Service 9fb14c
#include <errno.h>
Packit Service 9fb14c
Packit Service 9fb14c
char *progname = NULL;
Packit Service 9fb14c
extern char *optarg;
Packit Service 9fb14c
Packit Service 9fb14c
static __attribute__((__noreturn__)) void usage(void)
Packit Service 9fb14c
{
Packit Service 9fb14c
	printf("usage: %s ppfile modfile [fcfile]\n", progname);
Packit Service 9fb14c
	exit(1);
Packit Service 9fb14c
}
Packit Service 9fb14c
Packit Service 9fb14c
static int file_to_policy_file(const char *filename, struct sepol_policy_file **pf, const char *mode)
Packit Service 9fb14c
{
Packit Service 9fb14c
	FILE *f;
Packit Service 9fb14c
Packit Service 9fb14c
	if (sepol_policy_file_create(pf)) {
Packit Service 9fb14c
		fprintf(stderr, "%s:  Out of memory\n", progname);
Packit Service 9fb14c
		return -1;
Packit Service 9fb14c
	}
Packit Service 9fb14c
Packit Service 9fb14c
	f = fopen(filename, mode);
Packit Service 9fb14c
	if (!f) {
Packit Service 9fb14c
		fprintf(stderr, "%s:  Could not open file %s:  %s\n", progname, strerror(errno), filename);
Packit Service 9fb14c
		return -1;
Packit Service 9fb14c
	}
Packit Service 9fb14c
	sepol_policy_file_set_fp(*pf, f);
Packit Service 9fb14c
	return 0;
Packit Service 9fb14c
}
Packit Service 9fb14c
Packit Service 9fb14c
int main(int argc, char **argv)
Packit Service 9fb14c
{
Packit Service 9fb14c
	struct sepol_module_package *pkg;
Packit Service 9fb14c
	struct sepol_policy_file *in, *out;
Packit Service 9fb14c
	FILE *fp;
Packit Service 9fb14c
	size_t len;
Packit Service 9fb14c
	char *ppfile, *modfile, *fcfile = NULL, *fcdata;
Packit Service 9fb14c
Packit Service 9fb14c
	progname = argv[0];
Packit Service 9fb14c
Packit Service 9fb14c
	if (argc < 3) {
Packit Service 9fb14c
		usage();
Packit Service 9fb14c
		exit(1);
Packit Service 9fb14c
	}
Packit Service 9fb14c
Packit Service 9fb14c
	ppfile = argv[1];
Packit Service 9fb14c
	modfile = argv[2];
Packit Service 9fb14c
	if (argc >= 3)
Packit Service 9fb14c
		fcfile = argv[3];
Packit Service 9fb14c
Packit Service 9fb14c
	if (file_to_policy_file(ppfile, &in, "r"))
Packit Service 9fb14c
		exit(1);
Packit Service 9fb14c
Packit Service 9fb14c
	if (sepol_module_package_create(&pkg)) {
Packit Service 9fb14c
                fprintf(stderr, "%s:  Out of memory\n", progname);
Packit Service 9fb14c
                exit(1);
Packit Service 9fb14c
	}
Packit Service 9fb14c
Packit Service 9fb14c
	if (sepol_module_package_read(pkg, in, 0) == -1) {
Packit Service 9fb14c
                fprintf(stderr, "%s:  Error while reading policy module from %s\n",
Packit Service 9fb14c
			progname, ppfile);
Packit Service 9fb14c
                exit(1);
Packit Service 9fb14c
	}
Packit Service 9fb14c
Packit Service 9fb14c
	if (file_to_policy_file(modfile, &out, "w"))
Packit Service 9fb14c
		exit(1);
Packit Service 9fb14c
Packit Service 9fb14c
        if (sepol_policydb_write(sepol_module_package_get_policy(pkg), out)) {
Packit Service 9fb14c
                fprintf(stderr, "%s:  Error while writing module to %s\n", progname, modfile);
Packit Service 9fb14c
                exit(1);
Packit Service 9fb14c
        }
Packit Service 9fb14c
Packit Service 9fb14c
	sepol_policy_file_free(in);
Packit Service 9fb14c
	sepol_policy_file_free(out);
Packit Service 9fb14c
Packit Service 9fb14c
	len = sepol_module_package_get_file_contexts_len(pkg);
Packit Service 9fb14c
	if (fcfile && len) {
Packit Service 9fb14c
		fp = fopen(fcfile, "w");
Packit Service 9fb14c
		if (!fp) {
Packit Service 9fb14c
			fprintf(stderr, "%s:  Could not open file %s:  %s\n", progname, strerror(errno), fcfile);
Packit Service 9fb14c
			exit(1);
Packit Service 9fb14c
		}
Packit Service 9fb14c
		fcdata = sepol_module_package_get_file_contexts(pkg);
Packit Service 9fb14c
		if (fwrite(fcdata, 1, len, fp) != len) {
Packit Service 9fb14c
			fprintf(stderr, "%s:  Could not write file %s:  %s\n", progname, strerror(errno), fcfile);
Packit Service 9fb14c
			exit(1);
Packit Service 9fb14c
		}
Packit Service 9fb14c
		fclose(fp);
Packit Service 9fb14c
	}
Packit Service 9fb14c
Packit Service 9fb14c
	sepol_module_package_free(pkg);
Packit Service 9fb14c
	exit(0);
Packit Service 9fb14c
}